Use the single type representing plugins

Summary: Use interface PluginDetails everywhere where plugins are handled and removed PluginDefinition type which was effectively a subset of PluginDetails

Reviewed By: mweststrate

Differential Revision: D21927456

fbshipit-source-id: 434ebeef955b922cc11757e78fbba8dec05f1060
This commit is contained in:
Anton Nikolaev
2020-06-08 08:47:29 -07:00
committed by Facebook GitHub Bot
parent 907cb9e3cc
commit db3f04a2d7
21 changed files with 264 additions and 167 deletions

View File

@@ -30,19 +30,11 @@ import isProduction from '../utils/isProduction';
import {notNull} from '../utils/typeUtils';
import {sideEffect} from '../utils/sideEffect';
import semver from 'semver';
import {PluginDetails} from 'flipper-plugin-lib';
// eslint-disable-next-line import/no-unresolved
import getPluginIndex from '../utils/getDefaultPluginsIndex';
export type PluginDefinition = {
id?: string;
name: string;
out?: string;
gatekeeper?: string;
entry?: string;
version: string;
};
export default (store: Store, logger: Logger) => {
// expose Flipper and exact globally for dynamically loaded plugins
const globalObject: any = typeof window === 'undefined' ? global : window;
@@ -51,9 +43,9 @@ export default (store: Store, logger: Logger) => {
globalObject.Flipper = Flipper;
globalObject.adbkit = adbkit;
const gatekeepedPlugins: Array<PluginDefinition> = [];
const disabledPlugins: Array<PluginDefinition> = [];
const failedPlugins: Array<[PluginDefinition, string]> = [];
const gatekeepedPlugins: Array<PluginDetails> = [];
const disabledPlugins: Array<PluginDetails> = [];
const failedPlugins: Array<[PluginDetails, string]> = [];
const defaultPluginsIndex = getPluginIndex();
@@ -88,9 +80,9 @@ export default (store: Store, logger: Logger) => {
};
export function filterNewestVersionOfEachPlugin(
plugins: PluginDefinition[],
): PluginDefinition[] {
const pluginByName: {[key: string]: PluginDefinition} = {};
plugins: PluginDetails[],
): PluginDetails[] {
const pluginByName: {[key: string]: PluginDetails} = {};
for (const plugin of plugins) {
if (
!pluginByName[plugin.name] ||
@@ -102,7 +94,7 @@ export function filterNewestVersionOfEachPlugin(
return Object.values(pluginByName);
}
function getBundledPlugins(): Array<PluginDefinition> {
function getBundledPlugins(): Array<PluginDetails> {
// DefaultPlugins that are included in the bundle.
// List of defaultPlugins is written at build time
const pluginPath =
@@ -111,27 +103,18 @@ function getBundledPlugins(): Array<PluginDefinition> {
? path.join(__dirname, 'defaultPlugins')
: './defaultPlugins/index.json');
let bundledPlugins: Array<PluginDefinition> = [];
let bundledPlugins: Array<PluginDetails> = [];
try {
bundledPlugins = global.electronRequire(pluginPath);
} catch (e) {
console.error(e);
}
return bundledPlugins
.filter((plugin) => notNull(plugin.entry))
.map(
(plugin) =>
({
...plugin,
entry: path.resolve(pluginPath, plugin.entry!),
} as PluginDefinition),
)
.concat(bundledPlugins.filter((plugin) => !plugin.entry));
return bundledPlugins;
}
export function getDynamicPlugins() {
let dynamicPlugins: Array<PluginDefinition> = [];
let dynamicPlugins: Array<PluginDetails> = [];
try {
dynamicPlugins = ipcRenderer.sendSync('get-dynamic-plugins');
} catch (e) {
@@ -140,8 +123,8 @@ export function getDynamicPlugins() {
return dynamicPlugins;
}
export const checkGK = (gatekeepedPlugins: Array<PluginDefinition>) => (
plugin: PluginDefinition,
export const checkGK = (gatekeepedPlugins: Array<PluginDetails>) => (
plugin: PluginDetails,
): boolean => {
if (!plugin.gatekeeper) {
return true;
@@ -153,8 +136,8 @@ export const checkGK = (gatekeepedPlugins: Array<PluginDefinition>) => (
return result;
};
export const checkDisabled = (disabledPlugins: Array<PluginDefinition>) => (
plugin: PluginDefinition,
export const checkDisabled = (disabledPlugins: Array<PluginDetails>) => (
plugin: PluginDetails,
): boolean => {
let disabledList: Set<string> = new Set();
try {
@@ -171,17 +154,17 @@ export const checkDisabled = (disabledPlugins: Array<PluginDefinition>) => (
};
export const requirePlugin = (
failedPlugins: Array<[PluginDefinition, string]>,
failedPlugins: Array<[PluginDetails, string]>,
defaultPluginsIndex: any,
reqFn: Function = global.electronRequire,
) => {
return (
pluginDefinition: PluginDefinition,
pluginDetails: PluginDetails,
): typeof FlipperPlugin | typeof FlipperDevicePlugin | null => {
try {
let plugin = pluginDefinition.entry
? reqFn(pluginDefinition.entry)
: defaultPluginsIndex[pluginDefinition.name];
let plugin = pluginDetails.isDefault
? defaultPluginsIndex[pluginDetails.name]
: reqFn(pluginDetails.entry);
if (plugin.default) {
plugin = plugin.default;
}
@@ -189,21 +172,21 @@ export const requirePlugin = (
throw new Error(`Plugin ${plugin.name} is not a FlipperBasePlugin`);
}
plugin.id = plugin.id || pluginDefinition.id;
plugin.packageName = pluginDefinition.name;
plugin.id = plugin.id || pluginDetails.id;
plugin.packageName = pluginDetails.name;
// set values from package.json as static variables on class
Object.keys(pluginDefinition).forEach((key) => {
Object.keys(pluginDetails).forEach((key) => {
if (key !== 'name' && key !== 'id') {
plugin[key] =
plugin[key] || pluginDefinition[key as keyof PluginDefinition];
plugin[key] || pluginDetails[key as keyof PluginDetails];
}
});
return plugin;
} catch (e) {
failedPlugins.push([pluginDefinition, e.message]);
console.error(pluginDefinition, e);
failedPlugins.push([pluginDetails, e.message]);
console.error(pluginDetails, e);
return null;
}
};