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
This commit is contained in:
Anton Nikolaev
2020-04-20 11:10:27 -07:00
committed by Facebook GitHub Bot
parent 105345facd
commit 1491e111c9
3 changed files with 86 additions and 6 deletions

View File

@@ -24,8 +24,26 @@ USAGE
<!-- usagestop -->
# Commands
<!-- 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

View File

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

View File

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