From d77b15aae8333d2938229b4f7a4d558a4900ee72 Mon Sep 17 00:00:00 2001 From: Brian Faust Date: Fri, 1 Feb 2019 16:11:39 +0200 Subject: [PATCH] refactor(core-snapshots-cli): replace commander.js with @oclif (#2050) --- packages/core-snapshots-cli/bin/run | 5 + packages/core-snapshots-cli/bin/run.cmd | 3 + packages/core-snapshots-cli/package.json | 60 +++-- .../src/commands/command.ts | 25 +++ .../core-snapshots-cli/src/commands/create.ts | 16 -- .../core-snapshots-cli/src/commands/dump.ts | 38 ++++ .../core-snapshots-cli/src/commands/import.ts | 30 --- .../core-snapshots-cli/src/commands/index.ts | 7 - .../src/commands/restore.ts | 61 +++++ .../src/commands/rollback.ts | 38 +++- .../src/commands/truncate.ts | 16 +- .../core-snapshots-cli/src/commands/verify.ts | 33 ++- packages/core-snapshots-cli/src/index.ts | 74 +----- .../src/{utils/index.ts => utils.ts} | 1 + yarn.lock | 211 +++++++++++++++++- 15 files changed, 443 insertions(+), 175 deletions(-) create mode 100755 packages/core-snapshots-cli/bin/run create mode 100644 packages/core-snapshots-cli/bin/run.cmd create mode 100644 packages/core-snapshots-cli/src/commands/command.ts delete mode 100644 packages/core-snapshots-cli/src/commands/create.ts create mode 100644 packages/core-snapshots-cli/src/commands/dump.ts delete mode 100644 packages/core-snapshots-cli/src/commands/import.ts delete mode 100644 packages/core-snapshots-cli/src/commands/index.ts create mode 100644 packages/core-snapshots-cli/src/commands/restore.ts rename packages/core-snapshots-cli/src/{utils/index.ts => utils.ts} (99%) diff --git a/packages/core-snapshots-cli/bin/run b/packages/core-snapshots-cli/bin/run new file mode 100755 index 0000000000..30b14e1773 --- /dev/null +++ b/packages/core-snapshots-cli/bin/run @@ -0,0 +1,5 @@ +#!/usr/bin/env node + +require('@oclif/command').run() +.then(require('@oclif/command/flush')) +.catch(require('@oclif/errors/handle')) diff --git a/packages/core-snapshots-cli/bin/run.cmd b/packages/core-snapshots-cli/bin/run.cmd new file mode 100644 index 0000000000..968fc30758 --- /dev/null +++ b/packages/core-snapshots-cli/bin/run.cmd @@ -0,0 +1,3 @@ +@echo off + +node "%~dp0\run" %* diff --git a/packages/core-snapshots-cli/package.json b/packages/core-snapshots-cli/package.json index d2107542ed..7e7d392a9a 100644 --- a/packages/core-snapshots-cli/package.json +++ b/packages/core-snapshots-cli/package.json @@ -8,49 +8,61 @@ "license": "MIT", "main": "dist/index.js", "files": [ - "dist" + "/bin", + "/dist", + "/oclif.manifest.json" ], "bin": { - "core:snapshot": "node ./dist/index.js" + "snapshot": "./bin/run" }, "scripts": { + "snapshot": "./bin/run", "prepublishOnly": "yarn test && yarn build", "pretest": "yarn lint && yarn build", + "prepack": "oclif-dev manifest && npm shrinkwrap", + "postpack": "rm -f oclif.manifest.json", "compile": "../../node_modules/typescript/bin/tsc", "build": "yarn clean && yarn compile", "build:watch": "yarn clean && yarn compile -w", "clean": "del dist", "docs": "../../node_modules/typedoc/bin/typedoc src --out docs", "lint": "../../node_modules/tslint/bin/tslint -c ../../tslint.json 'src/**/*.ts' '__tests__/**/*.ts' --fix", - "start": "node ./dist/index.js", "debug": "node --inspect-brk ./dist/index.js", - "create:mainnet": "node ./dist/index.js create --config ../core/src/config/mainnet --network mainnet", - "create:devnet": "node ./dist/index.js create --config ../core/src/config/devnet --network devnet", - "create:testnet": "node ./dist/index.js create --config ../core/src/config/testnet --network testnet", - "import:mainnet": "node ./dist/index.js import --config ../core/src/config/mainnet --network mainnet", - "import:devnet": "node ./dist/index.js import --config ../core/src/config/devnet --network devnet", - "import:testnet": "node ./dist/index.js import --config ../core/src/config/testnet --network testnet", - "verify:mainnet": "node ./dist/index.js verify --config ../core/src/config/mainnet --network mainnet", - "verify:devnet": "node ./dist/index.js verify --config ../core/src/config/devnet --network devnet", - "verify:testnet": "node ./dist/index.js verify --config ../core/src/config/testnet --network testnet", - "rollback:mainnet": "node ./dist/index.js rollback --config ../core/src/config/mainnet --network mainnet", - "rollback:devnet": "node ./dist/index.js rollback --config ../core/src/config/devnet --network devnet", - "rollback:testnet": "node ./dist/index.js rollback --config ../core/src/config/testnet --network testnet", - "truncate:mainnet": "node ./dist/index.js truncate --config ../core/src/config/mainnet --network mainnet", - "truncate:devnet": "node ./dist/index.js truncate --config ../core/src/config/devnet --network devnet", - "truncate:testnet": "node ./dist/index.js truncate --config ../core/src/config/testnet --network testnet", + "dump": "yarn snapshot dump", + "dump:mainnet": "yarn snapshot dump --network mainnet", + "dump:devnet": "yarn snapshot dump --network devnet", + "dump:testnet": "yarn snapshot dump --network testnet", + "restore": "yarn snapshot restore", + "restore:mainnet": "yarn snapshot restore --network mainnet", + "restore:devnet": "yarn snapshot restore --network devnet", + "restore:testnet": "yarn snapshot restore --network testnet", + "verify": "yarn snapshot verify", + "verify:mainnet": "yarn snapshot verify --network mainnet", + "verify:devnet": "yarn snapshot verify --network devnet", + "verify:testnet": "yarn snapshot verify --network testnet", + "rollback": "yarn snapshot rollback", + "rollback:mainnet": "yarn snapshot rollback --network mainnet", + "rollback:devnet": "yarn snapshot rollback --network devnet", + "rollback:testnet": "yarn snapshot rollback --network testnet", + "truncate": "yarn snapshot truncate", + "truncate:mainnet": "yarn snapshot truncate --network mainnet", + "truncate:devnet": "yarn snapshot truncate --network devnet", + "truncate:testnet": "yarn snapshot truncate --network testnet", "updates": "../../node_modules/npm-check-updates/bin/npm-check-updates -a" }, "dependencies": { - "@arkecosystem/core-interfaces": "^2.1.0", "@arkecosystem/core-container": "^2.1.0", + "@arkecosystem/core-interfaces": "^2.1.0", "@arkecosystem/core-snapshots": "^2.1.0", + "@oclif/command": "^1.5.8", + "@oclif/config": "^1.12.4", + "@oclif/plugin-help": "^2.1.6", + "@oclif/plugin-not-found": "^1.2.2", "@types/boom": "^7.2.1", "@types/cli-progress": "^1.8.0", "@types/commander": "^2.12.2", "@types/fs-extra": "^5.0.4", "cli-progress": "^2.1.1", - "commander": "^2.19.0", "fs-extra": "^7.0.1" }, "publishConfig": { @@ -61,5 +73,13 @@ }, "jest": { "preset": "../../jest-preset.json" + }, + "oclif": { + "commands": "./dist/commands", + "bin": "snapshot", + "plugins": [ + "@oclif/plugin-help", + "@oclif/plugin-not-found" + ] } } diff --git a/packages/core-snapshots-cli/src/commands/command.ts b/packages/core-snapshots-cli/src/commands/command.ts new file mode 100644 index 0000000000..c4f02e2d44 --- /dev/null +++ b/packages/core-snapshots-cli/src/commands/command.ts @@ -0,0 +1,25 @@ +import Command, { flags } from "@oclif/command"; + +export abstract class BaseCommand extends Command { + public static flags = { + data: flags.string({ + description: "data directory", + }), + config: flags.string({ + description: "network config", + }), + token: flags.string({ + description: "token name", + default: "ark", + }), + network: flags.string({ + description: "token network", + }), + skipCompression: flags.boolean({ + description: "skip gzip compression", + }), + trace: flags.boolean({ + description: "dumps generated queries and settings to console", + }), + }; +} diff --git a/packages/core-snapshots-cli/src/commands/create.ts b/packages/core-snapshots-cli/src/commands/create.ts deleted file mode 100644 index d3d8e71e1d..0000000000 --- a/packages/core-snapshots-cli/src/commands/create.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { app } from "@arkecosystem/core-container"; -import { Logger } from "@arkecosystem/core-interfaces"; -import { SnapshotManager } from "@arkecosystem/core-snapshots"; -import fs from "fs-extra"; - -export async function createSnapshot(options) { - const logger = app.resolvePlugin("logger"); - const snapshotManager = app.resolvePlugin("snapshots"); - - if (options.filename && !fs.existsSync(/*utils.getPath */ options.filename)) { - logger.error(`Appending not possible. Existing snapshot ${options.filename} not found. Exiting...`); - throw new Error(`Appending not possible. Existing snapshot ${options.filename} not found. Exiting...`); - } else { - await snapshotManager.exportData(options); - } -} diff --git a/packages/core-snapshots-cli/src/commands/dump.ts b/packages/core-snapshots-cli/src/commands/dump.ts new file mode 100644 index 0000000000..a06ac275fb --- /dev/null +++ b/packages/core-snapshots-cli/src/commands/dump.ts @@ -0,0 +1,38 @@ +import { app } from "@arkecosystem/core-container"; +import { Logger } from "@arkecosystem/core-interfaces"; +import { SnapshotManager } from "@arkecosystem/core-snapshots"; +import { flags } from "@oclif/command"; +import fs from "fs-extra"; +import { setUpLite } from "../utils"; +import { BaseCommand } from "./command"; + +export class DumpCommand extends BaseCommand { + public static description: string = "create a full snapshot of the database"; + + public static flags = { + ...BaseCommand.flags, + blocks: flags.string({ + description: "blocks to append to, correlates to folder name", + }), + start: flags.integer({ + description: "start network height to export", + default: -1, + }), + end: flags.integer({ + description: "end network height to export", + default: -1, + }), + codec: flags.string({ + description: "codec name, default is msg-lite binary", + }), + }; + + public async run(): Promise { + // tslint:disable-next-line:no-shadowed-variable + const { flags } = this.parse(DumpCommand); + + await setUpLite(flags); + + await app.resolvePlugin("snapshots").exportData(flags); + } +} diff --git a/packages/core-snapshots-cli/src/commands/import.ts b/packages/core-snapshots-cli/src/commands/import.ts deleted file mode 100644 index 6b8dc1be19..0000000000 --- a/packages/core-snapshots-cli/src/commands/import.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { app } from "@arkecosystem/core-container"; -import { EventEmitter } from "@arkecosystem/core-interfaces"; -import { SnapshotManager } from "@arkecosystem/core-snapshots"; -import _cliProgress from "cli-progress"; - -export async function importSnapshot(options) { - const snapshotManager = app.resolvePlugin("snapshots"); - const emitter = app.resolvePlugin("event-emitter"); - - const progressBar = new _cliProgress.Bar( - { - format: "{bar} {percentage}% | ETA: {eta}s | {value}/{total} | Duration: {duration}s", - }, - _cliProgress.Presets.shades_classic, - ); - - emitter.on("start", data => { - progressBar.start(data.count, 1); - }); - - emitter.on("progress", data => { - progressBar.update(data.value); - }); - - emitter.on("complete", data => { - progressBar.stop(); - }); - - await snapshotManager.importData(options); -} diff --git a/packages/core-snapshots-cli/src/commands/index.ts b/packages/core-snapshots-cli/src/commands/index.ts deleted file mode 100644 index 3e759d26d5..0000000000 --- a/packages/core-snapshots-cli/src/commands/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { createSnapshot } from "./create"; -import { importSnapshot } from "./import"; -import { rollbackSnapshot } from "./rollback"; -import { truncateSnapshot } from "./truncate"; -import { verifySnapshot } from "./verify"; - -export { createSnapshot, importSnapshot, verifySnapshot, rollbackSnapshot, truncateSnapshot }; diff --git a/packages/core-snapshots-cli/src/commands/restore.ts b/packages/core-snapshots-cli/src/commands/restore.ts new file mode 100644 index 0000000000..c3c04e858f --- /dev/null +++ b/packages/core-snapshots-cli/src/commands/restore.ts @@ -0,0 +1,61 @@ +import { app } from "@arkecosystem/core-container"; +import { EventEmitter } from "@arkecosystem/core-interfaces"; +import { SnapshotManager } from "@arkecosystem/core-snapshots"; +import { flags } from "@oclif/command"; +import _cliProgress from "cli-progress"; +import { setUpLite } from "../utils"; +import { BaseCommand } from "./command"; + +export class RestoreCommand extends BaseCommand { + public static description: string = "import data from specified snapshot"; + + public static flags = { + ...BaseCommand.flags, + blocks: flags.string({ + description: "blocks to import, corelates to folder name", + required: true, + }), + codec: flags.string({ + description: "codec name, default is msg-lite binary", + }), + truncate: flags.boolean({ + description: "empty all tables before running import", + }), + skipRestartRound: flags.boolean({ + description: "skip revert to current round", + }), + signatureVerify: flags.boolean({ + description: "signature verification", + }), + }; + + public async run(): Promise { + // tslint:disable-next-line:no-shadowed-variable + const { flags } = this.parse(RestoreCommand); + + await setUpLite(flags); + + const emitter = app.resolvePlugin("event-emitter"); + + const progressBar = new _cliProgress.Bar( + { + format: "{bar} {percentage}% | ETA: {eta}s | {value}/{total} | Duration: {duration}s", + }, + _cliProgress.Presets.shades_classic, + ); + + emitter.on("start", data => { + progressBar.start(data.count, 1); + }); + + emitter.on("progress", data => { + progressBar.update(data.value); + }); + + emitter.on("complete", data => { + progressBar.stop(); + }); + + await app.resolvePlugin("snapshots").importData(flags); + } +} diff --git a/packages/core-snapshots-cli/src/commands/rollback.ts b/packages/core-snapshots-cli/src/commands/rollback.ts index 32aa3e5f99..dfa70112f9 100644 --- a/packages/core-snapshots-cli/src/commands/rollback.ts +++ b/packages/core-snapshots-cli/src/commands/rollback.ts @@ -1,17 +1,35 @@ import { app } from "@arkecosystem/core-container"; import { Logger } from "@arkecosystem/core-interfaces"; import { SnapshotManager } from "@arkecosystem/core-snapshots"; +import { flags } from "@oclif/command"; +import { setUpLite } from "../utils"; +import { BaseCommand } from "./command"; -export async function rollbackSnapshot(options) { - const logger = app.resolvePlugin("logger"); - const snapshotManager = app.resolvePlugin("snapshots"); +export class RollbackCommand extends BaseCommand { + public static description: string = "rollback chain to specified height"; - if (options.blockHeight === -1) { - logger.warn("Rollback height is not specified. Rolling back to last completed round."); - } - logger.info( - `Starting the process of blockchain rollback to block height of ${options.blockHeight.toLocaleString()}`, - ); + public static flags = { + ...BaseCommand.flags, + height: flags.integer({ + description: "block network height number to rollback", + default: -1, + }), + }; + + public async run(): Promise { + // tslint:disable-next-line:no-shadowed-variable + const { flags } = this.parse(RollbackCommand); + + await setUpLite(flags); + + const logger = app.resolvePlugin("logger"); - await snapshotManager.rollbackChain(options.blockHeight); + if (flags.height === -1) { + logger.warn("Rollback height is not specified. Rolling back to last completed round."); + } + + logger.info(`Starting the process of blockchain rollback to block height of ${flags.height.toLocaleString()}`); + + await app.resolvePlugin("snapshots").rollbackChain(flags.height); + } } diff --git a/packages/core-snapshots-cli/src/commands/truncate.ts b/packages/core-snapshots-cli/src/commands/truncate.ts index d6bb3398e9..1d6a8fa2d3 100644 --- a/packages/core-snapshots-cli/src/commands/truncate.ts +++ b/packages/core-snapshots-cli/src/commands/truncate.ts @@ -1,7 +1,17 @@ import { app } from "@arkecosystem/core-container"; import { SnapshotManager } from "@arkecosystem/core-snapshots"; +import { setUpLite } from "../utils"; +import { BaseCommand } from "./command"; -export async function truncateSnapshot(options) { - const snapshotManager = app.resolvePlugin("snapshots"); - await snapshotManager.truncateChain(); +export class TruncateCommand extends BaseCommand { + public static description: string = "truncate blockchain database"; + + public async run(): Promise { + // tslint:disable-next-line:no-shadowed-variable + const { flags } = this.parse(TruncateCommand); + + await setUpLite(flags); + + await app.resolvePlugin("snapshots").truncateChain(); + } } diff --git a/packages/core-snapshots-cli/src/commands/verify.ts b/packages/core-snapshots-cli/src/commands/verify.ts index 34abc3cf2b..23f2303422 100644 --- a/packages/core-snapshots-cli/src/commands/verify.ts +++ b/packages/core-snapshots-cli/src/commands/verify.ts @@ -1,16 +1,33 @@ import { app } from "@arkecosystem/core-container"; import { Logger } from "@arkecosystem/core-interfaces"; import { SnapshotManager } from "@arkecosystem/core-snapshots"; +import { flags } from "@oclif/command"; import fs from "fs-extra"; +import { setUpLite } from "../utils"; +import { BaseCommand } from "./command"; -export async function verifySnapshot(options) { - const logger = app.resolvePlugin("logger"); - const snapshotManager = app.resolvePlugin("snapshots"); +export class VerifyCommand extends BaseCommand { + public static description: string = "check validity of specified snapshot"; - if (options.filename && !fs.existsSync(`${process.env.CORE_PATH_DATA}/snapshots/${options.filename}`)) { - logger.error(`Verify not possible. Snapshot ${options.filename} not found.`); - logger.info("Use -f parameter with just the filename and not the full path."); - } else { - await snapshotManager.verifyData(options); + public static flags = { + ...BaseCommand.flags, + blocks: flags.string({ + description: "blocks to verify, corelates to folder name", + }), + codec: flags.string({ + description: "codec name, default is msg-lite binary", + }), + signatureVerify: flags.boolean({ + description: "signature verification", + }), + }; + + public async run(): Promise { + // tslint:disable-next-line:no-shadowed-variable + const { flags } = this.parse(VerifyCommand); + + await setUpLite(flags); + + await app.resolvePlugin("snapshots").verifyData(flags); } } diff --git a/packages/core-snapshots-cli/src/index.ts b/packages/core-snapshots-cli/src/index.ts index 2ca1940c99..8bdb76f9a0 100644 --- a/packages/core-snapshots-cli/src/index.ts +++ b/packages/core-snapshots-cli/src/index.ts @@ -1,73 +1 @@ -#!/usr/bin/env node - -import { app } from "@arkecosystem/core-container"; -import cli from "commander"; -import { createSnapshot, importSnapshot, rollbackSnapshot, truncateSnapshot, verifySnapshot } from "./commands"; -import * as utils from "./utils"; - -// tslint:disable-next-line:no-var-requires -const { version } = require("../package.json"); - -cli.version(version); - -const registerCommand = (name, description) => { - return cli - .command(name) - .description(description) - .option("-d, --data ", "data directory") - .option("-c, --config ", "network config") - .option("-t, --token ", "token name", "ark") - .option("-n, --network ", "token network") - .option("--skip-compression", "skip gzip compression", false) - .option("--trace", "dumps generated queries and settings to console", false); -}; - -registerCommand("create", "create a full snapshot of the database") - .option("-b, --blocks ", "blocks to append to, correlates to folder name") - .option("-s, --start ", "start network height to export", -1) - .option("-e, --end ", "end network height to export", -1) - .option("--codec ", "codec name, default is msg-lite binary") - .action(async options => { - await utils.setUpLite(options); - await createSnapshot(options); - }); - -registerCommand("import", "import data from specified snapshot") - .option("-b, --blocks ", "blocks to import, corelates to folder name") - .option("--codec ", "codec name, default is msg-lite binary") - .option("--truncate", "empty all tables before running import", false) - .option("--skip-restart-round", "skip revert to current round", false) - .option("--signature-verify", "signature verification", false) - .action(async options => { - await utils.setUpLite(options); - await importSnapshot(options); - }); - -registerCommand("verify", "check validity of specified snapshot") - .option("-b, --blocks ", "blocks to verify, corelates to folder name") - .option("--codec ", "codec name, default is msg-lite binary") - .option("--signature-verify", "signature verification", false) - .action(async options => { - await utils.setUpLite(options); - await verifySnapshot(options); - }); - -registerCommand("rollback", "rollback chain to specified height") - .option("-b, --block-height ", "block network height number to rollback", -1) - .action(async options => { - await utils.setUpLite(options); - rollbackSnapshot(options); - }); - -registerCommand("truncate", "truncate blockchain database").action(async options => { - await utils.setUpLite(options); - truncateSnapshot(options); -}); - -cli.command("*").action(env => { - cli.help(); - process.exit(0); -}); - -app.silentShutdown = true; -cli.parse(process.argv); +export { run } from "@oclif/command"; diff --git a/packages/core-snapshots-cli/src/utils/index.ts b/packages/core-snapshots-cli/src/utils.ts similarity index 99% rename from packages/core-snapshots-cli/src/utils/index.ts rename to packages/core-snapshots-cli/src/utils.ts index 50be9dd00c..779bcdfc6f 100644 --- a/packages/core-snapshots-cli/src/utils/index.ts +++ b/packages/core-snapshots-cli/src/utils.ts @@ -2,6 +2,7 @@ import { app } from "@arkecosystem/core-container"; export const setUpLite = async options => { process.env.CORE_SKIP_BLOCKCHAIN = "true"; + await app.setUp("2.0.0", options, { include: [ "@arkecosystem/core-logger", diff --git a/yarn.lock b/yarn.lock index 8ad34cb1ae..336294fc1d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1284,6 +1284,88 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b" integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw== +"@oclif/color@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@oclif/color/-/color-0.0.0.tgz#54939bbd16d1387511bf1a48ccda1a417248e6a9" + integrity sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw== + dependencies: + ansi-styles "^3.2.1" + supports-color "^5.4.0" + tslib "^1" + +"@oclif/command@^1.5.3", "@oclif/command@^1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.8.tgz#cd09d4f3183123548cb25d1b12b92e41277ac3e9" + integrity sha512-+Xuqp7by9jmB+GvR2r450wUXkCpZVdeOXQD0mLSEm3h+Mxhp0NPHuhzXZQvLI0/2fXR+cmJLv1CfpaCYaflL/g== + dependencies: + "@oclif/errors" "^1.2.2" + "@oclif/parser" "^3.7.2" + debug "^4.1.0" + semver "^5.6.0" + +"@oclif/config@^1.12.4": + version "1.12.4" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.12.4.tgz#664f7f43c79a5b6674c35d1fd4a98c596c8a8630" + integrity sha512-lZR5Qs9NEbQ9PsOZN0nALMBisTTa53ajRsyuhMwSQtDP8B7jISqWS9czYRfn9eYA+/xWgcjwRILCHuJFtdEuTA== + dependencies: + debug "^4.1.1" + tslib "^1.9.3" + +"@oclif/errors@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.2.2.tgz#9d8f269b15f13d70aa93316fed7bebc24688edc2" + integrity sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg== + dependencies: + clean-stack "^1.3.0" + fs-extra "^7.0.0" + indent-string "^3.2.0" + strip-ansi "^5.0.0" + wrap-ansi "^4.0.0" + +"@oclif/linewrap@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" + integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== + +"@oclif/parser@^3.7.2": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.7.2.tgz#b06c73377a1f027f10444109a8a4a6cc31ffd8ba" + integrity sha512-ssYXztaf9TuOGCJQOYMg62L1Q4y2lB4wZORWng+Iy0ckP2A6IUnQy97V8YjAJkkohYZOu3Mga8LGfQcf+xdIIw== + dependencies: + "@oclif/linewrap" "^1.0.0" + chalk "^2.4.1" + tslib "^1.9.3" + +"@oclif/plugin-help@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.1.6.tgz#ae14cbe2c5cd3eaf5f796d205ffbe66d3e369173" + integrity sha512-M4kTERpPWNSM1Mga7K/zo9DWHLCVf2FRaIeXPoytmTPd+0kSvG3TR0Vc1bwx9/cxXoYyYGgEejwNlrfayr8FZw== + dependencies: + "@oclif/command" "^1.5.8" + chalk "^2.4.1" + indent-string "^3.2.0" + lodash.template "^4.4.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + widest-line "^2.0.1" + wrap-ansi "^4.0.0" + +"@oclif/plugin-not-found@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-1.2.2.tgz#3e601f6e4264d7a0268cd03c152d90aa9c0cec6d" + integrity sha512-SPlmiJFmTFltQT/owdzQwKgq6eq5AEKVwVK31JqbzK48bRWvEL1Ye60cgztXyZ4bpPn2Fl+KeL3FWFQX41qJuA== + dependencies: + "@oclif/color" "^0.0.0" + "@oclif/command" "^1.5.3" + cli-ux "^4.9.0" + fast-levenshtein "^2.0.6" + lodash "^4.17.11" + +"@oclif/screen@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" + integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== + "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" @@ -3768,6 +3850,14 @@ capture-stack-trace@^1.0.0: resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== +cardinal@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-2.1.1.tgz#7cc1055d822d212954d07b085dea251cc7bc5505" + integrity sha1-fMEFXYItISlU0HsIXeolHMe8VQU= + dependencies: + ansicolors "~0.3.2" + redeyed "~2.1.0" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -3891,11 +3981,16 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" -clean-stack@^1.0.0: +clean-stack@^1.0.0, clean-stack@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= +clean-stack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.0.0.tgz#301bfa9e8dd2d3d984c0e542f7aa67b996f63e0a" + integrity sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A== + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -3941,6 +4036,33 @@ cli-truncate@^0.2.1: slice-ansi "0.0.4" string-width "^1.0.1" +cli-ux@^4.9.0: + version "4.9.3" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-4.9.3.tgz#4c3e070c1ea23eef010bbdb041192e0661be84ce" + integrity sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA== + dependencies: + "@oclif/errors" "^1.2.2" + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^1.0.3" + ansi-escapes "^3.1.0" + ansi-styles "^3.2.1" + cardinal "^2.1.1" + chalk "^2.4.1" + clean-stack "^2.0.0" + extract-stack "^1.0.0" + fs-extra "^7.0.0" + hyperlinker "^1.0.0" + indent-string "^3.2.0" + is-wsl "^1.1.0" + lodash "^4.17.11" + password-prompt "^1.0.7" + semver "^5.6.0" + strip-ansi "^5.0.0" + supports-color "^5.5.0" + supports-hyperlinks "^1.0.1" + treeify "^1.1.0" + tslib "^1.9.3" + cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" @@ -4609,6 +4731,13 @@ debug@^4.0.1, debug@^4.1.0: dependencies: ms "^2.1.1" +debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -5002,6 +5131,11 @@ email-validator@^2.0.4: resolved "https://registry.yarnpkg.com/email-validator/-/email-validator-2.0.4.tgz#b8dfaa5d0dae28f1b03c95881d904d4e40bfe7ed" integrity sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -5193,7 +5327,7 @@ esprima@3.x.x, esprima@^3.1.3: resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM= -esprima@^4.0.0: +esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -5446,6 +5580,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa" + integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo= + extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" @@ -5488,7 +5627,7 @@ fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -6380,6 +6519,11 @@ has-flag@^1.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6627,6 +6771,11 @@ husky@^1.3.0: run-node "^1.0.0" slash "^2.0.0" +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -6714,7 +6863,7 @@ indent-string@^2.1.0: dependencies: repeating "^2.0.0" -indent-string@^3.0.0: +indent-string@^3.0.0, indent-string@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= @@ -8497,7 +8646,7 @@ lodash.take@^4.1.1: resolved "https://registry.yarnpkg.com/lodash.take/-/lodash.take-4.1.1.tgz#0b4146dcb7a70c6153495187fc10b12b71fefadf" integrity sha1-C0FG3LenDGFTSVGH/BCxK3H++t8= -lodash.template@^4.0.2: +lodash.template@^4.0.2, lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= @@ -8542,7 +8691,7 @@ lodash@4.17.10: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== -lodash@^4, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.1, lodash@^4.17.10, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: +lodash@^4, lodash@^4.13.1, lodash@^4.15.0, lodash@^4.17.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== @@ -10148,6 +10297,14 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +password-prompt@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.0.7.tgz#8e27748d3400bc9c9140d5ade705dfb7aeb7d91a" + integrity sha1-jid0jTQAvJyRQNWt5wXft6632Ro= + dependencies: + ansi-escapes "^3.1.0" + cross-spawn "^6.0.5" + path-array@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" @@ -11049,6 +11206,13 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" +redeyed@~2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" + integrity sha1-iYS1gV2ZyyIEacme7v/jiRPmzAs= + dependencies: + esprima "~4.0.0" + regenerate-unicode-properties@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" @@ -12322,6 +12486,15 @@ string-width@^1.0.1: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.0.0.tgz#5a1690a57cc78211fffd9bf24bbe24d090604eb1" + integrity sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.0.0" + string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" @@ -12466,13 +12639,21 @@ supports-color@^3.1.2: dependencies: has-flag "^1.0.0" -supports-color@^5.3.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + symbol-observable@^1.0.4, symbol-observable@^1.1.0, symbol-observable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" @@ -12800,6 +12981,11 @@ tr46@^1.0.1: dependencies: punycode "^2.1.0" +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== + trim-newlines@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" @@ -13473,7 +13659,7 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -widest-line@^2.0.0: +widest-line@^2.0.0, widest-line@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== @@ -13583,6 +13769,15 @@ wrap-ansi@^3.0.1: string-width "^2.1.1" strip-ansi "^4.0.0" +wrap-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-4.0.0.tgz#b3570d7c70156159a2d42be5cc942e957f7b1131" + integrity sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg== + dependencies: + ansi-styles "^3.2.0" + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrappy@1, wrappy@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"