Hide PWA app from Spotlight

Reviewed By: LukeDefeo

Differential Revision: D50411182

fbshipit-source-id: 46c089c69aefb58f85a861c7898ee355f094e03c
This commit is contained in:
Andrey Goncharov
2023-10-20 05:13:20 -07:00
committed by Facebook GitHub Bot
parent a8be443670
commit aea77cc4da
7 changed files with 85 additions and 31 deletions

View File

@@ -380,6 +380,7 @@ export type FlipperServerCommands = {
shutdown: () => Promise<void>; shutdown: () => Promise<void>;
'is-logged-in': () => Promise<boolean>; 'is-logged-in': () => Promise<boolean>;
'environment-info': () => Promise<EnvironmentInfo>; 'environment-info': () => Promise<EnvironmentInfo>;
'move-pwa': () => Promise<void>;
}; };
export type GraphResponse = { export type GraphResponse = {

View File

@@ -58,6 +58,7 @@ import {flipperDataFolder, flipperSettingsFolder} from './utils/paths';
import {DebuggableDevice} from './devices/DebuggableDevice'; import {DebuggableDevice} from './devices/DebuggableDevice';
import {jfUpload} from './fb-stubs/jf'; import {jfUpload} from './fb-stubs/jf';
import path from 'path'; import path from 'path';
import {movePWA} from './utils/findInstallation';
const {access, copyFile, mkdir, unlink, stat, readlink, readFile, writeFile} = const {access, copyFile, mkdir, unlink, stat, readlink, readFile, writeFile} =
promises; promises;
@@ -597,6 +598,9 @@ export class FlipperServerImpl implements FlipperServer {
'environment-info': async () => { 'environment-info': async () => {
return this.config.environmentInfo; return this.config.environmentInfo;
}, },
'move-pwa': async () => {
await movePWA();
},
}; };
registerDevice(device: ServerDevice) { registerDevice(device: ServerDevice) {

View File

@@ -13,6 +13,7 @@ export * from './tracker';
export {loadLauncherSettings} from './utils/launcherSettings'; export {loadLauncherSettings} from './utils/launcherSettings';
export {loadProcessConfig} from './utils/processConfig'; export {loadProcessConfig} from './utils/processConfig';
export {getEnvironmentInfo} from './utils/environmentInfo'; export {getEnvironmentInfo} from './utils/environmentInfo';
export {findInstallation} from './utils/findInstallation';
export {getGatekeepers} from './gk'; export {getGatekeepers} from './gk';
export {setupPrefetcher} from './fb-stubs/Prefetcher'; export {setupPrefetcher} from './fb-stubs/Prefetcher';
export * from './server/attachSocketServer'; export * from './server/attachSocketServer';

View File

@@ -0,0 +1,77 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import path from 'path';
import fs from 'fs-extra';
import os from 'os';
import GK from '../fb-stubs/GK';
const pwaRoot = path.join(
os.homedir(),
'Applications',
'Chrome Apps.localized',
);
const appFolder = path.resolve(pwaRoot, '.flipper');
const defaultAppPath = path.join(pwaRoot, 'Flipper.app');
const movedAppPath = path.join(appFolder, 'Flipper.app');
export async function movePWA(): Promise<void> {
if (os.platform() !== 'darwin') {
return;
}
if (!GK.get('flipper_move_pwa')) {
return;
}
// Move PWA into its own folder
// Later we will make the folder hidden so Spotlight stops indexing it
// Sadly, Spotlight can stop indexing only hidden folder, not hidden files
// Therefore, we have to create this parent folder in the first place.
if (!(await fs.pathExists(appFolder))) {
await fs.mkdir(appFolder);
}
await fs.move(defaultAppPath, movedAppPath);
}
export async function findInstallation(): Promise<string | undefined> {
if (os.platform() !== 'darwin') {
return;
}
try {
if (GK.get('flipper_move_pwa')) {
if (await fs.pathExists(defaultAppPath)) {
await movePWA();
}
}
} catch (e) {
console.error('Failed to move PWA', e);
} finally {
if (GK.get('flipper_move_pwa')) {
const movedAppPlistPath = path.join(
movedAppPath,
'Contents',
'Info.plist',
);
if (await fs.pathExists(movedAppPlistPath)) {
return movedAppPath;
}
// We should get here only if moving PWA failed
}
const dafaultAppPlistPath = path.join(
defaultAppPath,
'Contents',
'Info.plist',
);
if (await fs.pathExists(dafaultAppPlistPath)) {
return defaultAppPath;
}
}
}

View File

@@ -1,29 +0,0 @@
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import path from 'path';
import fs from 'fs-extra';
import os from 'os';
export async function findInstallation(): Promise<string | undefined> {
if (os.platform() !== 'darwin') {
return;
}
const appPath = path.join(
os.homedir(),
'Applications',
'Chrome Apps.localized',
'Flipper.app',
);
const appPlistPath = path.join(appPath, 'Contents', 'Info.plist');
if (await fs.pathExists(appPlistPath)) {
return appPath;
}
}

View File

@@ -31,8 +31,7 @@ import {
} from 'flipper-server-core'; } from 'flipper-server-core';
import {addLogTailer, isTest, LoggerFormat} from 'flipper-common'; import {addLogTailer, isTest, LoggerFormat} from 'flipper-common';
import exitHook from 'exit-hook'; import exitHook from 'exit-hook';
import {getAuthToken} from 'flipper-server-core'; import {getAuthToken, findInstallation} from 'flipper-server-core';
import {findInstallation} from './findInstallation';
const argv = yargs const argv = yargs
.usage('yarn flipper-server [args]') .usage('yarn flipper-server [args]')

View File

@@ -132,6 +132,7 @@ async function install(event: any) {
if (choiceResult.outcome === 'accepted') { if (choiceResult.outcome === 'accepted') {
tracker.track('pwa-install-outcome', {installed: true}); tracker.track('pwa-install-outcome', {installed: true});
console.log('PWA installation, user accepted the prompt.'); console.log('PWA installation, user accepted the prompt.');
return getRenderHostInstance().flipperServer.exec('move-pwa');
} else { } else {
tracker.track('pwa-install-outcome', {installed: false}); tracker.track('pwa-install-outcome', {installed: false});
console.log('PWA installation, user dismissed the prompt.'); console.log('PWA installation, user dismissed the prompt.');