Files
flipper/desktop/plugin-lib/src/getSourcePlugins.tsx
Andrey Goncharov 2b16916a85 Deprecate kaios-portal
Reviewed By: passy

Differential Revision: D36807506

fbshipit-source-id: 660f334a46dbf7847c90ce6e67f2dc974c1daf90
2022-06-07 04:00:02 -07:00

96 lines
2.9 KiB
TypeScript

/**
* 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 {getPluginSourceFolders} from './pluginPaths';
import pmap from 'p-map';
import pfilter from 'p-filter';
import {satisfies} from 'semver';
import {getInstalledPluginDetails, isPluginDir} from './getPluginDetails';
import {InstalledPluginDetails} from 'flipper-common';
const flipperVersion = require('../package.json').version;
export async function getSourcePlugins(): Promise<InstalledPluginDetails[]> {
const pluginFolders = await getPluginSourceFolders();
const entryPoints: {[key: string]: InstalledPluginDetails} = {};
const additionalPlugins = await pmap(pluginFolders, (path) =>
entryPointForPluginFolder(path),
);
for (const p of additionalPlugins) {
Object.keys(p).forEach((key) => {
entryPoints[key] = p[key];
});
}
const allPlugins = Object.values(entryPoints);
if (process.env.FLIPPER_ENABLED_PLUGINS) {
const pluginNames = new Set<string>(
process.env.FLIPPER_ENABLED_PLUGINS.split(',').map((x) =>
x.toLowerCase(),
),
);
return allPlugins.filter(
(x) =>
pluginNames.has(x.name) ||
pluginNames.has(x.id) ||
pluginNames.has(x.name.replace('flipper-plugin-', '')),
);
}
return allPlugins;
}
async function entryPointForPluginFolder(
pluginsDir: string,
): Promise<{[key: string]: InstalledPluginDetails}> {
if (!(await fs.pathExists(pluginsDir))) {
return {};
}
return await fs
.readdir(pluginsDir)
.then((entries) => entries.map((name) => path.join(pluginsDir, name)))
.then((entries) => pfilter(entries, isPluginDir))
.then((packages) =>
pmap(packages, async (dir) => {
try {
const details = await getInstalledPluginDetails(dir);
if (
details.flipperSDKVersion &&
!satisfies(flipperVersion, details.flipperSDKVersion)
) {
console.warn(
`⚠️ The current Flipper version (${flipperVersion}) doesn't look compatible with the plugin '${details.name}', which expects 'flipper-plugin: ${details.flipperSDKVersion}'`,
);
}
return details;
} catch (e) {
console.error(
`Could not load plugin from "${dir}", because package.json is invalid.`,
e,
);
return null;
}
}),
)
.then((plugins) =>
plugins
.filter(notNull)
.filter(({deprecated}) => typeof deprecated !== 'string'),
)
.then((plugins) =>
plugins.reduce<{[key: string]: InstalledPluginDetails}>((acc, cv) => {
acc[cv!.name] = cv!;
return acc;
}, {}),
);
}
function notNull<T>(x: T | null | undefined): x is T {
return x !== null && x !== undefined;
}