From 228d09d5727031a0fcdcd9008c997cb42f59bc65 Mon Sep 17 00:00:00 2001 From: Anton Nikolaev Date: Thu, 2 Jul 2020 02:47:06 -0700 Subject: [PATCH] Script for resolving plugin directory by its package name Summary: Changed "build-plugin" script to allow triggering release by plugin name (required to enable triggering releases by button in Marketplace): 1) Added new script to resolve plugin dir by name 2) Allow passing either plugin dir or name to "build-plugin" script Reviewed By: passy Differential Revision: D22354643 fbshipit-source-id: b7aca57acefc81ca0b6d9c7f359f63d8f0599e39 --- desktop/package.json | 1 + desktop/scripts/build-plugin.ts | 43 +++++++------------------- desktop/scripts/resolve-plugin-dir.ts | 16 ++++++++++ desktop/scripts/workspaces.ts | 44 +++++++++++++++++++++++++++ 4 files changed, 72 insertions(+), 32 deletions(-) create mode 100644 desktop/scripts/resolve-plugin-dir.ts diff --git a/desktop/package.json b/desktop/package.json index 702f5ad6a..a0307cc8b 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -237,6 +237,7 @@ "build-headless": "cross-env NODE_ENV=production ./ts-node scripts/build-headless.ts $@", "prebuild-plugin": "yarn build:pkg", "build-plugin": "./ts-node scripts/build-plugin.ts", + "resolve-plugin-dir": "./ts-node scripts/resolve-plugin-dir.ts", "open-dist": "open ../dist/mac/Flipper.app --args --launcher=false --inspect=9229", "fix": "eslint . --fix --ext .js,.ts,.tsx", "pretest": "yarn build:pkg", diff --git a/desktop/scripts/build-plugin.ts b/desktop/scripts/build-plugin.ts index dba936a37..ba1028abe 100644 --- a/desktop/scripts/build-plugin.ts +++ b/desktop/scripts/build-plugin.ts @@ -11,20 +11,19 @@ import {pluginsDir, rootDir, distDir} from './paths'; import path from 'path'; import fs from 'fs-extra'; import {execSync} from 'child_process'; +import {resolvePluginDir} from './workspaces'; (async function buildPlugin() { - const pluginDirArg = process.argv[2]; - const pluginDir = await resolveAbsolutePluginDir(pluginDirArg); - if (path.relative(pluginsDir, pluginDir).includes('..')) { - throw new Error( - `Plugin dir ${pluginDir} is not inside plugins directory ${pluginsDir}`, - ); - } - const outputFile = path.join( - distDir, - 'plugins', - path.relative(pluginsDir, pluginDir) + '.tgz', - ); + const pluginName = process.argv[2]; + const pluginDir = await resolvePluginDir(pluginName); + const outputFileArg = process.argv.length > 3 ? process.argv[3] : null; + const outputFile = outputFileArg + ? path.resolve(outputFileArg) + : path.join( + distDir, + 'plugins', + path.relative(pluginsDir, pluginDir) + '.tgz', + ); await fs.ensureDir(path.dirname(outputFile)); await fs.remove(outputFile); const bundleCmd = `yarn flipper-pkg bundle "${pluginDir}" --production`; @@ -32,23 +31,3 @@ import {execSync} from 'child_process'; execSync(bundleCmd, {cwd: rootDir, stdio: 'inherit'}); execSync(packCmd, {cwd: rootDir, stdio: 'inherit'}); })(); - -async function resolveAbsolutePluginDir(dir: string): Promise { - if (path.isAbsolute(dir)) { - return dir; - } - const resolvedFromPluginDir = path.resolve(pluginsDir, dir); - if (await fs.pathExists(resolvedFromPluginDir)) { - return resolvedFromPluginDir; - } - const resolvedFromCwd = path.resolve(process.cwd(), dir); - if (await fs.pathExists(resolvedFromCwd)) { - return resolvedFromCwd; - } - throw new Error( - `Cannot resolve plugin dir path. Paths checked: ${[ - resolvedFromPluginDir, - resolvedFromCwd, - ]}`, - ); -} diff --git a/desktop/scripts/resolve-plugin-dir.ts b/desktop/scripts/resolve-plugin-dir.ts new file mode 100644 index 000000000..9897635fb --- /dev/null +++ b/desktop/scripts/resolve-plugin-dir.ts @@ -0,0 +1,16 @@ +/** + * Copyright (c) Facebook, Inc. and its 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 {resolvePluginDir} from './workspaces'; + +(async function () { + const pluginName = process.argv[2]; + const pluginDir = await resolvePluginDir(pluginName); + console.log(pluginDir); +})(); diff --git a/desktop/scripts/workspaces.ts b/desktop/scripts/workspaces.ts index bc51d09aa..21e41455a 100644 --- a/desktop/scripts/workspaces.ts +++ b/desktop/scripts/workspaces.ts @@ -211,3 +211,47 @@ export async function publishPackages({ } } } + +export async function resolvePluginDir(name: string): Promise { + const pluginDir = + (await resolvePluginByNameOrId(name)) ?? (await resolvePluginByPath(name)); + if (!pluginDir) { + throw new Error(`Cannot find plugin by name or dir ${name}`); + } else { + return pluginDir; + } +} + +async function resolvePluginByNameOrId( + pluginName: string, +): Promise { + const workspaces = await getWorkspaces(); + const pluginDir = workspaces.packages + .filter((p) => p.isPlugin) + .find( + (p) => + p.json.name === pluginName || + p.json.id === pluginName || + p.json.name === `flipper-plugin-${pluginName}`, + )?.dir; + return pluginDir; +} + +async function resolvePluginByPath(dir: string): Promise { + if (path.isAbsolute(dir)) { + if (await fs.pathExists(dir)) { + return dir; + } else { + return undefined; + } + } + const resolvedFromPluginDir = path.resolve(pluginsDir, dir); + if (await fs.pathExists(resolvedFromPluginDir)) { + return resolvedFromPluginDir; + } + const resolvedFromCwd = path.resolve(process.cwd(), dir); + if (await fs.pathExists(resolvedFromCwd)) { + return resolvedFromCwd; + } + return undefined; +}