From 1491e111c9702797f178b5bd7bf29c45db895a5a Mon Sep 17 00:00:00 2001 From: Anton Nikolaev Date: Mon, 20 Apr 2020 11:10:27 -0700 Subject: [PATCH] Bundle command Summary: Command which transpiles and bundles plugin code. It is supposed to be used in "prepack" script for all open-sourced plugin packages to bundle them before publishing like this: ``` { "devDependencies": { "flipper-pkg": "latest" }, "scripts": { "prepack": "flipper-pkg bundle" } } ``` Also made directory parameter of other command "pack" optional so it also can be called from plugin directory simply by `flipper-pkg pack`. Changelog: "flipper-pkg bundle" command for bundling plugins before publishing. Reviewed By: mweststrate Differential Revision: D21129691 fbshipit-source-id: 8f97bc950c28cf9ad8b0117c0e1d811ed1b988eb --- desktop/pkg/README.md | 30 +++++++++++++++--- desktop/pkg/src/commands/bundle.ts | 49 ++++++++++++++++++++++++++++++ desktop/pkg/src/commands/pack.ts | 13 ++++++-- 3 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 desktop/pkg/src/commands/bundle.ts diff --git a/desktop/pkg/README.md b/desktop/pkg/README.md index 883e0c900..9ff8c1bed 100644 --- a/desktop/pkg/README.md +++ b/desktop/pkg/README.md @@ -24,8 +24,26 @@ USAGE # Commands +* [`flipper-pkg bundle [DIRECTORY]`](#flipper-pkg-bundle-directory) * [`flipper-pkg help [COMMAND]`](#flipper-pkg-help-command) -* [`flipper-pkg pack DIRECTORY`](#flipper-pkg-pack-directory) +* [`flipper-pkg pack [DIRECTORY]`](#flipper-pkg-pack-directory) + +## `flipper-pkg bundle [DIRECTORY]` + +transpiles and bundles plugin + +``` +USAGE + $ flipper-pkg bundle [DIRECTORY] + +ARGUMENTS + DIRECTORY [default: .] Path to plugin package directory for bundling. Defaults to the current working directory. + +EXAMPLE + $ flipper-pkg bundle optional/path/to/directory +``` + +_See code: [src/commands/bundle.ts](https://github.com/facebook/flipper/blob/v0.37.0/src/commands/bundle.ts)_ ## `flipper-pkg help [COMMAND]` @@ -44,16 +62,20 @@ OPTIONS _See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v2.2.3/src/commands/help.ts)_ -## `flipper-pkg pack DIRECTORY` +## `flipper-pkg pack [DIRECTORY]` packs a plugin folder into a distributable archive ``` USAGE - $ flipper-pkg pack DIRECTORY + $ flipper-pkg pack [DIRECTORY] + +ARGUMENTS + DIRECTORY [default: .] Path to plugin package directory to pack. Defaults to the current working directory. OPTIONS - -o, --output=output [default: .] Where to output the package, file or directory. Defaults to '.'. + -o, --output=output [default: .] Where to output the package, file or directory. Defaults to the current working + directory. EXAMPLE $ flipper-pkg pack path/to/plugin diff --git a/desktop/pkg/src/commands/bundle.ts b/desktop/pkg/src/commands/bundle.ts new file mode 100644 index 000000000..e61b94e28 --- /dev/null +++ b/desktop/pkg/src/commands/bundle.ts @@ -0,0 +1,49 @@ +/** + * 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 {Command} from '@oclif/command'; +import {args} from '@oclif/parser'; +import fs from 'fs-extra'; +import path from 'path'; +import {runBuild, getPluginDetails} from 'flipper-pkg-lib'; + +export default class Bundle extends Command { + public static description = 'transpiles and bundles plugin'; + + public static examples = [`$ flipper-pkg bundle optional/path/to/directory`]; + + public static args: args.IArg[] = [ + { + name: 'directory', + required: false, + default: '.', + description: + 'Path to plugin package directory for bundling. Defaults to the current working directory.', + }, + ]; + + public async run() { + const {args} = this.parse(Bundle); + const inputDirectory: string = path.resolve(process.cwd(), args.directory); + const stat = await fs.lstat(inputDirectory); + if (!stat.isDirectory()) { + this.error(`Plugin source ${inputDirectory} is not a directory.`); + } + const packageJsonPath = path.join(inputDirectory, 'package.json'); + if (!(await fs.pathExists(packageJsonPath))) { + this.error( + `package.json is not found in plugin source directory ${inputDirectory}.`, + ); + } + const plugin = await getPluginDetails(inputDirectory); + const out = path.resolve(inputDirectory, plugin.main); + await fs.ensureDir(path.dirname(out)); + await runBuild(inputDirectory, plugin.source, out); + } +} diff --git a/desktop/pkg/src/commands/pack.ts b/desktop/pkg/src/commands/pack.ts index 514e21175..77d15ff7c 100644 --- a/desktop/pkg/src/commands/pack.ts +++ b/desktop/pkg/src/commands/pack.ts @@ -8,6 +8,7 @@ */ import {Command, flags} from '@oclif/command'; +import {args} from '@oclif/parser'; import {promises as fs} from 'fs'; import {mkdirp, pathExists, readJSON, ensureDir} from 'fs-extra'; import * as inquirer from 'inquirer'; @@ -32,11 +33,19 @@ export default class Pack extends Command { char: 'o', default: '.', description: - "Where to output the package, file or directory. Defaults to '.'.", + 'Where to output the package, file or directory. Defaults to the current working directory.', }), }; - public static args = [{name: 'directory', required: true}]; + public static args: args.IArg[] = [ + { + name: 'directory', + required: false, + default: '.', + description: + 'Path to plugin package directory to pack. Defaults to the current working directory.', + }, + ]; public async run() { const {args, flags: parsedFlags} = this.parse(Pack);