Load only compatible plugins on startup

Summary: We currently filtering out incompatible versions from marketplace. This diff also add filtering for incompatible installed plugins on Flipper startup to ensure we always load the latest compatible version.

Reviewed By: passy

Differential Revision: D28341891

fbshipit-source-id: 83afc14a3c07e1763e1bd146251e6d3b71a66248
This commit is contained in:
Anton Nikolaev
2021-05-11 17:02:24 -07:00
committed by Facebook GitHub Bot
parent 252322f525
commit a8ca142c9a
4 changed files with 36 additions and 8 deletions

View File

@@ -52,7 +52,7 @@ import * as crc32 from 'crc32';
// eslint-disable-next-line import/no-unresolved // eslint-disable-next-line import/no-unresolved
import getDefaultPluginsIndex from '../utils/getDefaultPluginsIndex'; import getDefaultPluginsIndex from '../utils/getDefaultPluginsIndex';
import {isDevicePluginDefinition} from '../utils/pluginUtils'; import {isDevicePluginDefinition} from '../utils/pluginUtils';
import {isPluginCompatible} from '../utils/isPluginCompatible'; import isPluginCompatible from '../utils/isPluginCompatible';
let defaultPluginsIndex: any = null; let defaultPluginsIndex: any = null;
@@ -90,10 +90,25 @@ export default async (store: Store, logger: Logger) => {
const bundledPlugins = getBundledPlugins(); const bundledPlugins = getBundledPlugins();
const loadedPlugins = filterNewestVersionOfEachPlugin( const allLocalVersions = [
bundledPlugins, ...getBundledPlugins(),
await getDynamicPlugins(), ...(await getDynamicPlugins()),
).filter((p) => !uninstalledPluginNames.has(p.name)); ].filter((p) => !uninstalledPluginNames.has(p.name));
const loadedVersionsMap: Map<string, ActivatablePluginDetails> = new Map();
for (const localVersion of allLocalVersions) {
if (isPluginCompatible(localVersion)) {
const loadedVersion = loadedVersionsMap.get(localVersion.id);
if (
!loadedVersion ||
semver.gt(localVersion.version, loadedVersion.version)
) {
loadedVersionsMap.set(localVersion.id, localVersion);
}
}
}
const loadedPlugins = Array.from(loadedVersionsMap.values());
const initialPlugins: PluginDefinition[] = loadedPlugins const initialPlugins: PluginDefinition[] = loadedPlugins
.map(reportVersion) .map(reportVersion)

View File

@@ -7,7 +7,7 @@
* @format * @format
*/ */
import {PluginDetails} from 'plugin-lib'; import {PluginDetails} from 'flipper-plugin-lib';
import semver from 'semver'; import semver from 'semver';
import GK from '../fb-stubs/GK'; import GK from '../fb-stubs/GK';
import {getAppVersion} from './info'; import {getAppVersion} from './info';

View File

@@ -11,9 +11,9 @@ import path from 'path';
import fs from 'fs-extra'; import fs from 'fs-extra';
import { import {
getSourcePlugins, getSourcePlugins,
getInstalledPlugins,
moveInstalledPluginsFromLegacyDir, moveInstalledPluginsFromLegacyDir,
InstalledPluginDetails, InstalledPluginDetails,
getAllInstalledPluginVersions,
} from 'flipper-plugin-lib'; } from 'flipper-plugin-lib';
import {getStaticPath} from '../utils/pathUtils'; import {getStaticPath} from '../utils/pathUtils';
@@ -43,7 +43,7 @@ export default async function loadDynamicPlugins(): Promise<
const [installedPlugins, unfilteredSourcePlugins] = await Promise.all([ const [installedPlugins, unfilteredSourcePlugins] = await Promise.all([
process.env.FLIPPER_DISABLE_PLUGIN_AUTO_UPDATE process.env.FLIPPER_DISABLE_PLUGIN_AUTO_UPDATE
? Promise.resolve([]) ? Promise.resolve([])
: getInstalledPlugins(), : getAllInstalledPluginVersions(),
getSourcePlugins(), getSourcePlugins(),
]); ]);
const sourcePlugins = unfilteredSourcePlugins.filter( const sourcePlugins = unfilteredSourcePlugins.filter(

View File

@@ -140,6 +140,19 @@ export async function removePlugins(
await pmap(names, (name) => removePlugin(name)); await pmap(names, (name) => removePlugin(name));
} }
export async function getAllInstalledPluginVersions(): Promise<
InstalledPluginDetails[]
> {
const pluginDirs = await getInstalledPluginVersionDirs();
const versionDirs = pluginDirs.map(([_, versionDirs]) => versionDirs).flat();
return await pmap(versionDirs, (versionDir) =>
getInstalledPluginDetails(versionDir).catch((err) => {
console.error(`Failed to load plugin details from ${versionDir}`, err);
return null;
}),
).then((versionDetails) => versionDetails.filter(notNull));
}
export async function getInstalledPlugins(): Promise<InstalledPluginDetails[]> { export async function getInstalledPlugins(): Promise<InstalledPluginDetails[]> {
const versionDirs = await getInstalledPluginVersionDirs(); const versionDirs = await getInstalledPluginVersionDirs();
return pmap( return pmap(