From f9ee0ecd509e3a57ba14cad99cbb2ffd245d623b Mon Sep 17 00:00:00 2001 From: Gal Schlezinger Date: Sun, 18 Apr 2021 16:51:12 +0300 Subject: [PATCH] Auto-generate command documentation markdown (#432) --- .ci/prepare-version.js | 3 +- .ci/print-command-docs.js | 152 ++++++++++++++ .github/workflows/rust.yml | 84 ++------ README.md | 72 +------ docs/commands.md | 402 +++++++++++++++++++++++++++++++++++++ package.json | 4 +- src/cli.rs | 2 +- src/config.rs | 26 ++- yarn.lock | 94 ++++++++- 9 files changed, 699 insertions(+), 140 deletions(-) create mode 100755 .ci/print-command-docs.js create mode 100644 docs/commands.md diff --git a/.ci/prepare-version.js b/.ci/prepare-version.js index eeb99f2..9fda069 100755 --- a/.ci/prepare-version.js +++ b/.ci/prepare-version.js @@ -23,6 +23,7 @@ const command = cmd.command({ exec("git pull --ff-only"); const nextVersion = updateCargoToml(versionType); exec("cargo build --release"); + exec("yarn generate-command-docs --binary-path=./target/release/fnm"); exec("./docs/record_screen.sh"); exec(`yarn changelog ${nextVersion}`); }, @@ -62,7 +63,7 @@ function updateCargoToml(versionType) { function exec(command, env) { console.log(`$ ${command}`); return cp.execSync(command, { - cwd: path.join(__dirname, '..'), // root of repo + cwd: path.join(__dirname, ".."), // root of repo stdio: "inherit", env: { ...process.env, ...env }, }); diff --git a/.ci/print-command-docs.js b/.ci/print-command-docs.js new file mode 100755 index 0000000..3acda9b --- /dev/null +++ b/.ci/print-command-docs.js @@ -0,0 +1,152 @@ +#!/usr/bin/env node + +/// @ts-check + +const execa = require("execa"); +const path = require("path"); +const fs = require("fs"); +const cmd = require("cmd-ts"); +const cmdFs = require("cmd-ts/dist/cjs/batteries/fs"); + +const FnmBinaryPath = { + ...cmdFs.ExistingPath, + defaultValue() { + const target = path.join(__dirname, "../target/debug/fnm"); + if (!fs.existsSync(target)) { + throw new Error( + "Can't find debug target, please run `cargo build` or provide a specific binary path" + ); + } + return target; + }, +}; + +const command = cmd.command({ + name: "print-command-docs", + description: "prints the docs/command.md file with updated contents", + args: { + checkForDirty: cmd.flag({ + long: "check", + description: `Check that file was not changed`, + }), + fnmPath: cmd.option({ + long: "binary-path", + description: "the fnm binary path", + type: FnmBinaryPath, + }), + }, + async handler({ checkForDirty, fnmPath }) { + const targetFile = path.join(__dirname, "../docs/commands.md"); + await main(targetFile, fnmPath); + if (checkForDirty) { + const gitStatus = await checkGitStatus(targetFile); + if (gitStatus.state === "dirty") { + process.exitCode = 1; + console.error( + "The file has changed. Please re-run `yarn generate-command-docs`." + ); + console.error(`hint: The following diff was found:`); + console.error(); + console.error(gitStatus.diff); + } + } + }, +}); + +cmd.run(cmd.binary(command), process.argv).catch((err) => { + console.error(err); + process.exitCode = process.exitCode || 1; +}); + +/** + * @param {string} targetFile + * @param {string} fnmPath + * @returns {Promise} + */ +async function main(targetFile, fnmPath) { + const stream = fs.createWriteStream(targetFile); + + const { subcommands, text: mainText } = await getCommandHelp(fnmPath); + + await write(stream, line(`fnm`, mainText)); + + for (const subcommand of subcommands) { + const { text: subcommandText } = await getCommandHelp(fnmPath, subcommand); + await write(stream, "\n" + line(`fnm ${subcommand}`, subcommandText)); + } + + stream.close(); + + await execa(`yarn`, ["prettier", "--write", targetFile]); +} + +/** + * @param {import('stream').Writable} stream + * @param {string} content + * @returns {Promise} + */ +function write(stream, content) { + return new Promise((resolve, reject) => { + stream.write(content, (err) => (err ? reject(err) : resolve())); + }); +} + +function line(cmd, text) { + const cmdCode = "`" + cmd + "`"; + const textCode = "```\n" + text + "\n```"; + return `# ${cmdCode}\n${textCode}`; +} + +/** + * @param {string} fnmPath + * @param {string} [command] + * @returns {Promise<{ subcommands: string[], text: string }>} + */ +async function getCommandHelp(fnmPath, command) { + const cmdArg = command ? [command] : []; + const result = await run(fnmPath, [...cmdArg, "--help"]); + const text = result.stdout; + const rows = text.split("\n"); + const headerIndex = rows.findIndex((x) => x.includes("SUBCOMMANDS")); + /** @type {string[]} */ + const subcommands = []; + for (const row of rows.slice(headerIndex + 1)) { + const matched = row.match(/^\s{4}(\w+)/); + if (!matched) break; + subcommands.push(matched[1]); + } + return { + subcommands, + text, + }; +} + +/** + * @param {string[]} args + * @returns {import('execa').ExecaChildProcess} + */ +function run(fnmPath, args) { + return execa(fnmPath, args, { + reject: false, + stdout: "pipe", + stderr: "pipe", + }); +} + +/** + * @param {string} targetFile + * @returns {Promise<{ state: "dirty", diff: string } | { state: "clean" }>} + */ +async function checkGitStatus(targetFile) { + const { stdout, exitCode } = await execa( + `git`, + ["diff", "--color", "--exit-code", targetFile], + { + reject: false, + } + ); + if (exitCode === 0) { + return { state: "clean" }; + } + return { state: "dirty", diff: stdout }; +} diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 2a17835..4af4cfc 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -165,65 +165,25 @@ jobs: name: fnm-${{ matrix.arch }} path: target/${{ env.RUST_TARGET }}/release/fnm - # benchmark_on_linux: - # name: Performance Benchmarks (Linux) - # needs: [build_static_linux_binary] - # runs-on: ubuntu-latest - # steps: - # - uses: octokit/request-action@v2.x - # id: get_master_workflows - # with: - # route: GET /repos/:repository/actions/runs - # repository: ${{ github.repository }} - # branch: master - # status: completed - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # - uses: octokit/request-action@v2.x - # id: get_latest_artifacts - # with: - # route: GET /repos/:repository/actions/runs/:workflow_id/artifacts - # repository: ${{ github.repository }} - # workflow_id: ${{ fromJson(steps.get_master_workflows.outputs.data).workflow_runs[0].id }} - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - # - name: "Take the output" - # run: | - # URL=$(echo '${{ steps.get_latest_artifacts.outputs.data }}' | jq -r '.artifacts | map(select(.name == "fnm-linux")) | .[0].archive_download_url') - # curl -L $URL -H 'authorization: Bearer ${{ secrets.GITHUB_TOKEN }}' > /tmp/fnm-latest.zip - # mkdir ~/.fnm-latest - # unzip -d ~/.fnm-latest /tmp/fnm-latest.zip - # ls -lah ~/.fnm-latest - # - uses: actions/checkout@v2 - # - name: Install Hyperfine - # run: | - # wget https://github.com/sharkdp/hyperfine/releases/download/v1.10.0/hyperfine_1.10.0_amd64.deb - # sudo dpkg -i hyperfine_1.10.0_amd64.deb - # - name: Install fnm-reason for Linux - # run: curl -fsSL https://github.com/Schniz/fnm/raw/master/.ci/install.sh | bash -s -- --skip-shell - # - name: Install nvm - # run: curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash - # - uses: actions/download-artifact@v2 - # with: - # name: fnm-linux - # path: target/release/ - # - name: "Run benchmarks" - # run: bash benchmarks/run - - # - name: Read basic.md for the generated report - # id: basic_result - # uses: juliangruber/read-file-action@v1 - # with: - # path: benchmarks/results/basic.md - - # - uses: octokit/request-action@v2.x - # id: get_latest_release - # with: - # route: POST /repos/:repository/commits/:commit_sha/comments - # repository: ${{ github.repository }} - # commit_sha: ${{ github.sha }} - # body: | - # | - # ${{ steps.basic_result.outputs.content }} - # env: - # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + ensure_commands_markdown_is_up_to_date: + runs-on: ubuntu-latest + name: Ensure command docs are up-to-date + needs: [build_static_linux_binary] + steps: + - uses: actions/checkout@v2 + - name: Download a single artifact + uses: actions/download-artifact@v2 + with: + name: fnm-linux + - name: Make the binary runnable + run: | + sudo install fnm /bin + fnm --version + - name: Print fnm version + run: fnm --version + - run: fnm install + - name: Install Node deps + run: fnm exec -- yarn + - name: Generate command markdown + run: | + fnm exec -- yarn generate-command-docs --check --binary-path=$(which fnm) diff --git a/README.md b/README.md index f7659d0..f3f4230 100644 --- a/README.md +++ b/README.md @@ -163,77 +163,9 @@ fnm is also supported but is not entirely covered. [You can set up a startup scr FOR /f "tokens=*" %i IN ('fnm env --use-on-cd') DO CALL %i ``` -## Usage +## [Usage](./docs/commands.md) -### Global Options - -```sh -fnm [--shell=fish|bash|zsh] [--node-dist-mirror=URI] [--fnm-dir=DIR] [--log-level=quiet|error|info] [--arch=ARCH] -``` - -- Providing `--shell=fish` will output the Fish-compliant version. Omit it and `fnm` will try to infer the current shell based on the process tree -- Providing `--node-dist-mirror="https://npm.taobao.org/dist"` will use the Chinese mirror of Node.js -- Providing `--fnm-dir="/tmp/fnm"` will install and use versions in `/tmp/fnm` directory -- Providing `--arch=x64` will install Node binaries with `x86-64` architecture. Omit it and `fnm` will default to your computer's architecture. - -You can always use `fnm --help` to read the docs: - -#### Apple Silicon -Until [upstream support for darwin-arm64](https://github.com/nodejs/node/issues/37309) is complete, `fnm` defaults to installing the `darwin-x64` architecture for your selected version to be run with Rosetta 2. - -Enable Rosetta 2 via terminal command: -```sh -softwareupdate --install-rosetta -``` -The `--arch` option overrides this default. - -### `fnm install [VERSION]` - -Installs `[VERSION]`. If no version provided, it will install the version specified in the `.node-version` or `.nvmrc` files located in the current working directory. - -### `fnm install --lts` - -Installs the latest LTS version of Node - -### `fnm use [VERSION]` - -Activates `[VERSION]` as the current Node version. If no version provided, it will activate the version specified in the `.node-version` or `.nvmrc` file located in the current working directory. - -#### Flags - -- `--install-if-missing` — installs the version if it isn't installed yet - -### `fnm current` - -Display currently activated Node version. - -### `fnm list` - -Lists the installed Node versions. - -### `fnm list-remote` - -Lists the Node versions available to download remotely. - -### `fnm uninstall [VERSION]` - -Uninstalls the node version specified in `[VERSION]`. - -### `fnm alias [VERSION] [NAME]` - -Aliases a Node version to a given name. - -### `fnm default [VERSION]` - -Aliases a Node version as default. Uses `fnm alias` underneath. - -### `fnm env` - -Prints the required shell commands in order to configure your shell, Bash compliant if can't infer the shell. This command is highly influenced by [the global options](#global-options) - -#### Options: - -- `--use-on-cd` will also output a script that will automatically change the node version if a `.node-version`/`.nvmrc` file is found +[See the available commands for an extended usage documentation](./docs/commands.md) ## Contributing diff --git a/docs/commands.md b/docs/commands.md new file mode 100644 index 0000000..edcc00d --- /dev/null +++ b/docs/commands.md @@ -0,0 +1,402 @@ +# `fnm` + +``` +fnm 1.24.0 +A fast and simple Node.js manager + +USAGE: + fnm [OPTIONS] + +FLAGS: + -h, --help + Prints help information + + -V, --version + Prints version information + + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir + The root directory of fnm installations [env: FNM_DIR] + + --log-level + The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + +SUBCOMMANDS: + alias Alias a version to a common name + completions Print shell completions to stdout + current Print the current Node.js version + default Set a version as the default version + env Print and set up required environment variables for fnm + exec Run a command within fnm context + help Prints this message or the help of the given subcommand(s) + install Install a new Node.js version + list List all locally installed Node.js versions [aliases: ls] + list-remote List all remote Node.js versions [aliases: ls-remote] + uninstall Uninstall a Node.js version + use Change Node.js version +``` + +# `fnm alias` + +``` +fnm-alias 1.24.0 +Alias a version to a common name + +USAGE: + fnm alias [OPTIONS] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + +ARGS: + + +``` + +# `fnm completions` + +``` +fnm-completions 1.24.0 +Print shell completions to stdout + +USAGE: + fnm completions [OPTIONS] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + --shell + The shell syntax to use. Infers when missing [possible values: zsh, bash, fish, powershell, elvish] + +``` + +# `fnm current` + +``` +fnm-current 1.24.0 +Print the current Node.js version + +USAGE: + fnm current [OPTIONS] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + +``` + +# `fnm default` + +``` +fnm-default 1.24.0 +Set a version as the default version + +This is a shorthand for `fnm alias VERSION default` + +USAGE: + fnm default [OPTIONS] + +FLAGS: + -h, --help + Prints help information + + -V, --version + Prints version information + + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir + The root directory of fnm installations [env: FNM_DIR] + + --log-level + The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + +ARGS: + + + +``` + +# `fnm env` + +``` +fnm-env 1.24.0 +Print and set up required environment variables for fnm + +This command generates a series of shell commands that should be evaluated by your shell to create a fnm-ready +environment. + +Each shell has its own syntax of evaluating a dynamic expression. For example, evaluating fnm on Bash and Zsh would look +like `eval "$(fnm env)"`. In Fish, evaluating would look like `fnm env | source` + +USAGE: + fnm env [FLAGS] [OPTIONS] + +FLAGS: + -h, --help + Prints help information + + --use-on-cd + Print the script to change Node versions every directory change + + -V, --version + Prints version information + + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir + The root directory of fnm installations [env: FNM_DIR] + + --log-level + The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + --shell + The shell syntax to use. Infers when missing [possible values: bash, zsh, fish, powershell] + +``` + +# `fnm exec` + +``` +fnm-exec 1.24.0 +Run a command within fnm context + +Example: +-------- +fnm exec --using=v12.0.0 node --version +=> v12.0.0 + +USAGE: + fnm exec [OPTIONS] [arguments]... + +FLAGS: + -h, --help + Prints help information + + -V, --version + Prints version information + + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir + The root directory of fnm installations [env: FNM_DIR] + + --log-level + The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + --using + Either an explicit version, or a filename with the version written in it + + +ARGS: + ... + The command to run + +``` + +# `fnm help` + +``` + +``` + +# `fnm install` + +``` +fnm-install 1.24.0 +Install a new Node.js version + +USAGE: + fnm install [FLAGS] [OPTIONS] [version] + +FLAGS: + -h, --help Prints help information + --lts Install latest LTS + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + +ARGS: + A version string. Can be a partial semver or a LTS version name by the format lts/NAME +``` + +# `fnm list` + +``` +fnm-list 1.24.0 +List all locally installed Node.js versions + +USAGE: + fnm list [OPTIONS] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + +``` + +# `fnm list` + +``` +fnm-list 1.24.0 +List all locally installed Node.js versions + +USAGE: + fnm list [OPTIONS] + +FLAGS: + -h, --help Prints help information + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + +``` + +# `fnm uninstall` + +``` +fnm-uninstall 1.24.0 +Uninstall a Node.js version + +> Warning: when providing an alias, it will remove the Node version the alias is pointing to, along with the other +aliases that point to the same version. + +USAGE: + fnm uninstall [OPTIONS] [version] + +FLAGS: + -h, --help + Prints help information + + -V, --version + Prints version information + + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir + The root directory of fnm installations [env: FNM_DIR] + + --log-level + The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + +ARGS: + + + +``` + +# `fnm use` + +``` +fnm-use 1.24.0 +Change Node.js version + +USAGE: + fnm use [FLAGS] [OPTIONS] [version] + +FLAGS: + -h, --help Prints help information + --install-if-missing Install the version if it isn't installed yet + -V, --version Prints version information + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary [env: FNM_ARCH] + [default: x64] + --fnm-dir The root directory of fnm installations [env: FNM_DIR] + --log-level The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] + --node-dist-mirror + https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + + +ARGS: + +``` diff --git a/package.json b/package.json index 75f2fd1..c01842f 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "license": "GPLv3", "scripts": { "changelog": "./.ci/generate-changelog.sh", - "version:prepare": "./.ci/prepare-version.js" + "version:prepare": "./.ci/prepare-version.js", + "generate-command-docs": "./.ci/print-command-docs.js" }, "changelog": { "repo": "Schniz/fnm", @@ -20,6 +21,7 @@ }, "devDependencies": { "cmd-ts": "0.6.8", + "execa": "^5.0.0", "lerna-changelog": "1.0.1", "prettier": "2.2.1", "toml": "3.0.0" diff --git a/src/cli.rs b/src/cli.rs index 7707537..5095942 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -56,7 +56,7 @@ pub enum SubCommand { /// -------- /// fnm exec --using=v12.0.0 node --version /// => v12.0.0 - #[structopt(name = "exec")] + #[structopt(name = "exec", verbatim_doc_comment)] Exec(commands::exec::Exec), /// Uninstall a Node.js version diff --git a/src/config.rs b/src/config.rs index 843b00c..f7c08b2 100644 --- a/src/config.rs +++ b/src/config.rs @@ -11,12 +11,18 @@ pub struct FnmConfig { long, env = "FNM_NODE_DIST_MIRROR", default_value = "https://nodejs.org/dist", - global = true + global = true, + hide_env_values = true )] pub node_dist_mirror: reqwest::Url, /// The root directory of fnm installations. - #[structopt(long = "fnm-dir", env = "FNM_DIR", global = true)] + #[structopt( + long = "fnm-dir", + env = "FNM_DIR", + global = true, + hide_env_values = true + )] pub base_dir: Option, /// Where the current node version link is stored. @@ -31,12 +37,24 @@ pub struct FnmConfig { multishell_path: Option, /// The log level of fnm commands - #[structopt(long, env = "FNM_LOGLEVEL", default_value = "info", global = true)] + #[structopt( + long, + env = "FNM_LOGLEVEL", + default_value = "info", + global = true, + hide_env_values = true + )] log_level: LogLevel, /// Override the architecture of the installed Node binary. /// Defaults to arch of fnm binary. - #[structopt(long, env = "FNM_ARCH", default_value, global = true)] + #[structopt( + long, + env = "FNM_ARCH", + default_value, + global = true, + hide_env_values = true + )] pub arch: arch::Arch, } diff --git a/yarn.lock b/yarn.lock index 58d50a7..0230634 100644 --- a/yarn.lock +++ b/yarn.lock @@ -245,6 +245,15 @@ cross-spawn@^6.0.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + debug@4, debug@^4.1.0, debug@^4.1.1: version "4.2.0" resolved "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" @@ -326,6 +335,21 @@ execa@^1.0.0: signal-exit "^3.0.0" strip-eof "^1.0.0" +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -380,6 +404,11 @@ get-stream@^4.0.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + glob@^7.1.3, glob@^7.1.4: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" @@ -433,6 +462,11 @@ https-proxy-agent@^4.0.0: agent-base "5" debug "4" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -505,6 +539,11 @@ is-stream@^1.1.0: resolved "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" + integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== + isarray@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -572,6 +611,16 @@ make-fetch-happen@^7.1.1: socks-proxy-agent "^4.0.0" ssri "^7.0.1" +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimatch@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" @@ -693,6 +742,13 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + object-assign@^4.0.1: version "4.1.1" resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -705,6 +761,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -775,6 +838,11 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + prettier@2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" @@ -880,12 +948,24 @@ shebang-command@^1.2.0: dependencies: shebang-regex "^1.0.0" +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= -signal-exit@^3.0.0: +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.0, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -963,6 +1043,11 @@ strip-eof@^1.0.0: resolved "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" @@ -1039,6 +1124,13 @@ which@^1.2.9: dependencies: isexe "^2.0.0" +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"