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

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