Install only compatible plugins

Summary: Currently, when user installs a new plugin which was not installed before that, Flipper always takes the latest available version of it. This is not correct, because the latest version might be incompatible with the currently running version of Flipper. To avoid that, instead of always using just the latest version we will be using the most recent version which is compatible with the current Flipper version.

Reviewed By: passy

Differential Revision: D28306505

fbshipit-source-id: 4258a456d6a5d92cbf48af55c0efb17ecf560b57
This commit is contained in:
Anton Nikolaev
2021-05-11 17:02:24 -07:00
committed by Facebook GitHub Bot
parent 2b41fba704
commit 28fd8da615
4 changed files with 67 additions and 0 deletions

View File

@@ -20,6 +20,8 @@ import {
addFailedPlugins,
registerLoadedPlugins,
registerBundledPlugins,
registerMarketplacePlugins,
MarketplacePluginDetails,
} from '../reducers/plugins';
import GK from '../fb-stubs/GK';
import {FlipperBasePlugin} from '../plugin';
@@ -49,6 +51,7 @@ import * as crc32 from 'crc32';
// eslint-disable-next-line import/no-unresolved
import getDefaultPluginsIndex from '../utils/getDefaultPluginsIndex';
import {isDevicePluginDefinition} from '../utils/pluginUtils';
import {isPluginCompatible} from '../utils/isPluginCompatible';
let defaultPluginsIndex: any = null;
@@ -74,6 +77,13 @@ export default async (store: Store, logger: Logger) => {
defaultPluginsIndex = getDefaultPluginsIndex();
const marketplacePlugins = store.getState().plugins.marketplacePlugins;
store.dispatch(
registerMarketplacePlugins(
selectCompatibleMarketplaceVersions(marketplacePlugins),
),
);
const uninstalledPlugins = store.getState().plugins.uninstalledPlugins;
const bundledPlugins = getBundledPlugins();
@@ -320,3 +330,27 @@ const requirePluginInternal = (
}
return plugin;
};
export function selectCompatibleMarketplaceVersions(
availablePlugins: MarketplacePluginDetails[],
): MarketplacePluginDetails[] {
const plugins: MarketplacePluginDetails[] = [];
for (const plugin of availablePlugins) {
if (!isPluginCompatible(plugin)) {
const compatibleVersion =
plugin.availableVersions?.find(isPluginCompatible) ??
plugin.availableVersions?.slice(-1).pop();
if (compatibleVersion) {
plugins.push({
...compatibleVersion,
availableVersions: plugin?.availableVersions,
});
} else {
plugins.push(plugin);
}
} else {
plugins.push(plugin);
}
}
return plugins;
}