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
This commit is contained in:
Anton Nikolaev
2020-07-02 02:47:06 -07:00
committed by Facebook GitHub Bot
parent b11082d229
commit 228d09d572
4 changed files with 72 additions and 32 deletions

View File

@@ -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<string> {
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,
]}`,
);
}

View File

@@ -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);
})();

View File

@@ -211,3 +211,47 @@ export async function publishPackages({
}
}
}
export async function resolvePluginDir(name: string): Promise<string> {
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<string | undefined> {
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<string | undefined> {
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;
}