diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 0000000..e5b6d8d --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/chilly-apes-travel.md b/.changeset/chilly-apes-travel.md new file mode 100644 index 0000000..9bd8324 --- /dev/null +++ b/.changeset/chilly-apes-travel.md @@ -0,0 +1,5 @@ +--- +"fnm": minor +--- + +Add `--json` to `fnm env` to output the env vars as JSON diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 0000000..3857bde --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@2.0.0/schema.json", + "changelog": [ + "@svitejs/changesets-changelog-github-compact", + { "repo": "Schniz/fnm" } + ], + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "master", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/.changeset/red-flowers-collect.md b/.changeset/red-flowers-collect.md new file mode 100644 index 0000000..eb8ec32 --- /dev/null +++ b/.changeset/red-flowers-collect.md @@ -0,0 +1,5 @@ +--- +"fnm": patch +--- + +This updates the Changesets configurations. diff --git a/.changeset/soft-laws-doubt.md b/.changeset/soft-laws-doubt.md new file mode 100644 index 0000000..c9b9fdd --- /dev/null +++ b/.changeset/soft-laws-doubt.md @@ -0,0 +1,5 @@ +--- +"fnm": patch +--- + +fix test: Use correct PATH for npm install test diff --git a/.ci/generate-changelog.sh b/.ci/generate-changelog.sh deleted file mode 100755 index 7b13a36..0000000 --- a/.ci/generate-changelog.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -if [ "$1" = "" ]; then - echo "No version provided, using 'Unreleased'" >&2 - NEXT_VERSION="Unreleased" -else - NEXT_VERSION="$1" -fi - -echo "Generating changelog for $NEXT_VERSION" - -lerna-changelog --from=v1.0.0 "--next-version=$NEXT_VERSION" >CHANGELOG.md -prettier --write CHANGELOG.md diff --git a/.ci/prepare-version.js b/.ci/prepare-version.js index 9fda069..5d6ddb2 100755 --- a/.ci/prepare-version.js +++ b/.ci/prepare-version.js @@ -2,85 +2,71 @@ /// @ts-check -const fs = require("fs"); -const cp = require("child_process"); -const path = require("path"); -const cmd = require("cmd-ts"); -const toml = require("toml"); +import fs from "fs" +import cp from "child_process" +import cmd from "cmd-ts" +import toml from "toml" +import assert from "assert" -const CARGO_TOML_PATH = path.join(__dirname, "../Cargo.toml"); +const CARGO_TOML_PATH = new URL("../Cargo.toml", import.meta.url).pathname const command = cmd.command({ name: "prepare-version", description: "Prepare a new fnm version", - args: { - versionType: cmd.positional({ - displayName: "version type", - type: cmd.oneOf(["patch", "minor", "major"]), - }), + args: {}, + async handler({}) { + updateCargoToml(await getPackageVersion()) + exec("cargo build --release") + exec("yarn generate-command-docs --binary-path=./target/release/fnm") + exec("./.ci/record_screen.sh") }, - async handler({ versionType }) { - 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}`); - }, -}); +}) -cmd.run(cmd.binary(command), process.argv); +cmd.run(cmd.binary(command), process.argv) ////////////////////// // Helper functions // ////////////////////// -function updateCargoToml(versionType) { - const cargoToml = fs.readFileSync(CARGO_TOML_PATH, "utf8"); - const cargoTomlContents = toml.parse(cargoToml); - const currentVersion = cargoTomlContents.package.version; - const nextVersion = changeVersion( - versionType, - cargoTomlContents.package.version - ); +/** + * @returns {Promise} + */ +async function getPackageVersion() { + const pkgJson = await fs.promises.readFile( + new URL("../package.json", import.meta.url), + "utf8" + ) + const version = JSON.parse(pkgJson).version + assert(version, "package.json version is not set") + return version +} + +function updateCargoToml(nextVersion) { + const cargoToml = fs.readFileSync(CARGO_TOML_PATH, "utf8") + const cargoTomlContents = toml.parse(cargoToml) + const currentVersion = cargoTomlContents.package.version const newToml = cargoToml.replace( `version = "${currentVersion}"`, `version = "${nextVersion}"` - ); + ) if (newToml === cargoToml) { - console.error("Cargo.toml didn't change, error!"); - process.exitCode = 1; - return; + console.error("Cargo.toml didn't change, error!") + process.exitCode = 1 + return } - fs.writeFileSync(CARGO_TOML_PATH, newToml, "utf8"); + fs.writeFileSync(CARGO_TOML_PATH, newToml, "utf8") - return nextVersion; + return nextVersion } function exec(command, env) { - console.log(`$ ${command}`); + console.log(`$ ${command}`) return cp.execSync(command, { - cwd: path.join(__dirname, ".."), // root of repo + cwd: new URL("..", import.meta.url), stdio: "inherit", env: { ...process.env, ...env }, - }); -} - -/** - * @param {"patch" | "minor" | "major"} type - * @param {string} version - */ -function changeVersion(type, version) { - const [major, minor, patch] = version.split(".").map((x) => parseInt(x, 10)); - switch (type) { - case "patch": - return [major, minor, patch + 1].join("."); - case "minor": - return [major, minor + 1, 0].join("."); - case "major": - return [major + 1, 0, 0].join("."); - } + }) } diff --git a/.ci/print-command-docs.js b/.ci/print-command-docs.js index f5328e1..7b5996a 100755 --- a/.ci/print-command-docs.js +++ b/.ci/print-command-docs.js @@ -2,24 +2,23 @@ /// @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"); +import { execa } from "execa" +import fs from "node:fs" +import cmd from "cmd-ts" +import cmdFs from "cmd-ts/dist/cjs/batteries/fs.js" const FnmBinaryPath = { ...cmdFs.ExistingPath, defaultValue() { - const target = path.join(__dirname, "../target/debug/fnm"); + const target = new URL("../target/debug/fnm", import.meta.url) if (!fs.existsSync(target)) { throw new Error( "Can't find debug target, please run `cargo build` or provide a specific binary path" - ); + ) } - return target; + return target.pathname }, -}; +} const command = cmd.command({ name: "print-command-docs", @@ -36,27 +35,27 @@ const command = cmd.command({ }), }, async handler({ checkForDirty, fnmPath }) { - const targetFile = path.join(__dirname, "../docs/commands.md"); - await main(targetFile, fnmPath); + const targetFile = new URL("../docs/commands.md", import.meta.url).pathname + await main(targetFile, fnmPath) if (checkForDirty) { - const gitStatus = await checkGitStatus(targetFile); + const gitStatus = await checkGitStatus(targetFile) if (gitStatus.state === "dirty") { - process.exitCode = 1; + 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); + ) + 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; -}); + console.error(err) + process.exitCode = process.exitCode || 1 +}) /** * @param {string} targetFile @@ -64,20 +63,20 @@ cmd.run(cmd.binary(command), process.argv).catch((err) => { * @returns {Promise} */ async function main(targetFile, fnmPath) { - const stream = fs.createWriteStream(targetFile); + const stream = fs.createWriteStream(targetFile) - const { subcommands, text: mainText } = await getCommandHelp(fnmPath); + const { subcommands, text: mainText } = await getCommandHelp(fnmPath) - await write(stream, line(`fnm`, mainText)); + 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)); + const { text: subcommandText } = await getCommandHelp(fnmPath, subcommand) + await write(stream, "\n" + line(`fnm ${subcommand}`, subcommandText)) } - stream.close(); + stream.close() - await execa(`yarn`, ["prettier", "--write", targetFile]); + await execa(`yarn`, ["prettier", "--write", targetFile]) } /** @@ -87,14 +86,14 @@ async function main(targetFile, fnmPath) { */ function write(stream, content) { return new Promise((resolve, reject) => { - stream.write(content, (err) => (err ? reject(err) : resolve())); - }); + stream.write(content, (err) => (err ? reject(err) : resolve())) + }) } function line(cmd, text) { - const cmdCode = "`" + cmd + "`"; - const textCode = "```\n" + text + "\n```"; - return `# ${cmdCode}\n${textCode}`; + const cmdCode = "`" + cmd + "`" + const textCode = "```\n" + text + "\n```" + return `# ${cmdCode}\n${textCode}` } /** @@ -103,23 +102,25 @@ function line(cmd, text) { * @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")); + 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 = []; + const subcommands = [] if (!command) { for (const row of rows.slice(headerIndex + 1)) { - const words = row.split(/\s+/); - subcommands.push(words[1]); + const [, word] = row.split(/\s+/) + if (word && word[0].toLowerCase() === word[0]) { + subcommands.push(word) + } } } return { subcommands, text, - }; + } } /** @@ -131,7 +132,7 @@ function run(fnmPath, args) { reject: false, stdout: "pipe", stderr: "pipe", - }); + }) } /** @@ -145,9 +146,9 @@ async function checkGitStatus(targetFile) { { reject: false, } - ); + ) if (exitCode === 0) { - return { state: "clean" }; + return { state: "clean" } } - return { state: "dirty", diff: stdout }; + return { state: "dirty", diff: stdout } } diff --git a/docs/record_screen.sh b/.ci/record_screen.sh similarity index 51% rename from docs/record_screen.sh rename to .ci/record_screen.sh index f278e9f..8ee6f41 100755 --- a/docs/record_screen.sh +++ b/.ci/record_screen.sh @@ -3,10 +3,15 @@ DIRECTORY="$(dirname "$0")" function setup_binary() { - TEMP_DIR="$(mktemp -d -t fnm)" + TEMP_DIR="/tmp/fnm-$(date '+%s')" + mkdir "$TEMP_DIR" cp ./target/release/fnm "$TEMP_DIR/fnm" export PATH=$TEMP_DIR:$PATH export FNM_DIR=$TEMP_DIR/.fnm + + # First run of the binary might be slower due to anti-virus software + echo "Using $(which fnm)" + echo " with version $(fnm --version)" } setup_binary @@ -16,4 +21,9 @@ RECORDING_PATH=$DIRECTORY/screen_recording (rm -rf "$RECORDING_PATH" &> /dev/null || true) asciinema rec -c "$DIRECTORY/recorded_screen_script.sh" "$RECORDING_PATH" -sed "s@$TEMP_DIR@~@g" "$RECORDING_PATH" | svg-term --window --out "$DIRECTORY/fnm.svg" --height=17 --width=70 +sed "s@$TEMP_DIR@~@g" "$RECORDING_PATH" | \ + svg-term \ + --window \ + --out "docs/fnm.svg" \ + --height=17 \ + --width=70 diff --git a/docs/recorded_screen_script.sh b/.ci/recorded_screen_script.sh similarity index 63% rename from docs/recorded_screen_script.sh rename to .ci/recorded_screen_script.sh index e917ac7..c073e86 100755 --- a/docs/recorded_screen_script.sh +++ b/.ci/recorded_screen_script.sh @@ -1,16 +1,19 @@ -#!/bin/zsh +#!/bin/bash set -e -GAL_PROMPT_PREFIX='\e[34m✑ \e[0m' +export PATH=$PATH_ADDITION:$PATH + +GAL_PROMPT_PREFIX="\e[34m✑\e[m " function type() { printf $GAL_PROMPT_PREFIX - echo $* | pv -qL $[10+(-2 + RANDOM%5)] + echo -n " " + echo $* | node .ci/type-letters.js } type 'eval "$(fnm env)"' -eval `fnm env` +eval "$(fnm env)" type 'fnm --version' fnm --version diff --git a/.ci/type-letters.js b/.ci/type-letters.js new file mode 100644 index 0000000..e99f9e5 --- /dev/null +++ b/.ci/type-letters.js @@ -0,0 +1,13 @@ +(async () => { + for await (const chunk of process.stdin) { + const letters = chunk.toString("utf8").split(""); + for (const letter of letters) { + process.stdout.write(letter); + await sleep(Math.random() * 100 + 20); + } + } +})(); + +function sleep(ms) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} diff --git a/.github/workflows/debug.yml b/.github/workflows/debug.yml new file mode 100644 index 0000000..5d19503 --- /dev/null +++ b/.github/workflows/debug.yml @@ -0,0 +1,62 @@ +name: "debug" + +on: + workflow_dispatch: + +concurrency: + group: debug + cancel-in-progress: true + +jobs: + e2e_windows_debug: + runs-on: windows-latest + name: "e2e/windows/debug" + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.inputs.commit_hash }} + - name: Download artifact + id: download-artifact + uses: dawidd6/action-download-artifact@v2 + with: + workflow: rust.yml + workflow_conclusion: "" + branch: ${{ env.GITHUB_REF }} + name: "fnm-windows" + path: "target/release" + if_no_artifact_found: ignore + - uses: hecrj/setup-rust-action@v1 + if: steps.download-artifact.outputs.artifact-found == false + with: + rust-version: stable + - uses: Swatinem/rust-cache@v2 + if: steps.download-artifact.outputs.artifact-found == false + - name: Build release binary + if: steps.download-artifact.outputs.artifact-found == false + run: cargo build --release + env: + RUSTFLAGS: "-C target-feature=+crt-static" + - uses: pnpm/action-setup@v2.2.4 + with: + run_install: false + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'pnpm' + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + - run: pnpm install + - name: πŸ› Debug Build + if: always() + uses: mxschmitt/action-tmate@v3 + with: + limit-access-to-actor: true diff --git a/.github/workflows/installation_script.yml b/.github/workflows/installation_script.yml index a079e25..b36a91a 100644 --- a/.github/workflows/installation_script.yml +++ b/.github/workflows/installation_script.yml @@ -21,8 +21,8 @@ jobs: steps: - name: Set up QEMU id: qemu - uses: docker/setup-qemu-action@v1 - - uses: actions/checkout@v2 + uses: docker/setup-qemu-action@v2 + - uses: actions/checkout@v3 - name: Run installation script in Docker run: | docker run --rm -v $(pwd):$(pwd) -e "RUST_LOG=fnm=debug" --workdir $(pwd) ${{matrix.docker_image}} bash -c ' @@ -62,7 +62,7 @@ jobs: script_arguments: '--force-no-brew' runs-on: ${{ matrix.setup.os }}-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - run: "sudo apt-get install -y ${{ matrix.shell }}" name: Install ${{matrix.shell}} using apt-get if: matrix.setup.os == 'ubuntu' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..cd40599 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,61 @@ +name: release +on: + push: + branches: + - master + - main + +concurrency: ${{ github.workflow }}-${{ github.ref }} + +jobs: + + create_pull_request: + runs-on: ubuntu-latest + steps: + # set up + - uses: actions/checkout@v3 + + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: stable + + - uses: Swatinem/rust-cache@v2 + + - uses: pnpm/action-setup@v2.2.4 + with: + run_install: false + + # pnpm + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'pnpm' + + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + + - name: Install script dependencies + run: | + sudo apt-get update + sudo apt-get install -y asciinema + + - name: Install Node.js project dependencies + run: pnpm install + + - name: Create Release Pull Request + uses: changesets/action@v1 + with: + version: "pnpm version:prepare" + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + TERM: xterm diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index ed3c009..ea6c600 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -6,6 +6,10 @@ on: branches: - master +concurrency: + group: ci-${{ github.head_ref }} + cancel-in-progress: true + jobs: fmt: runs-on: ubuntu-latest @@ -13,7 +17,8 @@ jobs: - uses: hecrj/setup-rust-action@v1 with: rust-version: stable - - uses: actions/checkout@v2 + - uses: Swatinem/rust-cache@v2 + - uses: actions/checkout@v3 - name: cargo fmt run: cargo fmt -- --check @@ -23,7 +28,8 @@ jobs: - uses: hecrj/setup-rust-action@v1 with: rust-version: stable - - uses: actions/checkout@v2 + - uses: Swatinem/rust-cache@v2 + - uses: actions/checkout@v3 - name: cargo clippy run: cargo clippy -- -D warnings @@ -36,28 +42,10 @@ jobs: - uses: hecrj/setup-rust-action@v1 with: rust-version: stable - - uses: actions/checkout@v2 - - name: Run tests - run: cargo test -- --skip=feature_tests - - e2e_tests: - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [ubuntu-latest, macOS-latest, windows-latest] - steps: - - name: Install Fish and Zsh using brew - if: "startsWith(matrix.os, 'macOS')" - run: brew install fish zsh - - name: Install Fish and Zsh using apt - if: "startsWith(matrix.os, 'ubuntu')" - run: sudo apt-get install -y fish zsh - - uses: hecrj/setup-rust-action@v1 - with: - rust-version: stable - - uses: actions/checkout@v2 + - uses: Swatinem/rust-cache@v2 + - uses: actions/checkout@v3 - name: Run tests - run: cargo test -- feature_tests + run: cargo test build_release: runs-on: windows-latest @@ -66,12 +54,13 @@ jobs: - uses: hecrj/setup-rust-action@v1 with: rust-version: stable - - uses: actions/checkout@v2 + - uses: Swatinem/rust-cache@v2 + - uses: actions/checkout@v3 - name: Build release binary run: cargo build --release env: RUSTFLAGS: "-C target-feature=+crt-static" - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: fnm-windows path: target/release/fnm.exe @@ -83,7 +72,8 @@ jobs: - uses: hecrj/setup-rust-action@v1 with: rust-version: stable - - uses: actions/checkout@v2 + - uses: Swatinem/rust-cache@v2 + - uses: actions/checkout@v3 - name: Build release binary run: cargo build --release env: @@ -92,11 +82,155 @@ jobs: run: strip target/release/fnm - name: List dynamically linked libraries run: otool -L target/release/fnm - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: fnm-macos path: target/release/fnm + e2e_macos: + runs-on: macos-latest + needs: [build_macos_release] + name: "e2e/macos" + steps: + - name: install necessary shells + run: brew install fish zsh bash + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 + with: + name: fnm-macos + path: target/release + - name: mark binary as executable + run: chmod +x target/release/fnm + - uses: pnpm/action-setup@v2.2.4 + with: + run_install: false + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'pnpm' + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + - run: pnpm install + - run: pnpm test + env: + FNM_TARGET_NAME: "release" + FORCE_COLOR: "1" + + e2e_windows: + runs-on: windows-latest + needs: [build_release] + name: "e2e/windows" + steps: + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 + with: + name: fnm-windows + path: target/release + - uses: pnpm/action-setup@v2.2.4 + with: + run_install: false + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'pnpm' + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + - run: pnpm install + - run: pnpm test + env: + FNM_TARGET_NAME: "release" + FORCE_COLOR: "1" + + # e2e_windows_debug: + # runs-on: windows-latest + # name: "e2e/windows/debug" + # environment: Debug + # needs: [e2e_windows] + # if: contains(join(needs.*.result, ','), 'failure') + # steps: + # - uses: actions/checkout@v3 + # - uses: actions/download-artifact@v3 + # with: + # name: fnm-windows + # path: target/release + # - uses: pnpm/action-setup@v2.2.2 + # with: + # run_install: false + # - uses: actions/setup-node@v3 + # with: + # node-version: 16.x + # cache: 'pnpm' + # - name: Get pnpm store directory + # id: pnpm-cache + # run: | + # echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + # - uses: actions/cache@v3 + # name: Setup pnpm cache + # with: + # path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + # key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + # restore-keys: | + # ${{ runner.os }}-pnpm-store- + # - run: pnpm install + # - name: πŸ› Debug Build + # uses: mxschmitt/action-tmate@v3 + + e2e_linux: + runs-on: ubuntu-latest + needs: [build_static_linux_binary] + name: "e2e/linux" + steps: + - name: install necessary shells + run: sudo apt-get update && sudo apt-get install -y fish zsh bash + - uses: actions/checkout@v3 + - uses: actions/download-artifact@v3 + with: + name: fnm-linux + path: target/release + - name: mark binary as executable + run: chmod +x target/release/fnm + - uses: pnpm/action-setup@v2.2.4 + with: + run_install: false + - uses: actions/setup-node@v3 + with: + node-version: 16.x + cache: 'pnpm' + - name: Get pnpm store directory + id: pnpm-cache + run: | + echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" + - uses: actions/cache@v3 + name: Setup pnpm cache + with: + path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} + key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} + restore-keys: | + ${{ runner.os }}-pnpm-store- + - run: pnpm install + - run: pnpm test + env: + FNM_TARGET_NAME: "release" + FORCE_COLOR: "1" + build_static_linux_binary: name: "Build static Linux binary" runs-on: ubuntu-latest @@ -105,16 +239,19 @@ jobs: with: rust-version: stable targets: x86_64-unknown-linux-musl + - uses: Swatinem/rust-cache@v2 + with: + key: static-linux-binary - name: Install musl tools run: | sudo apt-get update sudo apt-get install -y --no-install-recommends musl-tools - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Build release binary run: cargo build --release --target x86_64-unknown-linux-musl - name: Strip binary from debug symbols run: strip target/x86_64-unknown-linux-musl/release/fnm - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: fnm-linux path: target/x86_64-unknown-linux-musl/release/fnm @@ -138,20 +275,23 @@ jobs: steps: - name: Set up QEMU id: qemu - uses: docker/setup-qemu-action@v1 + uses: docker/setup-qemu-action@v2 - uses: hecrj/setup-rust-action@v1 with: rust-version: stable + - uses: Swatinem/rust-cache@v2 + with: + key: arm-binary-${{ matrix.arch }} - name: 'Download `cross` crate' run: cargo install cross - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: "Build release" run: cross build --target $RUST_TARGET --release - name: Compress binary using UPX run: | sudo apt-get install -y upx upx target/$RUST_TARGET/release/fnm - - uses: uraimo/run-on-arch-action@v2.1.1 + - uses: uraimo/run-on-arch-action@v2.1.2 name: Sanity test with: arch: ${{matrix.docker_platform}} @@ -176,7 +316,7 @@ jobs: echo "fnm exec --using=12 -- node --version" /artifacts/fnm exec --using=12 -- node --version - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v3 with: name: fnm-${{ matrix.arch }} path: target/${{ env.RUST_TARGET }}/release/fnm @@ -186,9 +326,9 @@ jobs: name: Ensure command docs are up-to-date needs: [build_static_linux_binary] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Download a single artifact - uses: actions/download-artifact@v2 + uses: actions/download-artifact@v3 with: name: fnm-linux - name: Make the binary runnable diff --git a/.gitignore b/.gitignore index 3ed51ab..aea3f20 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,5 @@ node_modules/ -docs/screen_recording +.ci/screen_recording /benchmarks/results /target **/*.rs.bk diff --git a/.kodiak.toml b/.kodiak.toml new file mode 100644 index 0000000..d9914df --- /dev/null +++ b/.kodiak.toml @@ -0,0 +1 @@ +version = 1 diff --git a/.node-version b/.node-version index 07c142f..5397c87 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -16.13.1 +16.18.1 diff --git a/CHANGELOG.md b/CHANGELOG.md index ebe1222..635a2be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,102 @@ -## 1.28.2 (2021-12-05) +## 1.31.0 (2022-02-16) + +## 1.31.1 + +### Patch Changes + +- 6e6bdd8: Add changesets + +#### Bugfix πŸ› + +- [#671](https://github.com/Schniz/fnm/pull/671) fix native-creds errors (using the unpublished version of reqwest) ([@Schniz](https://github.com/Schniz)) +- [#663](https://github.com/Schniz/fnm/pull/663) remove .unwrap() and .expect() in shell code ([@Schniz](https://github.com/Schniz)) +- [#656](https://github.com/Schniz/fnm/pull/656) Remove unwrap in fnm env, make error more readable ([@Schniz](https://github.com/Schniz)) + +#### Committers: 1 + +- Gal Schlezinger ([@Schniz](https://github.com/Schniz)) + +## v1.30.1 (2022-01-30) + +#### Bugfix πŸ› + +- [#652](https://github.com/Schniz/fnm/pull/652) Fix `fnm completions` ([@Schniz](https://github.com/Schniz)) + +#### Committers: 1 + +- Gal Schlezinger ([@Schniz](https://github.com/Schniz)) + +## v1.30.0 (2022-01-30) + +#### Bugfix πŸ› + +- [#625](https://github.com/Schniz/fnm/pull/625) Revert from using sysinfo, but only on Unix machines ([@Schniz](https://github.com/Schniz)) +- [#638](https://github.com/Schniz/fnm/pull/638) Use local cache directory instead of temp directory for symlinks ([@Schniz](https://github.com/Schniz)) + +#### Internal πŸ›  + +- [#617](https://github.com/Schniz/fnm/pull/617) fix(deps): update rust crate clap to v3 ([@renovate[bot]](https://github.com/apps/renovate)) +- [#630](https://github.com/Schniz/fnm/pull/630) Replace `snafu` with `thiserror` ([@Schniz](https://github.com/Schniz)) + +#### Documentation πŸ“ + +- [#637](https://github.com/Schniz/fnm/pull/637) [Documentation] Adds Additional info regarding .node-version ([@uchihamalolan](https://github.com/uchihamalolan)) + +#### Committers: 2 + +- Gal Schlezinger ([@Schniz](https://github.com/Schniz)) +- Malolan B ([@uchihamalolan](https://github.com/uchihamalolan)) + +## v1.29.2 (2022-01-06) + +#### Bugfix πŸ› + +- [#626](https://github.com/Schniz/fnm/pull/626) Create the multishells directory if it is missing ([@Schniz](https://github.com/Schniz)) + +#### Documentation πŸ“ + +- [#598](https://github.com/Schniz/fnm/pull/598) Update README.md file emoji ([@lorensr](https://github.com/lorensr)) +- [#616](https://github.com/Schniz/fnm/pull/616) Use on cd by default ([@matthieubosquet](https://github.com/matthieubosquet)) + +#### Committers: 3 + +- Gal Schlezinger ([@Schniz](https://github.com/Schniz)) +- Loren ☺️ ([@lorensr](https://github.com/lorensr)) +- Matthieu Bosquet ([@matthieubosquet](https://github.com/matthieubosquet)) + +## v1.29.1 (2021-12-28) + +#### Bugfix πŸ› + +- [#613](https://github.com/Schniz/fnm/pull/613) Don't warn on `~/.fnm` yet ([@Schniz](https://github.com/Schniz)) + +#### Committers: 1 + +- Gal Schlezinger ([@Schniz](https://github.com/Schniz)) + +## v1.29.0 (2021-12-28) + +#### New Feature πŸŽ‰ + +- [#607](https://github.com/Schniz/fnm/pull/607) Allow recursive version lookups ([@Schniz](https://github.com/Schniz)) +- [#416](https://github.com/Schniz/fnm/pull/416) Respect \$XDG_DATA_HOME ([@samhh](https://github.com/samhh)) + +#### Bugfix πŸ› + +- [#603](https://github.com/Schniz/fnm/pull/603) (re)Include feature for (native) certificates ([@pfiaux](https://github.com/pfiaux)) +- [#605](https://github.com/Schniz/fnm/pull/605) Add a user-agent header ([@Schniz](https://github.com/Schniz)) + +#### Internal πŸ›  + +- [#606](https://github.com/Schniz/fnm/pull/606) Migrate to Rust 2021 edition ([@Schniz](https://github.com/Schniz)) + +#### Committers: 3 + +- Gal Schlezinger ([@Schniz](https://github.com/Schniz)) +- Patrick Fiaux ([@pfiaux](https://github.com/pfiaux)) +- Sam A. Horvath-Hunt ([@samhh](https://github.com/samhh)) + +## v1.28.2 (2021-12-05) #### Bugfix πŸ› @@ -197,7 +295,7 @@ #### Bugfix πŸ› - [#368](https://github.com/Schniz/fnm/pull/368) Update 'ring' to '0.16.17' ([@gucheen](https://github.com/gucheen)) -- [#347](https://github.com/Schniz/fnm/pull/347) Check if $ZDOTDIR exists to find correct path to .zshrc ([@thales-maciel](https://github.com/thales-maciel)) +- [#347](https://github.com/Schniz/fnm/pull/347) Check if \$ZDOTDIR exists to find correct path to .zshrc ([@thales-maciel](https://github.com/thales-maciel)) #### Documentation πŸ“ diff --git a/Cargo.lock b/Cargo.lock index 8b5218d..66d5755 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,59 +2,68 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "addr2line" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61f2b7f93d2c7d2b08263acaa4a363b3e276806c68af6134c44f523bf1aacd" -dependencies = [ - "gimli", -] - [[package]] name = "adler" version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", +] + [[package]] name = "aho-corasick" -version = "0.7.18" +version = "0.7.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" +checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" dependencies = [ "memchr", ] [[package]] name = "alloc-no-stdlib" -version = "2.0.3" +version = "2.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35ef4730490ad1c4eae5c4325b2a95f521d023e5c885853ff7aca0a6a1631db3" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" [[package]] name = "alloc-stdlib" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697ed7edc0f1711de49ce108c541623a0af97c6c60b2f6e2b65229847ac843c2" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" dependencies = [ "alloc-no-stdlib", ] [[package]] -name = "ansi_term" -version = "0.12.1" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "winapi", + "libc", ] +[[package]] +name = "anyhow" +version = "1.0.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98161a4e3e2184da77bb14f02184cdd111e83bbbcc9979dfee3c44b9a85f5602" + [[package]] name = "async-compression" -version = "0.3.8" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443ccbb270374a2b1055fc72da40e1f237809cd6bb0e97e66d264cd138473a6" +checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" dependencies = [ "brotli", "futures-core", @@ -76,24 +85,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "backtrace" -version = "0.3.61" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7a905d892734eea339e896738c14b9afce22b5318f64b951e70bf3844419b01" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "base64" @@ -101,17 +95,32 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +[[package]] +name = "base64ct" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2b2456fd614d856680dcd9fcc660a51a820fa09daef2e49772b56a193c8474" + [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "block-buffer" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +dependencies = [ + "generic-array", +] + [[package]] name = "brotli" -version = "3.3.2" +version = "3.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71cb90ade945043d3d53597b2fc359bb063db8ade2bcffe7997351d0756e9d50" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -142,9 +151,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.7.1" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" +checksum = "c1ad822118d20d2c234f427000d5acc36eabe1e29a348c89b63dd60b13f28e5d" [[package]] name = "byteorder" @@ -154,9 +163,9 @@ checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" [[package]] name = "bzip2" @@ -181,9 +190,12 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.70" +version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" +checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -193,31 +205,85 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.19" +version = "0.4.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", "num-integer", "num-traits", "serde", - "time", + "time 0.1.44", + "wasm-bindgen", "winapi", ] +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + [[package]] name = "clap" -version = "2.34.0" +version = "3.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" dependencies = [ - "ansi_term", "atty", "bitflags", + "clap_derive", + "clap_lex", + "indexmap", + "once_cell", "strsim", + "termcolor", "textwrap", +] + +[[package]] +name = "clap_complete" +version = "3.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f7a2e0a962c45ce25afce14220bc24f9dade0a1787f185cecf96bfba7847cd8" +dependencies = [ + "clap", +] + +[[package]] +name = "clap_derive" +version = "3.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea0c8bce528c4be4da13ea6fead8965e95b6073585a2f05204bd8f4119f82a65" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +dependencies = [ + "os_str_bytes", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", "unicode-width", - "vec_map", ] [[package]] @@ -233,9 +299,9 @@ dependencies = [ [[package]] name = "console" -version = "0.14.1" +version = "0.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3993e6445baa160675931ec041a5e03ca84b9c6e32a056150d3aa2bdda0a1f45" +checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c" dependencies = [ "encode_unicode", "lazy_static", @@ -244,26 +310,51 @@ dependencies = [ "winapi", ] +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +[[package]] +name = "cpufeatures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +dependencies = [ + "libc", +] + [[package]] name = "crc32fast" -version = "1.2.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" dependencies = [ "cfg-if", "crossbeam-utils", @@ -271,9 +362,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.1" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" dependencies = [ "cfg-if", "crossbeam-epoch", @@ -282,25 +373,34 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.5" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" dependencies = [ + "autocfg", "cfg-if", "crossbeam-utils", - "lazy_static", "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.5" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" dependencies = [ "cfg-if", - "lazy_static", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", ] [[package]] @@ -327,19 +427,87 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.21" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdffe87e1d521a10f9696f833fe502293ea446d7f256c06128293a4119bdf4cb" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "cxx" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19f39818dcfc97d45b03953c1292efc4e80954e1583c4aa770bac1383e2310a4" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxx-build" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e580d70777c116df50c390d1211993f62d40302881e54d4b79727acb83d0199" +dependencies = [ + "cc", + "codespan-reporting", + "once_cell", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56a46460b88d1cec95112c8c363f0e2c39afdb237f60583b0b36343bf627ea9c" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" +checksum = "747b608fecf06b0d72d440f27acc99288207324b793be2c17991839f3d4995ea" dependencies = [ + "proc-macro2", "quote", "syn", ] +[[package]] +name = "dashmap" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "907076dfda823b0b36d2a1bb5f90c96660a5bbcd7729e10727f07858f22c4edc" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "diff" -version = "0.1.12" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" + +[[package]] +name = "digest" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" +checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] [[package]] name = "dirs" @@ -352,27 +520,15 @@ dependencies = [ [[package]] name = "dirs-sys" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" dependencies = [ "libc", "redox_users", "winapi", ] -[[package]] -name = "doc-comment" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" - -[[package]] -name = "dtoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56899898ce76aaf4a0f24d914c97ea6ed976d42fec6ad33fcbb0a1103e07b2b0" - [[package]] name = "duct" version = "0.13.5" @@ -387,19 +543,21 @@ dependencies = [ [[package]] name = "either" -version = "1.6.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" [[package]] name = "embed-resource" -version = "1.6.5" +version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85505eb239fc952b300f29f0556d2d884082a83566768d980278d8faf38c780d" +checksum = "936c1354206a875581696369aef920e12396e93bbd251c43a7a3f3fa85023a7d" dependencies = [ "cc", + "rustc_version", + "toml", "vswhom", - "winreg 0.10.1", + "winreg", ] [[package]] @@ -410,9 +568,9 @@ checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" [[package]] name = "encoding_rs" -version = "0.8.28" +version = "0.8.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +checksum = "9852635589dc9f9ea1b6fe9f05b50ef208c85c834a562f0c6abb1c475736ec2b" dependencies = [ "cfg-if", ] @@ -428,9 +586,9 @@ dependencies = [ [[package]] name = "env_logger" -version = "0.9.0" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" dependencies = [ "atty", "humantime", @@ -439,37 +597,46 @@ dependencies = [ "termcolor", ] +[[package]] +name = "fastrand" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +dependencies = [ + "instant", +] + [[package]] name = "filetime" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "975ccf83d8d9d0d84682850a38c8169027be83368805971cc4f238c2b245bc98" +checksum = "e94a7bbaa59354bc20dd75b67f23e2797b4490e9d6928203fb105c79e448c86c" dependencies = [ "cfg-if", "libc", "redox_syscall", - "winapi", + "windows-sys", ] [[package]] name = "flate2" -version = "1.0.22" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" +checksum = "f82b0f4c27ad9f8bfd1f3208d882da2b09c301bc1c828fd3a00d0216d2fbbff6" dependencies = [ - "cfg-if", "crc32fast", - "libc", "miniz_oxide", ] [[package]] name = "fnm" -version = "1.28.2" +version = "1.31.1" dependencies = [ + "anyhow", "atty", "chrono", "clap", + "clap_complete", "colored", "csv", "dirs", @@ -488,12 +655,11 @@ dependencies = [ "serde_json", "serial_test", "shell-escape", - "snafu", - "structopt", "sysinfo", "tar", "tempfile", "test-log", + "thiserror", "url", "xz2", "zip", @@ -507,55 +673,83 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" dependencies = [ - "matches", "percent-encoding", ] +[[package]] +name = "futures" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f21eda599937fba36daeb58a22e8f5cee2d14c4a17b5b7739c7c8e5e3b8230c" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + [[package]] name = "futures-channel" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fc8cd39e3dbf865f7340dce6a2d401d24fd37c6fe6c4f0ee0de8bfca2252d27" +checksum = "30bdd20c28fadd505d0fd6712cdfcb0d4b5648baf45faef7f852afb2399bb050" dependencies = [ "futures-core", + "futures-sink", ] [[package]] name = "futures-core" -version = "0.3.18" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e5aa3de05362c3fb88de6531e6296e85cde7739cccad4b9dfeeb7f6ebce56bf" + +[[package]] +name = "futures-executor" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629316e42fe7c2a0b9a65b47d159ceaa5453ab14e8f0a3c5eedbb8cd55b4a445" +checksum = "9ff63c23854bee61b6e9cd331d523909f238fc7636290b96826e9cfa5faa00ab" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] [[package]] name = "futures-io" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e481354db6b5c353246ccf6a728b0c5511d752c08da7260546fc0933869daa11" +checksum = "bbf4d2a7a308fd4578637c0b17c7e1c7ba127b8f6ba00b29f717e9655d85eb68" [[package]] name = "futures-sink" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "996c6442437b62d21a32cd9906f9c41e7dc1e19a9579843fad948696769305af" +checksum = "21b20ba5a92e727ba30e72834706623d94ac93a725410b6a6b6fbc1b07f7ba56" [[package]] name = "futures-task" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dabf1872aaab32c886832f2276d2f5399887e2bd613698a02359e4ea83f8de12" +checksum = "a6508c467c73851293f390476d4491cf4d227dbabcd4170f3bb6044959b294f1" [[package]] name = "futures-util" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d22213122356472061ac0f1ab2cee28d2bac8491410fd68c2af53d1cedb83e" +checksum = "44fb6cb1be61cc1d2e43b262516aafcf63b241cffdb1d3fa115f91d9c7b09c90" dependencies = [ + "futures-channel", "futures-core", "futures-io", + "futures-sink", "futures-task", "memchr", "pin-project-lite", @@ -564,27 +758,31 @@ dependencies = [ ] [[package]] -name = "getrandom" -version = "0.2.3" +name = "generic-array" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" dependencies = [ - "cfg-if", - "libc", - "wasi", + "typenum", + "version_check", ] [[package]] -name = "gimli" -version = "0.25.0" +name = "getrandom" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0a01e0497841a3b2db4f8afa483cce65f7e96a3498bd6c541734792aeac8fe7" +checksum = "4eb1a864a501629691edf6c15a593b7a51eebaa1e8468e9ddc623de7c9b58ec6" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] [[package]] name = "h2" -version = "0.3.7" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fd819562fcebdac5afc5c113c3ec36f902840b70fd4fc458799c8ce4607ae55" +checksum = "5ca32592cf21ac7ccab1825cd87f6c9b3d9022c44d086172ed0966bec8af30be" dependencies = [ "bytes", "fnv", @@ -601,18 +799,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "heck" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" -dependencies = [ - "unicode-segmentation", -] +checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" [[package]] name = "hermit-abi" @@ -623,22 +818,31 @@ dependencies = [ "libc", ] +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + [[package]] name = "http" -version = "0.2.5" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" +checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399" dependencies = [ "bytes", "fnv", - "itoa 0.4.8", + "itoa 1.0.4", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ "bytes", "http", @@ -647,9 +851,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.5.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" @@ -665,9 +869,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.15" +version = "0.14.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436ec0091e4f20e655156a30a0df3770fe2900aa301e548e08446ec794b6953c" +checksum = "02c929dc5c39e335a03c405292728118860721b10190d98c2a0f0efd5baafbac" dependencies = [ "bytes", "futures-channel", @@ -678,7 +882,7 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 0.4.8", + "itoa 1.0.4", "pin-project-lite", "socket2", "tokio", @@ -700,22 +904,45 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "iana-time-zone" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde6edd6cef363e9359ed3c98ba64590ba9eecba2293eb5a723ab32aee8926aa" +dependencies = [ + "cxx", + "cxx-build", +] + [[package]] name = "idna" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.7.0" +version = "1.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e" dependencies = [ "autocfg", "hashbrown", @@ -723,43 +950,37 @@ dependencies = [ [[package]] name = "indoc" -version = "1.0.3" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a75aeaaef0ce18b58056d306c27b07436fbb34b8816c53094b76dd81803136" -dependencies = [ - "unindent", -] +checksum = "adab1eaa3408fb7f0c777a73e7465fd5656136fc93b670eb6df3c88c2c1344e3" [[package]] name = "insta" -version = "1.8.0" +version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15226a375927344c78d39dc6b49e2d5562a5b0705e26a589093c6792e52eed8e" +checksum = "581d4e3314cae4536e5d22ffd23189d4a374696c5ef733eadafae0ed273fd303" dependencies = [ - "backtrace", "console", "lazy_static", - "serde", - "serde_json", - "serde_yaml", + "linked-hash-map", "similar", - "uuid", + "yaml-rust", ] [[package]] name = "instant" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" dependencies = [ "cfg-if", ] [[package]] name = "ipnet" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" [[package]] name = "itoa" @@ -769,15 +990,24 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc" + +[[package]] +name = "jobserver" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +dependencies = [ + "libc", +] [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" dependencies = [ "wasm-bindgen", ] @@ -800,62 +1030,66 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.112" +version = "0.2.135" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c" + +[[package]] +name = "link-cplusplus" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +dependencies = [ + "cc", +] [[package]] name = "linked-hash-map" -version = "0.5.4" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", ] [[package]] name = "lzma-sys" -version = "0.1.17" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdb4b7c3eddad11d3af9e86c487607d2d2442d185d848575365c4856ba96d619" +checksum = "e06754c4acf47d49c727d5665ca9fb828851cda315ed3bd51edd148ef78a8772" dependencies = [ "cc", "libc", "pkg-config", ] -[[package]] -name = "matches" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" - [[package]] name = "memchr" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ "autocfg", ] @@ -868,50 +1102,39 @@ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" [[package]] name = "miniz_oxide" -version = "0.4.4" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "96590ba8f175222643a85693f33d26e9c8a015f599c216509b1a6894af675d34" dependencies = [ "adler", - "autocfg", ] [[package]] name = "mio" -version = "0.7.14" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf" dependencies = [ "libc", "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] name = "ntapi" -version = "0.3.6" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +checksum = "bc51db7b362b205941f71232e56c625156eb9a929f8cf74a428fd5bc094a4afc" dependencies = [ "winapi", ] [[package]] name = "num-integer" -version = "0.1.44" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ "autocfg", "num-traits", @@ -919,37 +1142,49 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.13.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" dependencies = [ "hermit-abi", "libc", ] [[package]] -name = "object" -version = "0.26.2" +name = "num_threads" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39f37e50073ccad23b6d09bcb5b263f4e76d3bb6038e4a3c08e52162ffa8abc2" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ - "memchr", + "libc", ] [[package]] name = "once_cell" -version = "1.8.0" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1" + +[[package]] +name = "opaque-debug" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "os_pipe" @@ -961,51 +1196,78 @@ dependencies = [ "winapi", ] +[[package]] +name = "os_str_bytes" +version = "6.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" + [[package]] name = "output_vt100" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53cdc5b785b7a58c5aad8216b3dfa114df64b0b06ae6e1501cef91df2fbdf8f9" +checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66" dependencies = [ "winapi", ] [[package]] name = "parking_lot" -version = "0.11.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929" dependencies = [ "cfg-if", - "instant", "libc", "redox_syscall", "smallvec", - "winapi", + "windows-sys", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", ] [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" [[package]] name = "pin-utils" @@ -1015,26 +1277,20 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9b1041b4387893b91ee6746cddfc28516aff326a3519fb2adf820932c5e6cb" - -[[package]] -name = "ppv-lite86" -version = "0.2.10" +version = "0.3.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" [[package]] name = "pretty_assertions" -version = "1.0.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0cfe1b2403f172ba0f234e500906ee0a3e493fb81092dac23ebefe129301cc" +checksum = "a25e9bcb20aa780fd0bb16b72403a9064d6b3f22f026946029acb941a50af755" dependencies = [ - "ansi_term", "ctor", "diff", "output_vt100", + "yansi", ] [[package]] @@ -1046,84 +1302,50 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" -dependencies = [ - "unicode-xid", -] - -[[package]] -name = "quote" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" -dependencies = [ - "proc-macro2", + "syn", + "version_check", ] [[package]] -name = "rand" -version = "0.8.4" +name = "proc-macro-error-attr" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "libc", - "rand_chacha", - "rand_core", - "rand_hc", + "proc-macro2", + "quote", + "version_check", ] [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "proc-macro2" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "94e2ef8dbfc347b10c094890f778ee2e36ca9bb4262e86dc99cd217e35f3470b" dependencies = [ - "ppv-lite86", - "rand_core", + "unicode-ident", ] [[package]] -name = "rand_core" -version = "0.6.3" +name = "quote" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179" dependencies = [ - "getrandom", + "proc-macro2", ] [[package]] -name = "rand_hc" -version = "0.3.1" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core", -] +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" [[package]] name = "rayon" -version = "1.5.1" +version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" dependencies = [ "autocfg", "crossbeam-deque", @@ -1133,41 +1355,41 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.9.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "lazy_static", "num_cpus", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ "bitflags", ] [[package]] name = "redox_users" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ "getrandom", "redox_syscall", + "thiserror", ] [[package]] name = "regex" -version = "1.5.4" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "4c4eb3267174b8c6c2f654116623910a0fef09c4753f8dd83db29c48a0df988b" dependencies = [ "aho-corasick", "memchr", @@ -1182,9 +1404,9 @@ checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" [[package]] name = "regex-syntax" -version = "0.6.25" +version = "0.6.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" +checksum = "a3f87b73ce11b1619a3c6332f45341e0047173771e8b8b73f87bfeefb7b56244" [[package]] name = "remove_dir_all" @@ -1197,9 +1419,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.7" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bea77bc708afa10e59905c3d4af7c8fd43c9214251673095ff8b14345fcbc5" +checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc" dependencies = [ "async-compression", "base64", @@ -1207,18 +1429,20 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "hyper", "hyper-rustls", "ipnet", "js-sys", - "lazy_static", "log", "mime", + "once_cell", "percent-encoding", "pin-project-lite", "rustls", + "rustls-native-certs", "rustls-pemfile", "serde", "serde_json", @@ -1226,12 +1450,13 @@ dependencies = [ "tokio", "tokio-rustls", "tokio-util", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg 0.7.0", + "winreg", ] [[package]] @@ -1250,37 +1475,62 @@ dependencies = [ ] [[package]] -name = "rustc-demangle" -version = "0.1.21" +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] [[package]] name = "rustls" -version = "0.20.2" +version = "0.20.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37e5e2290f3e040b594b1a9e04377c2c671f1a1cfd9bfdef82106ac1c113f84" +checksum = "5aab8ee6c7097ed6057f43c187a62418d0c05a4bd5f18b3571db50ee0f9ce033" dependencies = [ "log", "ring", "sct", - "webpki 0.22.0", + "webpki", +] + +[[package]] +name = "rustls-native-certs" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "schannel", + "security-framework", ] [[package]] name = "rustls-pemfile" -version = "0.2.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +checksum = "0864aeff53f8c05aa08d86e5ef839d3dfcf07aeba2db32f12db0ef716e87bd55" dependencies = [ "base64", ] [[package]] name = "ryu" -version = "1.0.5" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" +checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" + +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] [[package]] name = "scopeguard" @@ -1288,6 +1538,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +[[package]] +name = "scratch" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" + [[package]] name = "sct" version = "0.7.0" @@ -1298,26 +1554,49 @@ dependencies = [ "untrusted", ] +[[package]] +name = "security-framework" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "semver" -version = "1.0.4" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" +checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" [[package]] name = "serde" -version = "1.0.132" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9875c23cf305cd1fd7eb77234cbb705f21ea6a72c637a5c6db5fe4b8e7f008" +checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.132" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc0db5cb2556c0e558887d9bbdcf6ac4471e83ff66cf696e5419024d1606276" +checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c" dependencies = [ "proc-macro2", "quote", @@ -1326,61 +1605,75 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.73" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcbd0344bc6533bc7ec56df11d42fb70f1b912351c0825ccb7211b59d8af7cf5" +checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074" dependencies = [ - "itoa 1.0.1", + "itoa 1.0.4", "ryu", "serde", ] [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.8", + "itoa 1.0.4", "ryu", "serde", ] -[[package]] -name = "serde_yaml" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8c608a35705a5d3cdc9fbe403147647ff34b921f8e833e49306df898f9b20af" -dependencies = [ - "dtoa", - "indexmap", - "serde", - "yaml-rust", -] - [[package]] name = "serial_test" -version = "0.5.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0bccbcf40c8938196944a3da0e133e031a33f4d6b72db3bda3cc556e361905d" +checksum = "92761393ee4dc3ff8f4af487bd58f4307c9329bbedea02cac0089ad9c411e153" dependencies = [ + "dashmap", + "futures", "lazy_static", + "log", "parking_lot", "serial_test_derive", ] [[package]] name = "serial_test_derive" -version = "0.5.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5" +checksum = "4b6f5d1c3087fb119617cff2966fe3808a80e5eb59a8c1601d5994d66f4346a5" dependencies = [ + "proc-macro-error", "proc-macro2", "quote", "syn", ] +[[package]] +name = "sha1" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "shared_child" version = "0.3.5" @@ -1399,49 +1692,30 @@ checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" [[package]] name = "similar" -version = "1.3.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad1d488a557b235fc46dae55512ffbfc429d2482b08b4d9435ab07384ca8aec" +checksum = "62ac7f900db32bf3fd12e0117dd3dc4da74bc52ebaac97f39668446d89694803" [[package]] name = "slab" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" - -[[package]] -name = "smallvec" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" - -[[package]] -name = "snafu" -version = "0.6.10" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab12d3c261b2308b0d80c26fffb58d17eba81a4be97890101f416b478c79ca7" +checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" dependencies = [ - "backtrace", - "doc-comment", - "snafu-derive", + "autocfg", ] [[package]] -name = "snafu-derive" -version = "0.6.10" +name = "smallvec" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1508efa03c362e23817f96cde18abed596a25219a8b2c66e8db33c03543d315b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] name = "socket2" -version = "0.4.2" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" dependencies = [ "libc", "winapi", @@ -1455,50 +1729,32 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" [[package]] name = "strsim" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" - -[[package]] -name = "structopt" -version = "0.3.25" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40b9788f4202aa75c240ecc9c15c65185e6a39ccdeb0fd5d008b98825464c87c" -dependencies = [ - "clap", - "lazy_static", - "structopt-derive", -] +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] -name = "structopt-derive" -version = "0.4.18" +name = "subtle" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcb5ae327f9cc13b68763b5749770cb9e048a99bd9dfdfa58d0cf05d5f64afe0" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", -] +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "1.0.78" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4eac2e6c19f5c3abc0c229bea31ff0b9b091c7b14990e8924b92902a303a0c0" +checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", ] [[package]] name = "sysinfo" -version = "0.22.3" +version = "0.26.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b645b59c59114c25d3d554f781b0a1f1f01545d1d02f271bfb1c897bdfdfdcf3" +checksum = "c375d5fd899e32847b8566e10598d6e9f1d9b55ec6de3cdf9e7da4bdc51371bc" dependencies = [ "cfg-if", "core-foundation-sys", @@ -1522,13 +1778,13 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" dependencies = [ "cfg-if", + "fastrand", "libc", - "rand", "redox_syscall", "remove_dir_all", "winapi", @@ -1536,9 +1792,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" dependencies = [ "winapi-util", ] @@ -1555,9 +1811,9 @@ dependencies = [ [[package]] name = "test-log" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb78caec569a40f42c078c798c0e35b922d9054ec28e166f0d6ac447563d91a4" +checksum = "38f0c854faeb68a048f0f2dc410c5ddae3bf83854ef0e4977d58306a5edef50e" dependencies = [ "proc-macro2", "quote", @@ -1566,27 +1822,24 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.11.0" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" -dependencies = [ - "unicode-width", -] +checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.29" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602eca064b2d83369e2b2f34b09c70b605402801927c65c11071ac911d299b88" +checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.29" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad553cc2c78e8de258400763a647e80e6d1b31ee237275d756f6836d204494c" +checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" dependencies = [ "proc-macro2", "quote", @@ -1600,15 +1853,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" dependencies = [ "libc", - "wasi", + "wasi 0.10.0+wasi-snapshot-preview1", "winapi", ] +[[package]] +name = "time" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c" +dependencies = [ + "itoa 1.0.4", + "libc", + "num_threads", + "time-macros", +] + +[[package]] +name = "time-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" + [[package]] name = "tinyvec" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83b2a3d4d9091d0abd7eba4dc2710b1718583bd4d8992e2190720ea38f391f7" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] @@ -1621,9 +1892,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.14.0" +version = "1.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144" +checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099" dependencies = [ "autocfg", "bytes", @@ -1632,45 +1903,55 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", + "socket2", "winapi", ] [[package]] name = "tokio-rustls" -version = "0.23.1" +version = "0.23.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4baa378e417d780beff82bf54ceb0d195193ea6a00c14e22359e7f39456b5689" +checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" dependencies = [ "rustls", "tokio", - "webpki 0.22.0", + "webpki", ] [[package]] name = "tokio-util" -version = "0.6.9" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0" +checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" dependencies = [ "bytes", "futures-core", "futures-sink", - "log", "pin-project-lite", "tokio", + "tracing", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", ] [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", "pin-project-lite", @@ -1679,11 +1960,11 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] @@ -1693,43 +1974,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" [[package]] -name = "unicode-bidi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085" - -[[package]] -name = "unicode-normalization" -version = "0.1.19" +name = "typenum" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] +checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" [[package]] -name = "unicode-segmentation" -version = "1.8.0" +name = "unicode-bidi" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" [[package]] -name = "unicode-width" -version = "0.1.9" +name = "unicode-ident" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973" +checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" [[package]] -name = "unicode-xid" -version = "0.2.2" +name = "unicode-normalization" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] [[package]] -name = "unindent" -version = "0.1.7" +name = "unicode-width" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f14ee04d9415b52b3aeab06258a3f07093182b88ba0f9b8d203f211a7a7d41c7" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "untrusted" @@ -1739,33 +2014,20 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] -[[package]] -name = "uuid" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" - -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "vswhom" @@ -1779,9 +2041,9 @@ dependencies = [ [[package]] name = "vswhom-sys" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f5402d3d0e79a069714f7b48e3ecc60be7775a2c049cb839457457a239532" +checksum = "22025f6d8eb903ebf920ea6933b70b1e495be37e2cb4099e62c80454aaf57c39" dependencies = [ "cc", "libc", @@ -1803,11 +2065,17 @@ version = "0.10.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -1815,13 +2083,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", "syn", @@ -1830,9 +2098,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" dependencies = [ "cfg-if", "js-sys", @@ -1842,9 +2110,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1852,9 +2120,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" dependencies = [ "proc-macro2", "quote", @@ -1865,30 +2133,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e38c0608262c46d4a56202ebabdeb094cef7e560ca7a226c6bf055188aa4ea" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki" version = "0.22.0" @@ -1901,11 +2159,11 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "0.21.1" +version = "0.22.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabe153544e473b775453675851ecc86863d2a81d786d741f6b76778f2a48940" +checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be" dependencies = [ - "webpki 0.21.4", + "webpki", ] [[package]] @@ -1940,14 +2198,48 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "winreg" -version = "0.7.0" +name = "windows-sys" +version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" dependencies = [ - "winapi", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", ] +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + [[package]] name = "winreg" version = "0.10.1" @@ -1959,18 +2251,18 @@ dependencies = [ [[package]] name = "xattr" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "244c3741f4240ef46274860397c7c74e50eb23624996930e484c16679633a54c" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" dependencies = [ "libc", ] [[package]] name = "xz2" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c" +checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2" dependencies = [ "lzma-sys", ] @@ -1984,16 +2276,57 @@ dependencies = [ "linked-hash-map", ] +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + [[package]] name = "zip" -version = "0.5.13" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93ab48844d61251bb3835145c521d88aa4031d7139e8485990f60ca911fa0815" +checksum = "537ce7411d25e54e8ae21a7ce0b15840e7bfcff15b51d697ec3266cc76bdf080" dependencies = [ + "aes", "byteorder", "bzip2", + "constant_time_eq", "crc32fast", + "crossbeam-utils", "flate2", - "thiserror", - "time", + "hmac", + "pbkdf2", + "sha1", + "time 0.3.15", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.1+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd07cbbc53846d9145dbffdf6dd09a7a0aa52be46741825f5c97bdd4f73f12b" +dependencies = [ + "cc", + "libc", ] diff --git a/Cargo.toml b/Cargo.toml index 8c5ea1d..43ac4fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fnm" -version = "1.28.2" +version = "1.31.1" authors = ["Gal Schlezinger "] edition = "2021" build = "build.rs" @@ -9,38 +9,39 @@ repository = "https://github.com/Schniz/fnm" description = "Fast and simple Node.js version manager" [dependencies] -serde = { version = "1.0.132", features = ["derive"] } -clap = "2.34.0" -structopt = "0.3.25" -serde_json = "1.0.73" -chrono = { version = "0.4.19", features = ["serde"] } +serde = { version = "1.0.145", features = ["derive"] } +clap = { version = "3.2.23", features = ["derive", "env"] } +serde_json = "1.0.85" +chrono = { version = "0.4.23", features = ["serde"] } tar = "0.4.38" -xz2 = "0.1.6" -semver = "1.0.4" +xz2 = "0.1.7" +semver = "1.0.14" dirs = "4.0.0" colored = "2.0.0" -zip = "0.5.13" -tempfile = "3.2.0" -indoc = "1.0.3" -snafu = { version = "0.6.10", features = ["backtrace"] } -log = "0.4.14" -env_logger = "0.9.0" +zip = "0.6.3" +tempfile = "3.3.0" +indoc = "1.0.7" +log = "0.4.17" +env_logger = "0.9.3" atty = "0.2.14" encoding_rs_io = "0.1.7" -reqwest = { version = "0.11.7", features = ["blocking", "json", "rustls-tls", "brotli"], default-features = false } -url = "2.2.2" -sysinfo = "0.22.3" +reqwest = { version = "0.11.12", features = ["blocking", "json", "rustls-tls", "rustls-tls-native-roots", "brotli"], default-features = false } +url = "2.3.1" +sysinfo = "0.26.7" +thiserror = "1.0.37" +clap_complete = "3.2.5" +anyhow = "1.0.65" [dev-dependencies] -pretty_assertions = "1.0.0" +pretty_assertions = "1.3.0" duct = "0.13.5" shell-escape = "0.1.5" -insta = { version = "1.8.0", features = ["backtrace"] } -serial_test = "0.5.1" -test-log = "0.2.8" +insta = "1.21.0" +serial_test = "0.9.0" +test-log = "0.2.11" [build-dependencies] -embed-resource = "1.6.5" +embed-resource = "1.7.3" [target.'cfg(windows)'.dependencies] csv = "1.1.6" diff --git a/README.md b/README.md index a5d70f9..d1b2464 100644 --- a/README.md +++ b/README.md @@ -18,13 +18,15 @@ :rocket: Built with speed in mind -:thinking: Works with `.node-version` and `.nvmrc` files +:open_file_folder: Works with `.node-version` and `.nvmrc` files ## Installation ### Using a script (macOS/Linux) -For `bash`, `zsh` and `fish` shells, there's an [automatic installation script](./.ci/install.sh): +For `bash`, `zsh` and `fish` shells, there's an [automatic installation script](./.ci/install.sh). + +First ensure that `curl` and `unzip` are already installed on you operating system. Then execute: ```sh curl -fsSL https://fnm.vercel.app/install | bash @@ -118,31 +120,41 @@ Please follow your shell instructions to install them. ### Shell Setup -fnm needs to run some shell commands before you can start using it. -This is done by evaluating the output of `fnm env`. Check out the following guides for the shell you use: +Environment variables need to be setup before you can start using fnm. +This is done by evaluating the output of `fnm env`. +To automatically run `fnm use` when a directory contains a `.node-version` or `.nvmrc` file, add the `--use-on-cd` option to your shell setup. + +Adding a `.node-version` to your project is as simple as: +```bash +$ node --version +v14.18.3 +$ node --version > .node-version +``` + +Check out the following guides for the shell you use: #### Bash -add the following to your `.bashrc` profile: +Add the following to your `.bashrc` profile: ```bash -eval "$(fnm env)" +eval "$(fnm env --use-on-cd)" ``` #### Zsh -add the following to your `.zshrc` profile: +Add the following to your `.zshrc` profile: ```zsh -eval "$(fnm env)" +eval "$(fnm env --use-on-cd)" ``` #### Fish shell -create `~/.config/fish/conf.d/fnm.fish` add this line to it: +Create `~/.config/fish/conf.d/fnm.fish` add this line to it: ```fish -fnm env | source +fnm env --use-on-cd | source ``` #### PowerShell @@ -167,7 +179,7 @@ FOR /f "tokens=*" %i IN ('fnm env --use-on-cd') DO CALL %i #### Usage with Cmder -Usage is very similar to the normal WinCMD install, apart for a few tweaks to allow being called from the cmder startup script. The example **assumes** that the `CMDER_ROOT` environment variable is **set** to the **root directory** of your Cmder installation. +Usage is very similar to the normal WinCMD install, apart for a few tweaks to allow being called from the cmder startup script. The example **assumes** that the `CMDER_ROOT` environment variable is **set** to the **root directory** of your Cmder installation. Then you can do something like this: - Make a .cmd file to invoke it diff --git a/docs/commands.md b/docs/commands.md index c38ec14..011df78 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -1,225 +1,378 @@ # `fnm` ``` -fnm 1.28.2 +fnm 1.31.1 A fast and simple Node.js manager USAGE: fnm [OPTIONS] -FLAGS: +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + -h, --help - Prints help information + Print help information + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] -V, --version - Prints version information + Print version information + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. -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] + * `local`: Use the local version of Node defined within the current directory - --log-level - The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] 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] - unalias Remove an alias definition - uninstall Uninstall a Node.js version - use Change Node.js version + 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 + Print 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] + unalias + Remove an alias definition + uninstall + Uninstall a Node.js version + use + Change Node.js version ``` # `fnm alias` ``` -fnm-alias 1.28.2 +fnm-alias Alias a version to a common name USAGE: - fnm alias [OPTIONS] + fnm alias [OPTIONS] + +ARGS: + + + + -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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + [env: FNM_ARCH] -ARGS: - - + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + + -h, --help + Print help information + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm completions` ``` -fnm-completions 1.28.2 +fnm-completions 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] [possible values: quiet, info, all, - error] - --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] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + + -h, --help + Print help information + + --log-level + The log level of fnm commands + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --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 + + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm current` ``` -fnm-current 1.28.2 +fnm-current 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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + -h, --help + Print help information + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm default` ``` -fnm-default 1.28.2 +fnm-default Set a version as the default version This is a shorthand for `fnm alias VERSION default` USAGE: - fnm default [OPTIONS] + fnm default [OPTIONS] + +ARGS: + + + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] -FLAGS: -h, --help - Prints help information + Print help information - -V, --version - Prints version information + --log-level + The log level of fnm commands + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] -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] + --node-dist-mirror + https://nodejs.org/dist/ mirror - --log-level - The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. -ARGS: - + * `local`: Use the local version of Node defined within the current directory + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm env` ``` -fnm-env 1.28.2 +fnm-env 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. +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` +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] + fnm env [OPTIONS] + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] -FLAGS: -h, --help - Prints help information + Print help information + + --json + Print JSON instead of shell commands + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --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] --use-on-cd Print the script to change Node versions every directory change - -V, --version - Prints version information + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. +<<<<<<< HEAD --with-shims Adds `node` shims to your PATH environment variable to allow you to use `node` commands in your shell without rehashing +======= + * `local`: Use the local version of Node defined within the current directory +>>>>>>> origin/master -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] [possible values: quiet, info, all, - error] - --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] + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm exec` ``` -fnm-exec 1.28.2 +fnm-exec Run a command within fnm context Example: @@ -228,37 +381,54 @@ fnm exec --using=v12.0.0 node --version => v12.0.0 USAGE: - fnm exec [OPTIONS] [arguments]... + fnm exec [OPTIONS] [ARGUMENTS]... + +ARGS: + ... + The command to run + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] -FLAGS: -h, --help - Prints help information + Print help information - -V, --version - Prints version information + --log-level + The log level of fnm commands + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] -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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] - - --using + --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 + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. -ARGS: - ... - The command to run + * `local`: Use the local version of Node defined within the current directory + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm help` @@ -270,180 +440,328 @@ ARGS: # `fnm install` ``` -fnm-install 1.28.2 +fnm-install Install a new Node.js version USAGE: - fnm install [FLAGS] [OPTIONS] [version] + fnm install [OPTIONS] [VERSION] -FLAGS: - -h, --help Prints help information - --lts Install latest LTS - -V, --version Prints version information +ARGS: + + A version string. Can be a partial semver or a LTS version name by the format lts/NAME 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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + [env: FNM_ARCH] -ARGS: - A version string. Can be a partial semver or a LTS version name by the format lts/NAME + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + + -h, --help + Print help information + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --lts + Install latest LTS + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm list` ``` -fnm-list 1.28.2 +fnm-list 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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + + -h, --help + Print help information + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm list-remote` ``` -fnm-list-remote 1.28.2 +fnm-list-remote List all remote Node.js versions USAGE: fnm list-remote [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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + + -h, --help + Print help information + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm unalias` ``` -fnm-unalias 1.28.2 +fnm-unalias Remove an alias definition USAGE: - fnm unalias [OPTIONS] + fnm unalias [OPTIONS] + +ARGS: + -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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + [env: FNM_ARCH] -ARGS: - + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + + -h, --help + Print help information + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm uninstall` ``` -fnm-uninstall 1.28.2 +fnm-uninstall 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. +> 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] + fnm uninstall [OPTIONS] [VERSION] + +ARGS: + + + +OPTIONS: + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + + [env: FNM_ARCH] + + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] -FLAGS: -h, --help - Prints help information + Print help information - -V, --version - Prints version information + --log-level + The log level of fnm commands + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] -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] + --node-dist-mirror + https://nodejs.org/dist/ mirror - --log-level - The log level of fnm commands [env: FNM_LOGLEVEL] [default: info] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. -ARGS: - + * `local`: Use the local version of Node defined within the current directory + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` # `fnm use` ``` -fnm-use 1.28.2 +fnm-use Change Node.js version USAGE: - fnm use [FLAGS] [OPTIONS] [version] + fnm use [OPTIONS] [VERSION] + +ARGS: + -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] [possible values: quiet, info, all, - error] - --node-dist-mirror - https://nodejs.org/dist/ mirror [env: FNM_NODE_DIST_MIRROR] [default: https://nodejs.org/dist] + --arch + Override the architecture of the installed Node binary. Defaults to arch of fnm binary + [env: FNM_ARCH] -ARGS: - + --fnm-dir + The root directory of fnm installations + + [env: FNM_DIR] + + -h, --help + Print help information + + --install-if-missing + Install the version if it isn't installed yet + + --log-level + The log level of fnm commands + + [env: FNM_LOGLEVEL] + [default: info] + [possible values: quiet, info, all, error] + + --node-dist-mirror + https://nodejs.org/dist/ mirror + + [env: FNM_NODE_DIST_MIRROR] + [default: https://nodejs.org/dist] + + --silent-if-unchanged + Don't output a message identifying the version being used if it will not change due to + execution of this command + + --version-file-strategy + A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` + is called without a version, or when `--use-on-cd` is configured on evaluation. + + * `local`: Use the local version of Node defined within the current directory + + * `recursive`: Use the version of Node defined within the current directory and all + parent directories + + [env: FNM_VERSION_FILE_STRATEGY] + [default: local] + [possible values: local, recursive] ``` diff --git a/docs/fnm.svg b/docs/fnm.svg index 450b438..aac1bc0 100644 --- a/docs/fnm.svg +++ b/docs/fnm.svg @@ -1 +1 @@ -✑✑eval✑eval"$(fnm✑eval"$(fnmenv)"✑f✑fn✑fnm✑fnm--versionfnm1.28.2✑cat✑cat.node-version16.13.0✑fnminstallInstallingNodev16.13.0(x64)✑fnmuseUsingNodev16.13.0✑node✑node-vv16.13.0✑e✑ev✑eva✑eval"✑eval"$✑eval"$(✑eval"$(f✑eval"$(fn✑eval"$(fnme✑eval"$(fnmen✑eval"$(fnmenv✑eval"$(fnmenv)✑fnm--✑fnm--v✑fnm--ve✑fnm--ver✑fnm--vers✑fnm--versio✑c✑ca✑cat.n✑cat.no✑cat.nod✑cat.node✑cat.node-✑cat.node-ve✑cat.node-ver✑cat.node-vers✑cat.node-versi✑cat.node-versio✑fnmi✑fnmin✑fnmins✑fnminst✑fnminsta✑fnmus✑n✑no✑nod✑node- \ No newline at end of file +✑✑eval✑eval"$(fnm✑eval"$(fnmenv)"✑f✑fn✑fnm✑fnm--versionfnm1.31.1✑cat✑cat.node-version16.15.1✑fnminstallInstallingNodev16.15.1(x64)✑fnmuseUsingNodev16.15.1✑node✑node-vv16.15.1✑e✑ev✑eva✑eval"✑eval"$✑eval"$(✑eval"$(f✑eval"$(fn✑eval"$(fnme✑eval"$(fnmen✑eval"$(fnmenv✑eval"$(fnmenv)✑fnm-✑fnm--✑fnm--v✑fnm--ve✑fnm--ver✑fnm--vers✑fnm--versi✑fnm--versio✑c✑ca✑cat.✑cat.n✑cat.no✑cat.nod✑cat.node✑cat.node-✑cat.node-v✑cat.node-ve✑cat.node-ver✑cat.node-vers✑cat.node-versi✑cat.node-versio✑fnmi✑fnmin✑fnmins✑fnminst✑fnminsta✑fnminstal✑fnmu✑fnmus✑n✑no✑nod✑node- \ No newline at end of file diff --git a/e2e/__snapshots__/aliases.test.ts.snap b/e2e/__snapshots__/aliases.test.ts.snap new file mode 100644 index 0000000..a78878f --- /dev/null +++ b/e2e/__snapshots__/aliases.test.ts.snap @@ -0,0 +1,269 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash aliasing versions: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +((fnm ls) | grep 8.11.3 || (echo "Expected output to contain 8.11.3" && exit 1)) | grep oldie || (echo "Expected output to contain oldie" && exit 1) +((fnm ls) | grep 6.11.3 || (echo "Expected output to contain 6.11.3" && exit 1)) | grep older || (echo "Expected output to contain older" && exit 1) +fnm use older +if [ "$(node --version)" != "v6.11.3" ]; then + echo "Expected node version to be v6.11.3. Got $(node --version)" + exit 1 +fi +fnm use oldie +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi +fnm use default +if [ "$(node --version)" != "v6.11.3" ]; then + echo "Expected node version to be v6.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Bash allows to install an lts if version missing: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm use --install-if-missing +(fnm ls) | grep lts-latest || (echo "Expected output to contain lts-latest" && exit 1)" +`; + +exports[`Bash can alias the system node: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm alias system my_system +(fnm ls) | grep my_system || (echo "Expected output to contain my_system" && exit 1) +fnm alias system default +fnm alias my_system my_system2 +(fnm ls) | grep my_system2 || (echo "Expected output to contain my_system2" && exit 1) +(fnm use my_system) | grep 'Bypassing fnm' || (echo "Expected output to contain 'Bypassing fnm'" && exit 1) +fnm unalias my_system +(fnm use my_system 2>&1) | grep 'Requested version my_system is not currently installed' || (echo "Expected output to contain 'Requested version my_system is not currently installed'" && exit 1)" +`; + +exports[`Bash errors when alias is not found: Bash 1`] = ` +"set -e +eval "$(fnm env --log-level=error)" +(fnm use 2>&1) | grep 'Requested version lts-latest is not' || (echo "Expected output to contain 'Requested version lts-latest is not'" && exit 1)" +`; + +exports[`Bash unalias a version: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +(fnm ls) | grep version8 || (echo "Expected output to contain version8" && exit 1) +fnm unalias version8 +(fnm use version8 2>&1) | grep 'Requested version version8 is not currently installed' || (echo "Expected output to contain 'Requested version version8 is not currently installed'" && exit 1)" +`; + +exports[`Bash unalias errors if alias not found: Bash 1`] = ` +"set -e +eval "$(fnm env --log-level=error)" +(fnm unalias lts 2>&1) | grep 'Requested alias lts not found' || (echo "Expected output to contain 'Requested alias lts not found'" && exit 1)" +`; + +exports[`Fish aliasing versions: Fish 1`] = ` +"fnm env | source +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +begin; begin; fnm ls; end | grep 8.11.3; or echo "Expected output to contain 8.11.3" && exit 1; end | grep oldie; or echo "Expected output to contain oldie" && exit 1 +begin; begin; fnm ls; end | grep 6.11.3; or echo "Expected output to contain 6.11.3" && exit 1; end | grep older; or echo "Expected output to contain older" && exit 1 +fnm use older +set ____test____ (node --version) +if test "$____test____" != "v6.11.3" + echo "Expected node version to be v6.11.3. Got $____test____" + exit 1 +end +fnm use oldie +set ____test____ (node --version) +if test "$____test____" != "v8.11.3" + echo "Expected node version to be v8.11.3. Got $____test____" + exit 1 +end +fnm use default +set ____test____ (node --version) +if test "$____test____" != "v6.11.3" + echo "Expected node version to be v6.11.3. Got $____test____" + exit 1 +end" +`; + +exports[`Fish allows to install an lts if version missing: Fish 1`] = ` +"fnm env | source +fnm use --install-if-missing +begin; fnm ls; end | grep lts-latest; or echo "Expected output to contain lts-latest" && exit 1" +`; + +exports[`Fish can alias the system node: Fish 1`] = ` +"fnm env | source +fnm alias system my_system +begin; fnm ls; end | grep my_system; or echo "Expected output to contain my_system" && exit 1 +fnm alias system default +fnm alias my_system my_system2 +begin; fnm ls; end | grep my_system2; or echo "Expected output to contain my_system2" && exit 1 +begin; fnm use my_system; end | grep 'Bypassing fnm'; or echo "Expected output to contain 'Bypassing fnm'" && exit 1 +fnm unalias my_system +begin; fnm use my_system 2>&1; end | grep 'Requested version my_system is not currently installed'; or echo "Expected output to contain 'Requested version my_system is not currently installed'" && exit 1" +`; + +exports[`Fish errors when alias is not found: Fish 1`] = ` +"fnm env --log-level=error | source +begin; fnm use 2>&1; end | grep 'Requested version lts-latest is not'; or echo "Expected output to contain 'Requested version lts-latest is not'" && exit 1" +`; + +exports[`Fish unalias a version: Fish 1`] = ` +"fnm env | source +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +begin; fnm ls; end | grep version8; or echo "Expected output to contain version8" && exit 1 +fnm unalias version8 +begin; fnm use version8 2>&1; end | grep 'Requested version version8 is not currently installed'; or echo "Expected output to contain 'Requested version version8 is not currently installed'" && exit 1" +`; + +exports[`Fish unalias errors if alias not found: Fish 1`] = ` +"fnm env --log-level=error | source +begin; fnm unalias lts 2>&1; end | grep 'Requested alias lts not found'; or echo "Expected output to contain 'Requested alias lts not found'" && exit 1" +`; + +exports[`PowerShell aliasing versions: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +$($__out__ = $($($__out__ = $(fnm ls | Select-String 8.11.3); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) | Select-String oldie); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +$($__out__ = $($($__out__ = $(fnm ls | Select-String 6.11.3); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) | Select-String older); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +fnm use older +if ( "$(node --version)" -ne "v6.11.3" ) { echo "Expected node version to be v6.11.3. Got $(node --version)"; exit 1 } +fnm use oldie +if ( "$(node --version)" -ne "v8.11.3" ) { echo "Expected node version to be v8.11.3. Got $(node --version)"; exit 1 } +fnm use default +if ( "$(node --version)" -ne "v6.11.3" ) { echo "Expected node version to be v6.11.3. Got $(node --version)"; exit 1 }" +`; + +exports[`PowerShell allows to install an lts if version missing: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm use --install-if-missing +$($__out__ = $(fnm ls | Select-String lts-latest); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`PowerShell can alias the system node: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm alias system my_system +$($__out__ = $(fnm ls | Select-String my_system); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +fnm alias system default +fnm alias my_system my_system2 +$($__out__ = $(fnm ls | Select-String my_system2); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +$($__out__ = $(fnm use my_system | Select-String 'Bypassing fnm'); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +fnm unalias my_system +$($__out__ = $(fnm use my_system 2>&1 | Select-String 'Requested version my_system is not currently installed'); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`PowerShell errors when alias is not found: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --log-level=error | Out-String | Invoke-Expression +$($__out__ = $(fnm use 2>&1 | Select-String 'Requested version lts-latest is not'); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`PowerShell unalias a version: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +$($__out__ = $(fnm ls | Select-String version8); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +fnm unalias version8 +$($__out__ = $(fnm use version8 2>&1 | Select-String 'Requested version version8 is not currently installed'); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`PowerShell unalias errors if alias not found: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --log-level=error | Out-String | Invoke-Expression +$($__out__ = $(fnm unalias lts 2>&1 | Select-String 'Requested alias lts not found'); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`Zsh aliasing versions: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install 6.11.3 +fnm install 8.11.3 +fnm alias 8.11 oldie +fnm alias 6 older +fnm default older +((fnm ls) | grep 8.11.3 || (echo "Expected output to contain 8.11.3" && exit 1)) | grep oldie || (echo "Expected output to contain oldie" && exit 1) +((fnm ls) | grep 6.11.3 || (echo "Expected output to contain 6.11.3" && exit 1)) | grep older || (echo "Expected output to contain older" && exit 1) +fnm use older +if [ "$(node --version)" != "v6.11.3" ]; then + echo "Expected node version to be v6.11.3. Got $(node --version)" + exit 1 +fi +fnm use oldie +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi +fnm use default +if [ "$(node --version)" != "v6.11.3" ]; then + echo "Expected node version to be v6.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Zsh allows to install an lts if version missing: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm use --install-if-missing +(fnm ls) | grep lts-latest || (echo "Expected output to contain lts-latest" && exit 1)" +`; + +exports[`Zsh can alias the system node: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm alias system my_system +(fnm ls) | grep my_system || (echo "Expected output to contain my_system" && exit 1) +fnm alias system default +fnm alias my_system my_system2 +(fnm ls) | grep my_system2 || (echo "Expected output to contain my_system2" && exit 1) +(fnm use my_system) | grep 'Bypassing fnm' || (echo "Expected output to contain 'Bypassing fnm'" && exit 1) +fnm unalias my_system +(fnm use my_system 2>&1) | grep 'Requested version my_system is not currently installed' || (echo "Expected output to contain 'Requested version my_system is not currently installed'" && exit 1)" +`; + +exports[`Zsh errors when alias is not found: Zsh 1`] = ` +"set -e +eval "$(fnm env --log-level=error)" +(fnm use 2>&1) | grep 'Requested version lts-latest is not' || (echo "Expected output to contain 'Requested version lts-latest is not'" && exit 1)" +`; + +exports[`Zsh unalias a version: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install 11.10.0 +fnm install 8.11.3 +fnm alias 8.11.3 version8 +(fnm ls) | grep version8 || (echo "Expected output to contain version8" && exit 1) +fnm unalias version8 +(fnm use version8 2>&1) | grep 'Requested version version8 is not currently installed' || (echo "Expected output to contain 'Requested version version8 is not currently installed'" && exit 1)" +`; + +exports[`Zsh unalias errors if alias not found: Zsh 1`] = ` +"set -e +eval "$(fnm env --log-level=error)" +(fnm unalias lts 2>&1) | grep 'Requested alias lts not found' || (echo "Expected output to contain 'Requested alias lts not found'" && exit 1)" +`; diff --git a/e2e/__snapshots__/basic.test.ts.snap b/e2e/__snapshots__/basic.test.ts.snap new file mode 100644 index 0000000..bfc43fc --- /dev/null +++ b/e2e/__snapshots__/basic.test.ts.snap @@ -0,0 +1,284 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash .node-version: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Bash .nvmrc: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Bash \`fnm ls\` with nothing installed: Bash 1`] = ` +"set -e +eval "$(fnm env)" +if [ "$(fnm ls)" != "* system" ]; then + echo "Expected fnm ls to be * system. Got $(fnm ls)" + exit 1 +fi" +`; + +exports[`Bash basic usage: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install v8.11.3 +fnm use v8.11.3 +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Bash resolves partial semver: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install 6 +fnm use 6 +if [ "$(node --version)" != "v6.17.1" ]; then + echo "Expected node version to be v6.17.1. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Bash use on cd: Bash 1`] = ` +"set -e +eval "$(fnm env --use-on-cd)" +fnm install v8.11.3 +fnm install v12.22.12 +cd subdir +if [ "$(node --version)" != "v12.22.12" ]; then + echo "Expected node version to be v12.22.12. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Bash when .node-version and .nvmrc are in sync, it throws no error: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +if [ "$(node --version)" != "v11.10.0" ]; then + echo "Expected node version to be v11.10.0. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Fish .node-version: Fish 1`] = ` +"fnm env | source +fnm install +fnm use +set ____test____ (node --version) +if test "$____test____" != "v8.11.3" + echo "Expected node version to be v8.11.3. Got $____test____" + exit 1 +end" +`; + +exports[`Fish .nvmrc: Fish 1`] = ` +"fnm env | source +fnm install +fnm use +set ____test____ (node --version) +if test "$____test____" != "v8.11.3" + echo "Expected node version to be v8.11.3. Got $____test____" + exit 1 +end" +`; + +exports[`Fish \`fnm ls\` with nothing installed: Fish 1`] = ` +"fnm env | source +set ____test____ (fnm ls) +if test "$____test____" != "* system" + echo "Expected fnm ls to be * system. Got $____test____" + exit 1 +end" +`; + +exports[`Fish basic usage: Fish 1`] = ` +"fnm env | source +fnm install v8.11.3 +fnm use v8.11.3 +set ____test____ (node --version) +if test "$____test____" != "v8.11.3" + echo "Expected node version to be v8.11.3. Got $____test____" + exit 1 +end" +`; + +exports[`Fish resolves partial semver: Fish 1`] = ` +"fnm env | source +fnm install 6 +fnm use 6 +set ____test____ (node --version) +if test "$____test____" != "v6.17.1" + echo "Expected node version to be v6.17.1. Got $____test____" + exit 1 +end" +`; + +exports[`Fish use on cd: Fish 1`] = ` +"fnm env --use-on-cd | source +fnm install v8.11.3 +fnm install v12.22.12 +cd subdir +set ____test____ (node --version) +if test "$____test____" != "v12.22.12" + echo "Expected node version to be v12.22.12. Got $____test____" + exit 1 +end" +`; + +exports[`Fish when .node-version and .nvmrc are in sync, it throws no error: Fish 1`] = ` +"fnm env | source +fnm install +fnm use +set ____test____ (node --version) +if test "$____test____" != "v11.10.0" + echo "Expected node version to be v11.10.0. Got $____test____" + exit 1 +end" +`; + +exports[`PowerShell .node-version: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install +fnm use +if ( "$(node --version)" -ne "v8.11.3" ) { echo "Expected node version to be v8.11.3. Got $(node --version)"; exit 1 }" +`; + +exports[`PowerShell .nvmrc: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install +fnm use +if ( "$(node --version)" -ne "v8.11.3" ) { echo "Expected node version to be v8.11.3. Got $(node --version)"; exit 1 }" +`; + +exports[`PowerShell \`fnm ls\` with nothing installed: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +if ( "$(fnm ls)" -ne "* system" ) { echo "Expected fnm ls to be * system. Got $(fnm ls)"; exit 1 }" +`; + +exports[`PowerShell basic usage: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install v8.11.3 +fnm use v8.11.3 +if ( "$(node --version)" -ne "v8.11.3" ) { echo "Expected node version to be v8.11.3. Got $(node --version)"; exit 1 }" +`; + +exports[`PowerShell resolves partial semver: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install 6 +fnm use 6 +if ( "$(node --version)" -ne "v6.17.1" ) { echo "Expected node version to be v6.17.1. Got $(node --version)"; exit 1 }" +`; + +exports[`PowerShell use on cd: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --use-on-cd | Out-String | Invoke-Expression +fnm install v8.11.3 +fnm install v12.22.12 +cd subdir +if ( "$(node --version)" -ne "v12.22.12" ) { echo "Expected node version to be v12.22.12. Got $(node --version)"; exit 1 }" +`; + +exports[`PowerShell when .node-version and .nvmrc are in sync, it throws no error: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install +fnm use +if ( "$(node --version)" -ne "v11.10.0" ) { echo "Expected node version to be v11.10.0. Got $(node --version)"; exit 1 }" +`; + +exports[`Zsh .node-version: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Zsh .nvmrc: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Zsh \`fnm ls\` with nothing installed: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +if [ "$(fnm ls)" != "* system" ]; then + echo "Expected fnm ls to be * system. Got $(fnm ls)" + exit 1 +fi" +`; + +exports[`Zsh basic usage: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install v8.11.3 +fnm use v8.11.3 +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Zsh resolves partial semver: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install 6 +fnm use 6 +if [ "$(node --version)" != "v6.17.1" ]; then + echo "Expected node version to be v6.17.1. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Zsh use on cd: Zsh 1`] = ` +"set -e +eval "$(fnm env --use-on-cd)" +fnm install v8.11.3 +fnm install v12.22.12 +cd subdir +if [ "$(node --version)" != "v12.22.12" ]; then + echo "Expected node version to be v12.22.12. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Zsh when .node-version and .nvmrc are in sync, it throws no error: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +if [ "$(node --version)" != "v11.10.0" ]; then + echo "Expected node version to be v11.10.0. Got $(node --version)" + exit 1 +fi" +`; diff --git a/e2e/__snapshots__/current.test.ts.snap b/e2e/__snapshots__/current.test.ts.snap new file mode 100644 index 0000000..5ec9313 --- /dev/null +++ b/e2e/__snapshots__/current.test.ts.snap @@ -0,0 +1,96 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash current returns the current Node.js version set in fnm: Bash 1`] = ` +"set -e +eval "$(fnm env)" +if [ "$(fnm current)" != "none" ]; then + echo "Expected currently activated version to be none. Got $(fnm current)" + exit 1 +fi +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +if [ "$(fnm current)" != "v8.11.3" ]; then + echo "Expected currently activated version to be v8.11.3. Got $(fnm current)" + exit 1 +fi +fnm use v10.10.0 +if [ "$(fnm current)" != "v10.10.0" ]; then + echo "Expected currently activated version to be v10.10.0. Got $(fnm current)" + exit 1 +fi +fnm use system +if [ "$(fnm current)" != "system" ]; then + echo "Expected currently activated version to be system. Got $(fnm current)" + exit 1 +fi" +`; + +exports[`Fish current returns the current Node.js version set in fnm: Fish 1`] = ` +"fnm env | source +set ____test____ (fnm current) +if test "$____test____" != "none" + echo "Expected currently activated version to be none. Got $____test____" + exit 1 +end +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +set ____test____ (fnm current) +if test "$____test____" != "v8.11.3" + echo "Expected currently activated version to be v8.11.3. Got $____test____" + exit 1 +end +fnm use v10.10.0 +set ____test____ (fnm current) +if test "$____test____" != "v10.10.0" + echo "Expected currently activated version to be v10.10.0. Got $____test____" + exit 1 +end +fnm use system +set ____test____ (fnm current) +if test "$____test____" != "system" + echo "Expected currently activated version to be system. Got $____test____" + exit 1 +end" +`; + +exports[`PowerShell current returns the current Node.js version set in fnm: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +if ( "$(fnm current)" -ne "none" ) { echo "Expected currently activated version to be none. Got $(fnm current)"; exit 1 } +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +if ( "$(fnm current)" -ne "v8.11.3" ) { echo "Expected currently activated version to be v8.11.3. Got $(fnm current)"; exit 1 } +fnm use v10.10.0 +if ( "$(fnm current)" -ne "v10.10.0" ) { echo "Expected currently activated version to be v10.10.0. Got $(fnm current)"; exit 1 } +fnm use system +if ( "$(fnm current)" -ne "system" ) { echo "Expected currently activated version to be system. Got $(fnm current)"; exit 1 }" +`; + +exports[`Zsh current returns the current Node.js version set in fnm: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +if [ "$(fnm current)" != "none" ]; then + echo "Expected currently activated version to be none. Got $(fnm current)" + exit 1 +fi +fnm install v8.11.3 +fnm install v10.10.0 +fnm use v8.11.3 +if [ "$(fnm current)" != "v8.11.3" ]; then + echo "Expected currently activated version to be v8.11.3. Got $(fnm current)" + exit 1 +fi +fnm use v10.10.0 +if [ "$(fnm current)" != "v10.10.0" ]; then + echo "Expected currently activated version to be v10.10.0. Got $(fnm current)" + exit 1 +fi +fnm use system +if [ "$(fnm current)" != "system" ]; then + echo "Expected currently activated version to be system. Got $(fnm current)" + exit 1 +fi" +`; diff --git a/e2e/__snapshots__/env.test.ts.snap b/e2e/__snapshots__/env.test.ts.snap new file mode 100644 index 0000000..1ad8405 --- /dev/null +++ b/e2e/__snapshots__/env.test.ts.snap @@ -0,0 +1,18 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash outputs json: Bash 1`] = ` +"set -e +fnm env --json > file.json" +`; + +exports[`Fish outputs json: Fish 1`] = `"fnm env --json > file.json"`; + +exports[`PowerShell outputs json: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --json | Out-File file.json -Encoding UTF8" +`; + +exports[`Zsh outputs json: Zsh 1`] = ` +"set -e +fnm env --json > file.json" +`; diff --git a/e2e/__snapshots__/exec.test.ts.snap b/e2e/__snapshots__/exec.test.ts.snap new file mode 100644 index 0000000..1a2941f --- /dev/null +++ b/e2e/__snapshots__/exec.test.ts.snap @@ -0,0 +1,70 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash \`exec\` usage: Bash 1`] = ` +"set -e +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +if [ "$(fnm exec -- node -v)" != "v8.10.0" ]; then + echo "Expected version file exec to be v8.10.0. Got $(fnm exec -- node -v)" + exit 1 +fi +if [ "$(fnm exec --using=6 -- node -v)" != "v6.10.0" ]; then + echo "Expected exec:6 node -v to be v6.10.0. Got $(fnm exec --using=6 -- node -v)" + exit 1 +fi +if [ "$(fnm exec --using=10 -- node -v)" != "v10.10.0" ]; then + echo "Expected exec:6 node -v to be v10.10.0. Got $(fnm exec --using=10 -- node -v)" + exit 1 +fi" +`; + +exports[`Fish \`exec\` usage: Fish 1`] = ` +"fnm install +fnm install v6.10.0 +fnm install v10.10.0 +set ____test____ (fnm exec -- node -v) +if test "$____test____" != "v8.10.0" + echo "Expected version file exec to be v8.10.0. Got $____test____" + exit 1 +end +set ____test____ (fnm exec --using=6 -- node -v) +if test "$____test____" != "v6.10.0" + echo "Expected exec:6 node -v to be v6.10.0. Got $____test____" + exit 1 +end +set ____test____ (fnm exec --using=10 -- node -v) +if test "$____test____" != "v10.10.0" + echo "Expected exec:6 node -v to be v10.10.0. Got $____test____" + exit 1 +end" +`; + +exports[`PowerShell \`exec\` usage: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +if ( "$(fnm exec -- node -v)" -ne "v8.10.0" ) { echo "Expected version file exec to be v8.10.0. Got $(fnm exec -- node -v)"; exit 1 } +if ( "$(fnm exec --using=6 -- node -v)" -ne "v6.10.0" ) { echo "Expected exec:6 node -v to be v6.10.0. Got $(fnm exec --using=6 -- node -v)"; exit 1 } +if ( "$(fnm exec --using=10 -- node -v)" -ne "v10.10.0" ) { echo "Expected exec:6 node -v to be v10.10.0. Got $(fnm exec --using=10 -- node -v)"; exit 1 }" +`; + +exports[`Zsh \`exec\` usage: Zsh 1`] = ` +"set -e +fnm install +fnm install v6.10.0 +fnm install v10.10.0 +if [ "$(fnm exec -- node -v)" != "v8.10.0" ]; then + echo "Expected version file exec to be v8.10.0. Got $(fnm exec -- node -v)" + exit 1 +fi +if [ "$(fnm exec --using=6 -- node -v)" != "v6.10.0" ]; then + echo "Expected exec:6 node -v to be v6.10.0. Got $(fnm exec --using=6 -- node -v)" + exit 1 +fi +if [ "$(fnm exec --using=10 -- node -v)" != "v10.10.0" ]; then + echo "Expected exec:6 node -v to be v10.10.0. Got $(fnm exec --using=10 -- node -v)" + exit 1 +fi" +`; diff --git a/e2e/__snapshots__/existing-installation.test.ts.snap b/e2e/__snapshots__/existing-installation.test.ts.snap new file mode 100644 index 0000000..ae785ac --- /dev/null +++ b/e2e/__snapshots__/existing-installation.test.ts.snap @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash warns about an existing installation: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install v8.11.3 +(fnm install v8.11.3 2>&1) | grep 'already installed' || (echo "Expected output to contain 'already installed'" && exit 1)" +`; + +exports[`Fish warns about an existing installation: Fish 1`] = ` +"fnm env | source +fnm install v8.11.3 +begin; fnm install v8.11.3 2>&1; end | grep 'already installed'; or echo "Expected output to contain 'already installed'" && exit 1" +`; + +exports[`PowerShell warns about an existing installation: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install v8.11.3 +$($__out__ = $(fnm install v8.11.3 2>&1 | Select-String 'already installed'); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`Zsh warns about an existing installation: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install v8.11.3 +(fnm install v8.11.3 2>&1) | grep 'already installed' || (echo "Expected output to contain 'already installed'" && exit 1)" +`; diff --git a/e2e/__snapshots__/latest-lts.test.ts.snap b/e2e/__snapshots__/latest-lts.test.ts.snap new file mode 100644 index 0000000..b942df8 --- /dev/null +++ b/e2e/__snapshots__/latest-lts.test.ts.snap @@ -0,0 +1,32 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash installs latest lts: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install --lts +(fnm ls) | grep lts-latest || (echo "Expected output to contain lts-latest" && exit 1) +fnm use 'lts/*'" +`; + +exports[`Fish installs latest lts: Fish 1`] = ` +"fnm env | source +fnm install --lts +begin; fnm ls; end | grep lts-latest; or echo "Expected output to contain lts-latest" && exit 1 +fnm use 'lts/*'" +`; + +exports[`PowerShell installs latest lts: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install --lts +$($__out__ = $(fnm ls | Select-String lts-latest); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +fnm use 'lts/*'" +`; + +exports[`Zsh installs latest lts: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install --lts +(fnm ls) | grep lts-latest || (echo "Expected output to contain lts-latest" && exit 1) +fnm use 'lts/*'" +`; diff --git a/e2e/__snapshots__/log-level.test.ts.snap b/e2e/__snapshots__/log-level.test.ts.snap new file mode 100644 index 0000000..97b607f --- /dev/null +++ b/e2e/__snapshots__/log-level.test.ts.snap @@ -0,0 +1,127 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash "quiet" log level: Bash 1`] = ` +"set -e +eval "$(fnm env --log-level=quiet)" +if [ "$(fnm install v8.11.3)" != "" ]; then + echo "Expected fnm install to be . Got $(fnm install v8.11.3)" + exit 1 +fi +if [ "$(fnm use v8.11.3)" != "" ]; then + echo "Expected fnm use to be . Got $(fnm use v8.11.3)" + exit 1 +fi +if [ "$(fnm alias v8.11.3 something)" != "" ]; then + echo "Expected fnm alias to be . Got $(fnm alias v8.11.3 something)" + exit 1 +fi" +`; + +exports[`Bash error log level: Bash 1`] = ` +"set -e +eval "$(fnm env --log-level=error)" +if [ "$(fnm install v8.11.3)" != "" ]; then + echo "Expected fnm install to be . Got $(fnm install v8.11.3)" + exit 1 +fi +if [ "$(fnm use v8.11.3)" != "" ]; then + echo "Expected fnm use to be . Got $(fnm use v8.11.3)" + exit 1 +fi +if [ "$(fnm alias v8.11.3 something)" != "" ]; then + echo "Expected fnm alias to be . Got $(fnm alias v8.11.3 something)" + exit 1 +fi +(fnm alias abcd efg 2>&1) | grep "find requested version" || (echo "Expected output to contain "find requested version"" && exit 1)" +`; + +exports[`Fish "quiet" log level: Fish 1`] = ` +"fnm env --log-level=quiet | source +set ____test____ (fnm install v8.11.3) +if test "$____test____" != "" + echo "Expected fnm install to be . Got $____test____" + exit 1 +end +set ____test____ (fnm use v8.11.3) +if test "$____test____" != "" + echo "Expected fnm use to be . Got $____test____" + exit 1 +end +set ____test____ (fnm alias v8.11.3 something) +if test "$____test____" != "" + echo "Expected fnm alias to be . Got $____test____" + exit 1 +end" +`; + +exports[`Fish error log level: Fish 1`] = ` +"fnm env --log-level=error | source +set ____test____ (fnm install v8.11.3) +if test "$____test____" != "" + echo "Expected fnm install to be . Got $____test____" + exit 1 +end +set ____test____ (fnm use v8.11.3) +if test "$____test____" != "" + echo "Expected fnm use to be . Got $____test____" + exit 1 +end +set ____test____ (fnm alias v8.11.3 something) +if test "$____test____" != "" + echo "Expected fnm alias to be . Got $____test____" + exit 1 +end +begin; fnm alias abcd efg 2>&1; end | grep "find requested version"; or echo "Expected output to contain "find requested version"" && exit 1" +`; + +exports[`PowerShell "quiet" log level: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --log-level=quiet | Out-String | Invoke-Expression +if ( "$(fnm install v8.11.3)" -ne "" ) { echo "Expected fnm install to be . Got $(fnm install v8.11.3)"; exit 1 } +if ( "$(fnm use v8.11.3)" -ne "" ) { echo "Expected fnm use to be . Got $(fnm use v8.11.3)"; exit 1 } +if ( "$(fnm alias v8.11.3 something)" -ne "" ) { echo "Expected fnm alias to be . Got $(fnm alias v8.11.3 something)"; exit 1 }" +`; + +exports[`PowerShell error log level: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --log-level=error | Out-String | Invoke-Expression +if ( "$(fnm install v8.11.3)" -ne "" ) { echo "Expected fnm install to be . Got $(fnm install v8.11.3)"; exit 1 } +if ( "$(fnm use v8.11.3)" -ne "" ) { echo "Expected fnm use to be . Got $(fnm use v8.11.3)"; exit 1 } +if ( "$(fnm alias v8.11.3 something)" -ne "" ) { echo "Expected fnm alias to be . Got $(fnm alias v8.11.3 something)"; exit 1 } +$($__out__ = $(fnm alias abcd efg 2>&1 | Select-String "find requested version"); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`Zsh "quiet" log level: Zsh 1`] = ` +"set -e +eval "$(fnm env --log-level=quiet)" +if [ "$(fnm install v8.11.3)" != "" ]; then + echo "Expected fnm install to be . Got $(fnm install v8.11.3)" + exit 1 +fi +if [ "$(fnm use v8.11.3)" != "" ]; then + echo "Expected fnm use to be . Got $(fnm use v8.11.3)" + exit 1 +fi +if [ "$(fnm alias v8.11.3 something)" != "" ]; then + echo "Expected fnm alias to be . Got $(fnm alias v8.11.3 something)" + exit 1 +fi" +`; + +exports[`Zsh error log level: Zsh 1`] = ` +"set -e +eval "$(fnm env --log-level=error)" +if [ "$(fnm install v8.11.3)" != "" ]; then + echo "Expected fnm install to be . Got $(fnm install v8.11.3)" + exit 1 +fi +if [ "$(fnm use v8.11.3)" != "" ]; then + echo "Expected fnm use to be . Got $(fnm use v8.11.3)" + exit 1 +fi +if [ "$(fnm alias v8.11.3 something)" != "" ]; then + echo "Expected fnm alias to be . Got $(fnm alias v8.11.3 something)" + exit 1 +fi +(fnm alias abcd efg 2>&1) | grep "find requested version" || (echo "Expected output to contain "find requested version"" && exit 1)" +`; diff --git a/e2e/__snapshots__/multishell.test.ts.snap b/e2e/__snapshots__/multishell.test.ts.snap new file mode 100644 index 0000000..b02e4b4 --- /dev/null +++ b/e2e/__snapshots__/multishell.test.ts.snap @@ -0,0 +1,67 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash multishell changes don't affect parent: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install v8.11.3 +fnm install v11.9.0 +echo 'set -e +eval "$(fnm env)" +fnm use v11 +if [ "$(node --version)" != "v11.9.0" ]; then + echo "Expected node version to be v11.9.0. Got $(node --version)" + exit 1 +fi' | bash +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Fish multishell changes don't affect parent: Fish 1`] = ` +"fnm env | source +fnm install v8.11.3 +fnm install v11.9.0 +fish -c 'fnm env | source +fnm use v11 +set ____test____ (node --version) +if test "$____test____" != "v11.9.0" + echo "Expected node version to be v11.9.0. Got $____test____" + exit 1 +end' +set ____test____ (node --version) +if test "$____test____" != "v8.11.3" + echo "Expected node version to be v8.11.3. Got $____test____" + exit 1 +end" +`; + +exports[`PowerShell multishell changes don't affect parent: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install v8.11.3 +fnm install v11.9.0 +echo '$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm use v11 +if ( "$(node --version)" -ne "v11.9.0" ) { echo "Expected node version to be v11.9.0. Got $(node --version)"; exit 1 }' | pwsh -NoProfile +if ( "$(node --version)" -ne "v8.11.3" ) { echo "Expected node version to be v8.11.3. Got $(node --version)"; exit 1 }" +`; + +exports[`Zsh multishell changes don't affect parent: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install v8.11.3 +fnm install v11.9.0 +echo 'set -e +eval "$(fnm env)" +fnm use v11 +if [ "$(node --version)" != "v11.9.0" ]; then + echo "Expected node version to be v11.9.0. Got $(node --version)" + exit 1 +fi' | zsh +if [ "$(node --version)" != "v8.11.3" ]; then + echo "Expected node version to be v8.11.3. Got $(node --version)" + exit 1 +fi" +`; diff --git a/e2e/__snapshots__/nvmrc-lts.test.ts.snap b/e2e/__snapshots__/nvmrc-lts.test.ts.snap new file mode 100644 index 0000000..ce1f2cb --- /dev/null +++ b/e2e/__snapshots__/nvmrc-lts.test.ts.snap @@ -0,0 +1,32 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash uses .nvmrc with lts definition: Bash 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +(fnm ls) | grep lts-dubnium || (echo "Expected output to contain lts-dubnium" && exit 1)" +`; + +exports[`Fish uses .nvmrc with lts definition: Fish 1`] = ` +"fnm env | source +fnm install +fnm use +begin; fnm ls; end | grep lts-dubnium; or echo "Expected output to contain lts-dubnium" && exit 1" +`; + +exports[`PowerShell uses .nvmrc with lts definition: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env | Out-String | Invoke-Expression +fnm install +fnm use +$($__out__ = $(fnm ls | Select-String lts-dubnium); if ($__out__ -eq $null) { exit 1 } else { $__out__ })" +`; + +exports[`Zsh uses .nvmrc with lts definition: Zsh 1`] = ` +"set -e +eval "$(fnm env)" +fnm install +fnm use +(fnm ls) | grep lts-dubnium || (echo "Expected output to contain lts-dubnium" && exit 1)" +`; diff --git a/e2e/__snapshots__/shims.test.ts.snap b/e2e/__snapshots__/shims.test.ts.snap new file mode 100644 index 0000000..62202e5 --- /dev/null +++ b/e2e/__snapshots__/shims.test.ts.snap @@ -0,0 +1,59 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash outputs json: Bash 1`] = ` +"set -e +fnm env --json --with-shims > file.json" +`; + +exports[`Bash runs Node through a shim: Bash 1`] = ` +"set -e +eval "$(fnm env --with-shims)" +fnm install 12.0.0 +fnm use 12.0.0 +if [ "$(node --version)" != "v12.0.0" ]; then + echo "Expected node version to be v12.0.0. Got $(node --version)" + exit 1 +fi" +`; + +exports[`Fish outputs json: Fish 1`] = `"fnm env --json --with-shims > file.json"`; + +exports[`Fish runs Node through a shim: Fish 1`] = ` +"fnm env --with-shims | source +fnm install 12.0.0 +fnm use 12.0.0 +set ____test____ (node --version) +if test "$____test____" != "v12.0.0" + echo "Expected node version to be v12.0.0. Got $____test____" + exit 1 +end" +`; + +exports[`PowerShell outputs json: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --json --with-shims | Out-File file.json -Encoding UTF8" +`; + +exports[`PowerShell runs Node through a shim: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm env --with-shims | Out-String | Invoke-Expression +fnm install 12.0.0 +fnm use 12.0.0 +if ( "$(node --version)" -ne "v12.0.0" ) { echo "Expected node version to be v12.0.0. Got $(node --version)"; exit 1 }" +`; + +exports[`Zsh outputs json: Zsh 1`] = ` +"set -e +fnm env --json --with-shims > file.json" +`; + +exports[`Zsh runs Node through a shim: Zsh 1`] = ` +"set -e +eval "$(fnm env --with-shims)" +fnm install 12.0.0 +fnm use 12.0.0 +if [ "$(node --version)" != "v12.0.0" ]; then + echo "Expected node version to be v12.0.0. Got $(node --version)" + exit 1 +fi" +`; diff --git a/e2e/__snapshots__/uninstall.test.ts.snap b/e2e/__snapshots__/uninstall.test.ts.snap new file mode 100644 index 0000000..815d7ab --- /dev/null +++ b/e2e/__snapshots__/uninstall.test.ts.snap @@ -0,0 +1,46 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Bash uninstalls a version: Bash 1`] = ` +"set -e +fnm install 12.0.0 +fnm alias 12.0.0 hello +((fnm ls) | grep v12.0.0 || (echo "Expected output to contain v12.0.0" && exit 1)) | grep hello || (echo "Expected output to contain hello" && exit 1) +fnm uninstall hello +if [ "$(fnm ls)" != "* system" ]; then + echo "Expected fnm ls to be * system. Got $(fnm ls)" + exit 1 +fi" +`; + +exports[`Fish uninstalls a version: Fish 1`] = ` +"fnm install 12.0.0 +fnm alias 12.0.0 hello +begin; begin; fnm ls; end | grep v12.0.0; or echo "Expected output to contain v12.0.0" && exit 1; end | grep hello; or echo "Expected output to contain hello" && exit 1 +fnm uninstall hello +set ____test____ (fnm ls) +if test "$____test____" != "* system" + echo "Expected fnm ls to be * system. Got $____test____" + exit 1 +end" +`; + +exports[`PowerShell uninstalls a version: PowerShell 1`] = ` +"$ErrorActionPreference = "Stop" +fnm install 12.0.0 +fnm alias 12.0.0 hello +$($__out__ = $($($__out__ = $(fnm ls | Select-String v12.0.0); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) | Select-String hello); if ($__out__ -eq $null) { exit 1 } else { $__out__ }) +fnm uninstall hello +if ( "$(fnm ls)" -ne "* system" ) { echo "Expected fnm ls to be * system. Got $(fnm ls)"; exit 1 }" +`; + +exports[`Zsh uninstalls a version: Zsh 1`] = ` +"set -e +fnm install 12.0.0 +fnm alias 12.0.0 hello +((fnm ls) | grep v12.0.0 || (echo "Expected output to contain v12.0.0" && exit 1)) | grep hello || (echo "Expected output to contain hello" && exit 1) +fnm uninstall hello +if [ "$(fnm ls)" != "* system" ]; then + echo "Expected fnm ls to be * system. Got $(fnm ls)" + exit 1 +fi" +`; diff --git a/e2e/aliases.test.ts b/e2e/aliases.test.ts new file mode 100644 index 0000000..e7dce18 --- /dev/null +++ b/e2e/aliases.test.ts @@ -0,0 +1,129 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, Zsh } from "./shellcode/shells.js" +import describe from "./describe.js" +import { writeFile } from "node:fs/promises" +import path from "node:path" +import testCwd from "./shellcode/test-cwd.js" +import getStderr from "./shellcode/get-stderr.js" +import testNodeVersion from "./shellcode/test-node-version.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell]) { + describe(shell, () => { + test(`allows to install an lts if version missing`, async () => { + await writeFile(path.join(testCwd(), ".node-version"), "lts/*") + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["use", "--install-if-missing"])) + .then( + shell.scriptOutputContains(shell.call("fnm", ["ls"]), "lts-latest") + ) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`errors when alias is not found`, async () => { + await writeFile(path.join(testCwd(), ".node-version"), "lts/*") + await script(shell) + .then(shell.env({ logLevel: "error" })) + .then( + shell.scriptOutputContains( + getStderr(shell.call("fnm", ["use"])), + "'Requested version lts-latest is not'" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`unalias a version`, async () => { + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "11.10.0"])) + .then(shell.call("fnm", ["install", "8.11.3"])) + .then(shell.call("fnm", ["alias", "8.11.3", "version8"])) + .then(shell.scriptOutputContains(shell.call("fnm", ["ls"]), "version8")) + .then(shell.call("fnm", ["unalias", "version8"])) + .then( + shell.scriptOutputContains( + getStderr(shell.call("fnm", ["use", "version8"])), + "'Requested version version8 is not currently installed'" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`unalias errors if alias not found`, async () => { + await script(shell) + .then(shell.env({ logLevel: "error" })) + .then( + shell.scriptOutputContains( + getStderr(shell.call("fnm", ["unalias", "lts"])), + "'Requested alias lts not found'" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`can alias the system node`, async () => { + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["alias", "system", "my_system"])) + .then( + shell.scriptOutputContains(shell.call("fnm", ["ls"]), "my_system") + ) + .then(shell.call("fnm", ["alias", "system", "default"])) + .then(shell.call("fnm", ["alias", "my_system", "my_system2"])) + .then( + shell.scriptOutputContains(shell.call("fnm", ["ls"]), "my_system2") + ) + .then( + shell.scriptOutputContains( + shell.call("fnm", ["use", "my_system"]), + "'Bypassing fnm'" + ) + ) + .then(shell.call("fnm", ["unalias", "my_system"])) + .then( + shell.scriptOutputContains( + getStderr(shell.call("fnm", ["use", "my_system"])), + "'Requested version my_system is not currently installed'" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`aliasing versions`, async () => { + const installedVersions = shell.call("fnm", ["ls"]) + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "6.11.3"])) + .then(shell.call("fnm", ["install", "8.11.3"])) + .then(shell.call("fnm", ["alias", "8.11", "oldie"])) + .then(shell.call("fnm", ["alias", "6", "older"])) + .then(shell.call("fnm", ["default", "older"])) + .then( + shell.scriptOutputContains( + shell.scriptOutputContains(installedVersions, "8.11.3"), + "oldie" + ) + ) + .then( + shell.scriptOutputContains( + shell.scriptOutputContains(installedVersions, "6.11.3"), + "older" + ) + ) + .then(shell.call("fnm", ["use", "older"])) + .then(testNodeVersion(shell, "v6.11.3")) + .then(shell.call("fnm", ["use", "oldie"])) + .then(testNodeVersion(shell, "v8.11.3")) + .then(shell.call("fnm", ["use", "default"])) + .then(testNodeVersion(shell, "v6.11.3")) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/basic.test.ts b/e2e/basic.test.ts new file mode 100644 index 0000000..d269c5f --- /dev/null +++ b/e2e/basic.test.ts @@ -0,0 +1,93 @@ +import { writeFile, mkdir } from "node:fs/promises" +import { join } from "node:path" +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, WinCmd, Zsh } from "./shellcode/shells.js" +import testCwd from "./shellcode/test-cwd.js" +import testNodeVersion from "./shellcode/test-node-version.js" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell, WinCmd]) { + describe(shell, () => { + test(`basic usage`, async () => { + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "v8.11.3"])) + .then(shell.call("fnm", ["use", "v8.11.3"])) + .then(testNodeVersion(shell, "v8.11.3")) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`.nvmrc`, async () => { + await writeFile(join(testCwd(), ".nvmrc"), "v8.11.3") + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install"])) + .then(shell.call("fnm", ["use"])) + .then(testNodeVersion(shell, "v8.11.3")) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`.node-version`, async () => { + await writeFile(join(testCwd(), ".node-version"), "v8.11.3") + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install"])) + .then(shell.call("fnm", ["use"])) + .then(testNodeVersion(shell, "v8.11.3")) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`use on cd`, async () => { + await mkdir(join(testCwd(), "subdir"), { recursive: true }) + await writeFile(join(testCwd(), "subdir", ".node-version"), "v12.22.12") + await script(shell) + .then(shell.env({ useOnCd: true })) + .then(shell.call("fnm", ["install", "v8.11.3"])) + .then(shell.call("fnm", ["install", "v12.22.12"])) + .then(shell.call("cd", ["subdir"])) + .then(testNodeVersion(shell, "v12.22.12")) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`resolves partial semver`, async () => { + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "6"])) + .then(shell.call("fnm", ["use", "6"])) + .then(testNodeVersion(shell, "v6.17.1")) + .takeSnapshot(shell) + .execute(shell) + }) + + test("`fnm ls` with nothing installed", async () => { + await script(shell) + .then(shell.env({})) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["ls"]), + "* system", + "fnm ls" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + + test(`when .node-version and .nvmrc are in sync, it throws no error`, async () => { + await writeFile(join(testCwd(), ".nvmrc"), "v11.10.0") + await writeFile(join(testCwd(), ".node-version"), "v11.10.0") + + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install"])) + .then(shell.call("fnm", ["use"])) + .then(testNodeVersion(shell, "v11.10.0")) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/current.test.ts b/e2e/current.test.ts new file mode 100644 index 0000000..29710c0 --- /dev/null +++ b/e2e/current.test.ts @@ -0,0 +1,47 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, WinCmd, Zsh } from "./shellcode/shells.js" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell, WinCmd]) { + describe(shell, () => { + test(`current returns the current Node.js version set in fnm`, async () => { + await script(shell) + .then(shell.env({})) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["current"]), + "none", + "currently activated version" + ) + ) + .then(shell.call("fnm", ["install", "v8.11.3"])) + .then(shell.call("fnm", ["install", "v10.10.0"])) + .then(shell.call("fnm", ["use", "v8.11.3"])) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["current"]), + "v8.11.3", + "currently activated version" + ) + ) + .then(shell.call("fnm", ["use", "v10.10.0"])) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["current"]), + "v10.10.0", + "currently activated version" + ) + ) + .then(shell.call("fnm", ["use", "system"])) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["current"]), + "system", + "currently activated version" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/describe.ts b/e2e/describe.ts new file mode 100644 index 0000000..8058dec --- /dev/null +++ b/e2e/describe.ts @@ -0,0 +1,15 @@ +import { WinCmd } from "./shellcode/shells.js" +import { Shell } from "./shellcode/shells/types.js" + +export default function describe( + shell: Pick, + fn: () => void +): void { + if (shell === WinCmd) { + // wincmd tests do not work right now and I don't have a Windows machine to fix it + // maybe in the future when I have some time to spin a VM to check what's happening. + return globalThis.describe.skip("WinCmd", fn) + } + + globalThis.describe(shell.name(), fn) +} diff --git a/e2e/env.test.ts b/e2e/env.test.ts new file mode 100644 index 0000000..7684c2d --- /dev/null +++ b/e2e/env.test.ts @@ -0,0 +1,35 @@ +import { readFile } from "node:fs/promises" +import { join } from "node:path" +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, WinCmd, Zsh } from "./shellcode/shells.js" +import testCwd from "./shellcode/test-cwd.js" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell, WinCmd]) { + describe(shell, () => { + test(`outputs json`, async () => { + const filename = `file.json` + await script(shell) + .then( + shell.redirectOutput(shell.call("fnm", ["env", "--json"]), { + output: filename, + }) + ) + .takeSnapshot(shell) + .execute(shell) + + if (shell.currentlySupported()) { + const file = await readFile(join(testCwd(), filename), "utf8") + expect(JSON.parse(file)).toEqual({ + FNM_ARCH: expect.any(String), + FNM_DIR: expect.any(String), + FNM_LOGLEVEL: "info", + FNM_MULTISHELL_PATH: expect.any(String), + FNM_NODE_DIST_MIRROR: expect.any(String), + FNM_VERSION_FILE_STRATEGY: "local", + FNM_VERSION_SWITCH_STRATEGY: "path-symlink", + }) + } + }) + }) +} diff --git a/e2e/exec.test.ts b/e2e/exec.test.ts new file mode 100644 index 0000000..4babaad --- /dev/null +++ b/e2e/exec.test.ts @@ -0,0 +1,42 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, WinCmd, Zsh } from "./shellcode/shells.js" +import testCwd from "./shellcode/test-cwd.js" +import fs from "node:fs/promises" +import path from "node:path" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell, WinCmd]) { + describe(shell, () => { + test("`exec` usage", async () => { + await fs.writeFile(path.join(testCwd(), ".nvmrc"), "v8.10.0") + + await script(shell) + .then(shell.call("fnm", ["install"])) + .then(shell.call("fnm", ["install", "v6.10.0"])) + .then(shell.call("fnm", ["install", "v10.10.0"])) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["exec", "--", "node", "-v"]), + "v8.10.0", + "version file exec" + ) + ) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["exec", "--using=6", "--", "node", "-v"]), + "v6.10.0", + "exec:6 node -v" + ) + ) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["exec", "--using=10", "--", "node", "-v"]), + "v10.10.0", + "exec:6 node -v" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/existing-installation.test.ts b/e2e/existing-installation.test.ts new file mode 100644 index 0000000..2fb0f90 --- /dev/null +++ b/e2e/existing-installation.test.ts @@ -0,0 +1,22 @@ +import getStderr from "./shellcode/get-stderr.js" +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, Zsh } from "./shellcode/shells.js" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell]) { + describe(shell, () => { + test(`warns about an existing installation`, async () => { + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "v8.11.3"])) + .then( + shell.scriptOutputContains( + getStderr(shell.call("fnm", ["install", "v8.11.3"])), + "'already installed'" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/latest-lts.test.ts b/e2e/latest-lts.test.ts new file mode 100644 index 0000000..83bebb0 --- /dev/null +++ b/e2e/latest-lts.test.ts @@ -0,0 +1,19 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, Zsh } from "./shellcode/shells.js" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell]) { + describe(shell, () => { + test(`installs latest lts`, async () => { + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "--lts"])) + .then( + shell.scriptOutputContains(shell.call("fnm", ["ls"]), "lts-latest") + ) + .then(shell.call("fnm", ["use", "'lts/*'"])) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/log-level.test.ts b/e2e/log-level.test.ts new file mode 100644 index 0000000..f7329c8 --- /dev/null +++ b/e2e/log-level.test.ts @@ -0,0 +1,71 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, Zsh } from "./shellcode/shells.js" +import describe from "./describe.js" +import getStderr from "./shellcode/get-stderr.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell]) { + describe(shell, () => { + test(`"quiet" log level`, async () => { + await script(shell) + .then(shell.env({ logLevel: "quiet" })) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["install", "v8.11.3"]), + "", + "fnm install" + ) + ) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["use", "v8.11.3"]), + "", + "fnm use" + ) + ) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["alias", "v8.11.3", "something"]), + "", + "fnm alias" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + + test("error log level", async () => { + await script(shell) + .then(shell.env({ logLevel: "error" })) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["install", "v8.11.3"]), + "", + "fnm install" + ) + ) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["use", "v8.11.3"]), + "", + "fnm use" + ) + ) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["alias", "v8.11.3", "something"]), + "", + "fnm alias" + ) + ) + .then( + shell.scriptOutputContains( + getStderr(shell.call("fnm", ["alias", "abcd", "efg"])), + `"find requested version"` + ) + ) + + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/multishell.test.ts b/e2e/multishell.test.ts new file mode 100644 index 0000000..60f9007 --- /dev/null +++ b/e2e/multishell.test.ts @@ -0,0 +1,27 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, Zsh } from "./shellcode/shells.js" +import testNodeVersion from "./shellcode/test-node-version.js" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell]) { + describe(shell, () => { + test(`multishell changes don't affect parent`, async () => { + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "v8.11.3"])) + .then(shell.call("fnm", ["install", "v11.9.0"])) + .then( + shell.inSubShell( + script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["use", "v11"])) + .then(testNodeVersion(shell, "v11.9.0")) + .asLine() + ) + ) + .then(testNodeVersion(shell, "v8.11.3")) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/nvmrc-lts.test.ts b/e2e/nvmrc-lts.test.ts new file mode 100644 index 0000000..be5a18d --- /dev/null +++ b/e2e/nvmrc-lts.test.ts @@ -0,0 +1,24 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, Zsh } from "./shellcode/shells.js" +import fs from "node:fs/promises" +import path from "node:path" +import describe from "./describe.js" +import testCwd from "./shellcode/test-cwd.js" + +for (const shell of [Bash, Fish, PowerShell, Zsh]) { + describe(shell, () => { + test(`uses .nvmrc with lts definition`, async () => { + await fs.writeFile(path.join(testCwd(), ".nvmrc"), `lts/dubnium`) + + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install"])) + .then(shell.call("fnm", ["use"])) + .then( + shell.scriptOutputContains(shell.call("fnm", ["ls"]), "lts-dubnium") + ) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/shellcode/get-stderr.ts b/e2e/shellcode/get-stderr.ts new file mode 100644 index 0000000..4271901 --- /dev/null +++ b/e2e/shellcode/get-stderr.ts @@ -0,0 +1,3 @@ +export default function getStderr(script: string): string { + return `${script} 2>&1` +} diff --git a/e2e/shellcode/script.ts b/e2e/shellcode/script.ts new file mode 100644 index 0000000..aec7f15 --- /dev/null +++ b/e2e/shellcode/script.ts @@ -0,0 +1,179 @@ +import { ScriptLine, Shell } from "./shells/types.js" +import { execa, type ExecaChildProcess } from "execa" +import testTmpDir from "./test-tmp-dir.js" +import { Writable } from "node:stream" +import { dedent } from "ts-dedent" +import testCwd from "./test-cwd.js" +import path, { join } from "node:path" +import { writeFile } from "node:fs/promises" +import chalk from "chalk" +import testBinDir from "./test-bin-dir.js" + +class Script { + constructor( + private readonly config: { + fnmDir: string + }, + private readonly lines: ScriptLine[] + ) {} + then(line: ScriptLine): Script { + return new Script(this.config, [...this.lines, line]) + } + + takeSnapshot(shell: Pick): this { + const script = this.lines.join("\n") + expect(script).toMatchSnapshot(shell.name()) + + return this + } + + async execute( + shell: Pick< + Shell, + "binaryName" | "launchArgs" | "currentlySupported" | "forceFile" + > + ): Promise { + if (!shell.currentlySupported()) { + return + } + + const args = [...shell.launchArgs()] + + if (shell.forceFile) { + let filename = join(testTmpDir(), "script") + if (typeof shell.forceFile === "string") { + filename = filename + shell.forceFile + } + await writeFile(filename, [...this.lines, "exit 0"].join("\n")) + args.push(filename) + } + + const child = execa(shell.binaryName(), args, { + stdio: [shell.forceFile ? "ignore" : "pipe", "pipe", "pipe"], + cwd: testCwd(), + env: (() => { + const newProcessEnv: Record = { + ...removeAllFnmEnvVars(process.env), + PATH: [testBinDir(), fnmTargetDir(), process.env.PATH] + .filter(Boolean) + .join(path.delimiter), + FNM_DIR: this.config.fnmDir, + } + + delete newProcessEnv.NODE_OPTIONS + return newProcessEnv + })(), + extendEnv: false, + reject: false, + }) + + if (child.stdin) { + const childStdin = child.stdin + + for (const line of this.lines) { + await write(childStdin, `${line}\n`) + } + + await write(childStdin, "exit 0\n") + } + + const { stdout, stderr } = streamOutputsAndBuffer(child) + + const finished = await child + + if (finished.failed) { + console.error( + dedent` + Script failed. + code ${finished.exitCode} + signal ${finished.signal} + + stdout: + ${padAllLines(stdout.join(""), 2)} + + stderr: + ${padAllLines(stderr.join(""), 2)} + ` + ) + + throw new Error( + `Script failed on ${testCwd()} with code ${finished.exitCode}` + ) + } + } + + asLine(): ScriptLine { + return this.lines.join("\n") + } +} + +function streamOutputsAndBuffer(child: ExecaChildProcess) { + const stdout: string[] = [] + const stderr: string[] = [] + const testName = expect.getState().currentTestName ?? "unknown" + const testPath = expect.getState().testPath ?? "unknown" + + const stdoutPrefix = chalk.cyan.dim(`[stdout] ${testPath}/${testName}: `) + const stderrPrefix = chalk.magenta.dim(`[stderr] ${testPath}/${testName}: `) + + if (child.stdout) { + child.stdout.on("data", (data) => { + const line = data.toString().trim() + if (line) { + process.stdout.write(`${stdoutPrefix}${line}\n`) + } + stdout.push(data.toString()) + }) + } + + if (child.stderr) { + child.stderr.on("data", (data) => { + const line = data.toString().trim() + if (line) { + process.stdout.write(`${stderrPrefix}${line}\n`) + } + stderr.push(data.toString()) + }) + } + + return { stdout, stderr } +} + +function padAllLines(text: string, padding: number): string { + return text + .split("\n") + .map((line) => " ".repeat(padding) + line) + .join("\n") +} + +function write(writable: Writable, text: string): Promise { + return new Promise((resolve, reject) => { + writable.write(text, (err) => { + if (err) return reject(err) + return resolve() + }) + }) +} + +export function script(shell: Pick): Script { + const fnmDir = path.join(testTmpDir(), "fnm") + return new Script({ fnmDir }, shell.dieOnErrors ? [shell.dieOnErrors()] : []) +} + +function removeAllFnmEnvVars(obj: NodeJS.ProcessEnv): NodeJS.ProcessEnv { + const result: NodeJS.ProcessEnv = {} + for (const [key, value] of Object.entries(obj)) { + if (!key.startsWith("FNM_")) { + result[key] = value + } + } + return result +} + +function fnmTargetDir(): string { + return path.join( + process.cwd(), + "target", + process.env.FNM_TARGET_NAME ?? "debug" + ) +} diff --git a/e2e/shellcode/shells.ts b/e2e/shellcode/shells.ts new file mode 100644 index 0000000..10fd0af --- /dev/null +++ b/e2e/shellcode/shells.ts @@ -0,0 +1,97 @@ +import { cmdCall } from "./shells/cmdCall.js" +import { cmdEnv } from "./shells/cmdEnv.js" +import { cmdExpectCommandOutput } from "./shells/expect-command-output.js" +import { cmdHasOutputContains } from "./shells/output-contains.js" +import { redirectOutput } from "./shells/redirect-output.js" +import { cmdInSubShell } from "./shells/sub-shell.js" +import { define, Shell } from "./shells/types.js" + +export const Bash = { + ...define({ + binaryName: () => "bash", + currentlySupported: () => true, + name: () => "Bash", + launchArgs: () => ["-i"], + escapeText: (x) => x, + dieOnErrors: () => `set -e`, + }), + ...cmdEnv.bash, + ...cmdCall.all, + ...redirectOutput.bash, + ...cmdExpectCommandOutput.bash, + ...cmdHasOutputContains.bash, + ...cmdInSubShell.bash, +} + +export const Zsh = { + ...define({ + binaryName: () => "zsh", + currentlySupported: () => process.platform !== "win32", + name: () => "Zsh", + launchArgs: () => [], + escapeText: (x) => x, + dieOnErrors: () => `set -e`, + }), + ...cmdEnv.bash, + ...cmdCall.all, + ...redirectOutput.bash, + ...cmdExpectCommandOutput.bash, + ...cmdHasOutputContains.bash, + ...cmdInSubShell.zsh, +} + +export const Fish = { + ...define({ + binaryName: () => "fish", + currentlySupported: () => process.platform !== "win32", + name: () => "Fish", + launchArgs: () => [], + escapeText: (x) => x, + forceFile: true, + }), + ...cmdEnv.fish, + ...cmdCall.all, + ...redirectOutput.bash, + ...cmdExpectCommandOutput.fish, + ...cmdHasOutputContains.fish, + ...cmdInSubShell.fish, +} + +export const PowerShell = { + ...define({ + binaryName: () => "pwsh", + forceFile: ".ps1", + currentlySupported: () => true, + name: () => "PowerShell", + launchArgs: () => ["-NoProfile"], + escapeText: (x) => x, + dieOnErrors: () => `$ErrorActionPreference = "Stop"`, + }), + ...cmdEnv.powershell, + ...cmdCall.all, + ...redirectOutput.powershell, + ...cmdExpectCommandOutput.powershell, + ...cmdHasOutputContains.powershell, + ...cmdInSubShell.powershell, +} + +export const WinCmd = { + ...define({ + binaryName: () => "cmd.exe", + currentlySupported: () => process.platform === "win32", + name: () => "Windows Command Prompt", + launchArgs: () => [], + escapeText: (str) => + str + .replace(/\r/g, "") + .replace(/\n/g, "^\n\n") + .replace(/\%/g, "%%") + .replace(/\|/g, "^|") + .replace(/\(/g, "^(") + .replace(/\)/g, "^)"), + }), + ...cmdEnv.wincmd, + ...cmdCall.all, + ...cmdExpectCommandOutput.wincmd, + ...redirectOutput.bash, +} diff --git a/e2e/shellcode/shells/cmdCall.ts b/e2e/shellcode/shells/cmdCall.ts new file mode 100644 index 0000000..921585a --- /dev/null +++ b/e2e/shellcode/shells/cmdCall.ts @@ -0,0 +1,12 @@ +import { define, ScriptLine } from "./types.js" + +export type HasCall = { + call: (binary: string, args: string[]) => ScriptLine +} + +export const cmdCall = { + all: define({ + call: (binary: string, args: string[]) => + `${binary} ${args.join(" ")}` as ScriptLine, + }), +} diff --git a/e2e/shellcode/shells/cmdEnv.ts b/e2e/shellcode/shells/cmdEnv.ts new file mode 100644 index 0000000..38b430e --- /dev/null +++ b/e2e/shellcode/shells/cmdEnv.ts @@ -0,0 +1,33 @@ +import { ScriptLine, define } from "./types.js" + +type EnvConfig = { useOnCd: boolean; logLevel: string; args: string[] } +export type HasEnv = { env(cfg: Partial): ScriptLine } + +function stringify(envConfig: Partial = {}) { + const { useOnCd, logLevel, args } = envConfig + return [ + `fnm env`, + useOnCd && "--use-on-cd", + logLevel && `--log-level=${logLevel}`, + args && args.join(" "), + ] + .filter(Boolean) + .join(" ") +} + +export const cmdEnv = { + bash: define({ + env: (envConfig) => `eval "$(${stringify(envConfig)})"`, + }), + fish: define({ + env: (envConfig) => `${stringify(envConfig)} | source`, + }), + powershell: define({ + env: (envConfig) => + `${stringify(envConfig)} | Out-String | Invoke-Expression`, + }), + wincmd: define({ + env: (envConfig) => + `FOR /f "tokens=*" %i IN ('${stringify(envConfig)}') DO CALL %i`, + }), +} diff --git a/e2e/shellcode/shells/expect-command-output.ts b/e2e/shellcode/shells/expect-command-output.ts new file mode 100644 index 0000000..b55363a --- /dev/null +++ b/e2e/shellcode/shells/expect-command-output.ts @@ -0,0 +1,52 @@ +import { dedent } from "ts-dedent" +import { define, ScriptLine } from "./types.js" + +export type HasExpectCommandOutput = { + hasCommandOutput( + script: ScriptLine, + output: string, + message: string + ): ScriptLine +} + +export const cmdExpectCommandOutput = { + bash: define({ + hasCommandOutput(script, output, message) { + return dedent` + if [ "$(${script})" != "${output}" ]; then + echo "Expected ${message} to be ${output}. Got $(${script})" + exit 1 + fi + ` + }, + }), + fish: define({ + hasCommandOutput(script, output, message) { + return dedent` + set ____test____ (${script}) + if test "$____test____" != "${output}" + echo "Expected ${message} to be ${output}. Got $____test____" + exit 1 + end + ` + }, + }), + powershell: define({ + hasCommandOutput(script, output, message) { + return dedent` + if ( "$(${script})" -ne "${output}" ) { echo "Expected ${message} to be ${output}. Got $(${script})"; exit 1 } + ` + }, + }), + wincmd: define({ + hasCommandOutput(script, output, message) { + return dedent` + ${script} | findstr ${output} + if %errorlevel% neq 0 ( + echo Expected ${message} to be ${output} + exit 1 + ) + ` + }, + }), +} diff --git a/e2e/shellcode/shells/output-contains.ts b/e2e/shellcode/shells/output-contains.ts new file mode 100644 index 0000000..8823611 --- /dev/null +++ b/e2e/shellcode/shells/output-contains.ts @@ -0,0 +1,24 @@ +import { define, ScriptLine } from "./types.js" + +export type HasOutputContains = { + scriptOutputContains(script: ScriptLine, substring: string): ScriptLine +} + +export const cmdHasOutputContains = { + bash: define({ + scriptOutputContains: (script, substring) => { + return `(${script}) | grep ${substring} || (echo "Expected output to contain ${substring}" && exit 1)` + }, + }), + fish: define({ + scriptOutputContains: (script, substring) => { + return `begin; ${script}; end | grep ${substring}; or echo "Expected output to contain ${substring}" && exit 1` + }, + }), + powershell: define({ + scriptOutputContains: (script, substring) => { + const inner: string = `${script} | Select-String ${substring}` + return `$($__out__ = $(${inner}); if ($__out__ -eq $null) { exit 1 } else { $__out__ })` + }, + }), +} diff --git a/e2e/shellcode/shells/redirect-output.ts b/e2e/shellcode/shells/redirect-output.ts new file mode 100644 index 0000000..35a2be5 --- /dev/null +++ b/e2e/shellcode/shells/redirect-output.ts @@ -0,0 +1,16 @@ +import { ScriptLine, define } from "./types.js" + +type RedirectOutputOpts = { output: string } +export type HasRedirectOutput = { + redirectOutput(childCommand: ScriptLine, opts: RedirectOutputOpts): string +} + +export const redirectOutput = { + bash: define({ + redirectOutput: (childCommand, opts) => `${childCommand} > ${opts.output}`, + }), + powershell: define({ + redirectOutput: (childCommand, opts) => + `${childCommand} | Out-File ${opts.output} -Encoding UTF8`, + }), +} diff --git a/e2e/shellcode/shells/sub-shell.ts b/e2e/shellcode/shells/sub-shell.ts new file mode 100644 index 0000000..988961a --- /dev/null +++ b/e2e/shellcode/shells/sub-shell.ts @@ -0,0 +1,20 @@ +import { ScriptLine, define } from "./types.js" +import quote from "shell-escape" + +type HasInSubShell = { inSubShell: (script: ScriptLine) => ScriptLine } + +export const cmdInSubShell = { + bash: define({ + inSubShell: (script) => `echo ${quote([script])} | bash`, + }), + zsh: define({ + inSubShell: (script) => `echo ${quote([script])} | zsh`, + }), + fish: define({ + inSubShell: (script) => `fish -c ${quote([script])}`, + }), + powershell: define({ + inSubShell: (script) => + `echo '${script.replace(/'/g, "\\'")}' | pwsh -NoProfile`, + }), +} diff --git a/e2e/shellcode/shells/types.ts b/e2e/shellcode/shells/types.ts new file mode 100644 index 0000000..21618a6 --- /dev/null +++ b/e2e/shellcode/shells/types.ts @@ -0,0 +1,15 @@ +export type Shell = { + escapeText(str: string): string + binaryName(): string + currentlySupported(): boolean + name(): string + launchArgs(): string[] + dieOnErrors?(): string + forceFile?: true | string +} + +export type ScriptLine = string + +export function define(s: S): S { + return s +} diff --git a/e2e/shellcode/test-bin-dir.ts b/e2e/shellcode/test-bin-dir.ts new file mode 100644 index 0000000..d2956ba --- /dev/null +++ b/e2e/shellcode/test-bin-dir.ts @@ -0,0 +1,9 @@ +import { mkdirSync } from "node:fs" +import path from "node:path" +import testTmpDir from "./test-tmp-dir.js" + +export default function testBinDir() { + const dir = path.join(testTmpDir(), "bin") + mkdirSync(dir, { recursive: true }) + return dir +} diff --git a/e2e/shellcode/test-cwd.ts b/e2e/shellcode/test-cwd.ts new file mode 100644 index 0000000..16d02a9 --- /dev/null +++ b/e2e/shellcode/test-cwd.ts @@ -0,0 +1,9 @@ +import { mkdirSync } from "node:fs" +import path from "node:path" +import testTmpDir from "./test-tmp-dir.js" + +export default function testCwd() { + const dir = path.join(testTmpDir(), "cwd") + mkdirSync(dir, { recursive: true }) + return dir +} diff --git a/e2e/shellcode/test-node-version.ts b/e2e/shellcode/test-node-version.ts new file mode 100644 index 0000000..894f014 --- /dev/null +++ b/e2e/shellcode/test-node-version.ts @@ -0,0 +1,10 @@ +import { HasCall } from "./shells/cmdCall.js" +import { ScriptLine } from "./shells/types.js" +import { HasExpectCommandOutput } from "./shells/expect-command-output.js" + +export default function testNodeVersion< + S extends HasCall & HasExpectCommandOutput +>(shell: S, version: string): ScriptLine { + const nodeVersion = shell.call("node", ["--version"]) + return shell.hasCommandOutput(nodeVersion, version, "node version") +} diff --git a/e2e/shellcode/test-tmp-dir.ts b/e2e/shellcode/test-tmp-dir.ts new file mode 100644 index 0000000..3c56c3a --- /dev/null +++ b/e2e/shellcode/test-tmp-dir.ts @@ -0,0 +1,15 @@ +import { mkdirSync, rmSync } from "node:fs" +import { tmpdir } from "node:os" +import { join } from "node:path" + +export default function testTmpDir(): string { + const testName = (expect.getState().currentTestName ?? "unknown") + .toLowerCase() + .replace(/[^a-z0-9]/gi, "_") + .replace(/_+/g, "_") + const tmpDir = join(tmpdir(), `shellcode/${testName}`) + mkdirSync(tmpDir, { recursive: true }) + rmSync(join(tmpDir, "fnm/aliases"), { recursive: true, force: true }) + + return tmpDir +} diff --git a/e2e/shims.test.ts b/e2e/shims.test.ts new file mode 100644 index 0000000..8610530 --- /dev/null +++ b/e2e/shims.test.ts @@ -0,0 +1,49 @@ +import { readFile } from "node:fs/promises" +import { join } from "node:path" +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, WinCmd, Zsh } from "./shellcode/shells.js" +import testCwd from "./shellcode/test-cwd.js" +import describe from "./describe.js" +import testNodeVersion from "./shellcode/test-node-version.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell, WinCmd]) { + describe(shell, () => { + test(`outputs json`, async () => { + const filename = `file.json` + await script(shell) + .then( + shell.redirectOutput( + shell.call("fnm", ["env", "--json", "--with-shims"]), + { + output: filename, + } + ) + ) + .takeSnapshot(shell) + .execute(shell) + + if (shell.currentlySupported()) { + const file = await readFile(join(testCwd(), filename), "utf8") + expect(JSON.parse(file)).toEqual({ + FNM_ARCH: expect.any(String), + FNM_DIR: expect.any(String), + FNM_LOGLEVEL: "info", + FNM_MULTISHELL_PATH: expect.any(String), + FNM_NODE_DIST_MIRROR: expect.any(String), + FNM_VERSION_FILE_STRATEGY: "local", + FNM_VERSION_SWITCH_STRATEGY: "shims", + }) + } + }) + + test(`runs Node through a shim`, async () => { + await script(shell) + .then(shell.env({ args: ["--with-shims"] })) + .then(shell.call("fnm", ["install", "12.0.0"])) + .then(shell.call("fnm", ["use", "12.0.0"])) + .then(testNodeVersion(shell, "v12.0.0")) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/e2e/system-node.test.ts b/e2e/system-node.test.ts new file mode 100644 index 0000000..43fb0f0 --- /dev/null +++ b/e2e/system-node.test.ts @@ -0,0 +1,38 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, WinCmd, Zsh } from "./shellcode/shells.js" +import fs from "node:fs/promises" +import path from "node:path" +import describe from "./describe.js" +import testNodeVersion from "./shellcode/test-node-version.js" +import testBinDir from "./shellcode/test-bin-dir.js" + +for (const shell of [Bash, Fish, PowerShell, WinCmd, Zsh]) { + describe(shell, () => { + // latest bash breaks this as it seems. gotta find a solution. + const t = process.platform === "darwin" && shell === Bash ? test.skip : test + + t(`switches to system node`, async () => { + const customNode = path.join(testBinDir(), "node") + + if ( + process.platform === "win32" && + [WinCmd, PowerShell].includes(shell) + ) { + await fs.writeFile(customNode + ".cmd", "@echo custom") + } else { + await fs.writeFile(customNode, `#!/bin/bash\n\necho "custom"\n`) + // set executable + await fs.chmod(customNode, 0o766) + } + + await script(shell) + .then(shell.env({})) + .then(shell.call("fnm", ["install", "v10.10.0"])) + .then(shell.call("fnm", ["use", "v10"])) + .then(testNodeVersion(shell, "v10.10.0")) + .then(shell.call("fnm", ["use", "system"])) + .then(testNodeVersion(shell, "custom")) + .execute(shell) + }) + }) +} diff --git a/e2e/uninstall.test.ts b/e2e/uninstall.test.ts new file mode 100644 index 0000000..6726c3e --- /dev/null +++ b/e2e/uninstall.test.ts @@ -0,0 +1,29 @@ +import { script } from "./shellcode/script.js" +import { Bash, Fish, PowerShell, Zsh } from "./shellcode/shells.js" +import describe from "./describe.js" + +for (const shell of [Bash, Zsh, Fish, PowerShell]) { + describe(shell, () => { + test(`uninstalls a version`, async () => { + await script(shell) + .then(shell.call("fnm", ["install", "12.0.0"])) + .then(shell.call("fnm", ["alias", "12.0.0", "hello"])) + .then( + shell.scriptOutputContains( + shell.scriptOutputContains(shell.call("fnm", ["ls"]), "v12.0.0"), + "hello" + ) + ) + .then(shell.call("fnm", ["uninstall", "hello"])) + .then( + shell.hasCommandOutput( + shell.call("fnm", ["ls"]), + "* system", + "fnm ls" + ) + ) + .takeSnapshot(shell) + .execute(shell) + }) + }) +} diff --git a/jest.config.cjs b/jest.config.cjs new file mode 100644 index 0000000..10e45aa --- /dev/null +++ b/jest.config.cjs @@ -0,0 +1,22 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: "ts-jest/presets/default-esm", + testEnvironment: "node", + testTimeout: 120000, + extensionsToTreatAsEsm: [".ts"], + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + "#ansi-styles": "ansi-styles/index.js", + "#supports-color": "supports-color/index.js", + }, + transform: { + // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` + // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` + "^.+\\.tsx?$": [ + "ts-jest", + { + useESM: true, + }, + ], + }, +} diff --git a/package.json b/package.json index d8753e4..1b657a0 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,15 @@ { "name": "fnm", - "version": "0.0.0", + "version": "1.31.1", "private": true, "repository": "git@github.com:Schniz/fnm.git", "author": "Gal Schlezinger ", + "type": "module", + "packageManager": "pnpm@7.16.1", "license": "GPLv3", "scripts": { - "changelog": "./.ci/generate-changelog.sh", - "version:prepare": "./.ci/prepare-version.js", + "test": "cross-env NODE_OPTIONS='--experimental-vm-modules' jest", + "version:prepare": "changeset version && ./.ci/prepare-version.js", "generate-command-docs": "./.ci/print-command-docs.js" }, "changelog": { @@ -20,10 +22,27 @@ } }, "devDependencies": { - "cmd-ts": "0.8.0", - "execa": "5.1.1", + "@changesets/cli": "2.25.0", + "@svitejs/changesets-changelog-github-compact": "0.1.1", + "@types/jest": "^29.2.3", + "@types/node": "^18.11.9", + "@types/shell-escape": "^0.2.1", + "chalk": "^5.1.2", + "cmd-ts": "0.11.0", + "cross-env": "^7.0.3", + "execa": "6.1.0", + "jest": "^29.3.1", "lerna-changelog": "2.2.0", - "prettier": "2.5.1", - "toml": "3.0.0" + "prettier": "2.7.1", + "pv": "1.0.1", + "shell-escape": "^0.2.0", + "svg-term-cli": "2.1.1", + "toml": "3.0.0", + "ts-dedent": "^2.2.0", + "ts-jest": "^29.0.3", + "typescript": "^4.8.4" + }, + "prettier": { + "semi": false } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..be10d13 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,5129 @@ +lockfileVersion: 5.4 + +specifiers: + '@changesets/cli': 2.25.0 + '@svitejs/changesets-changelog-github-compact': 0.1.1 + '@types/jest': ^29.2.3 + '@types/node': ^18.11.9 + '@types/shell-escape': ^0.2.1 + chalk: ^5.1.2 + cmd-ts: 0.11.0 + cross-env: ^7.0.3 + execa: 6.1.0 + jest: ^29.3.1 + lerna-changelog: 2.2.0 + prettier: 2.7.1 + pv: 1.0.1 + shell-escape: ^0.2.0 + svg-term-cli: 2.1.1 + toml: 3.0.0 + ts-dedent: ^2.2.0 + ts-jest: ^29.0.3 + typescript: ^4.8.4 + +devDependencies: + '@changesets/cli': 2.25.0 + '@svitejs/changesets-changelog-github-compact': 0.1.1 + '@types/jest': 29.2.3 + '@types/node': 18.11.9 + '@types/shell-escape': 0.2.1 + chalk: 5.1.2 + cmd-ts: 0.11.0 + cross-env: 7.0.3 + execa: 6.1.0 + jest: 29.3.1_@types+node@18.11.9 + lerna-changelog: 2.2.0 + prettier: 2.7.1 + pv: 1.0.1 + shell-escape: 0.2.0 + svg-term-cli: 2.1.1 + toml: 3.0.0 + ts-dedent: 2.2.0 + ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se + typescript: 4.8.4 + +packages: + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@babel/code-frame/7.18.6: + resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.18.6 + dev: true + + /@babel/compat-data/7.20.1: + resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.20.2: + resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.4 + '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2 + '@babel/helper-module-transforms': 7.20.2 + '@babel/helpers': 7.20.1 + '@babel/parser': 7.20.3 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + convert-source-map: 1.9.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator/7.20.4: + resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.2 + '@jridgewell/gen-mapping': 0.3.2 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.2: + resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.20.1 + '@babel/core': 7.20.2 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-environment-visitor/7.18.9: + resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name/7.19.0: + resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.20.2 + dev: true + + /@babel/helper-hoist-variables/7.18.6: + resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.2 + dev: true + + /@babel/helper-module-imports/7.18.6: + resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.2 + dev: true + + /@babel/helper-module-transforms/7.20.2: + resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-plugin-utils/7.20.2: + resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.2 + dev: true + + /@babel/helper-split-export-declaration/7.18.6: + resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.20.2 + dev: true + + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier/7.18.6: + resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier/7.19.1: + resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.18.6: + resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.20.1: + resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.18.10 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight/7.18.6: + resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.18.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: true + + /@babel/parser/7.20.3: + resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.20.2 + dev: true + + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.2: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.2: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.2: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.2: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.2: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.2: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.2: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.2: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.20.2: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.20.2 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/runtime/7.18.6: + resolution: {integrity: sha512-t9wi7/AW6XtKahAe20Yw0/mMljKq0B1r2fPdvaAdV/KPDZewFXdaaa6K7lxmZBZ8FBNpCiAT6iHPmd6QO9bKfQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.9 + dev: true + + /@babel/template/7.18.10: + resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 + dev: true + + /@babel/traverse/7.20.1: + resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.20.4 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.20.2: + resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage/0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@changesets/apply-release-plan/6.1.1: + resolution: {integrity: sha512-LaQiP/Wf0zMVR0HNrLQAjz3rsNsr0d/RlnP6Ef4oi8VafOwnY1EoWdK4kssuUJGgNgDyHpomS50dm8CU3D7k7g==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/config': 2.2.0 + '@changesets/get-version-range-type': 0.3.2 + '@changesets/git': 1.5.0 + '@changesets/types': 5.2.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.7.1 + resolve-from: 5.0.0 + semver: 5.7.1 + dev: true + + /@changesets/assemble-release-plan/5.2.2: + resolution: {integrity: sha512-B1qxErQd85AeZgZFZw2bDKyOfdXHhG+X5S+W3Da2yCem8l/pRy4G/S7iOpEcMwg6lH8q2ZhgbZZwZ817D+aLuQ==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.4 + '@changesets/types': 5.2.0 + '@manypkg/get-packages': 1.1.3 + semver: 5.7.1 + dev: true + + /@changesets/changelog-git/0.1.13: + resolution: {integrity: sha512-zvJ50Q+EUALzeawAxax6nF2WIcSsC5PwbuLeWkckS8ulWnuPYx8Fn/Sjd3rF46OzeKA8t30loYYV6TIzp4DIdg==} + dependencies: + '@changesets/types': 5.2.0 + dev: true + + /@changesets/cli/2.25.0: + resolution: {integrity: sha512-Svu5KD2enurVHGEEzCRlaojrHjVYgF9srmMP9VQSy9c1TspX6C9lDPpulsSNIjYY9BuU/oiWpjBgR7RI9eQiAA==} + hasBin: true + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/apply-release-plan': 6.1.1 + '@changesets/assemble-release-plan': 5.2.2 + '@changesets/changelog-git': 0.1.13 + '@changesets/config': 2.2.0 + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.4 + '@changesets/get-release-plan': 3.0.15 + '@changesets/git': 1.5.0 + '@changesets/logger': 0.0.5 + '@changesets/pre': 1.0.13 + '@changesets/read': 0.5.8 + '@changesets/types': 5.2.0 + '@changesets/write': 0.2.1 + '@manypkg/get-packages': 1.1.3 + '@types/is-ci': 3.0.0 + '@types/semver': 6.2.3 + ansi-colors: 4.1.3 + chalk: 2.4.2 + enquirer: 2.3.6 + external-editor: 3.1.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + is-ci: 3.0.1 + meow: 6.1.1 + outdent: 0.5.0 + p-limit: 2.3.0 + preferred-pm: 3.0.3 + resolve-from: 5.0.0 + semver: 5.7.1 + spawndamnit: 2.0.0 + term-size: 2.2.1 + tty-table: 4.1.6 + dev: true + + /@changesets/config/2.2.0: + resolution: {integrity: sha512-GGaokp3nm5FEDk/Fv2PCRcQCOxGKKPRZ7prcMqxEr7VSsG75MnChQE8plaW1k6V8L2bJE+jZWiRm19LbnproOw==} + dependencies: + '@changesets/errors': 0.1.4 + '@changesets/get-dependents-graph': 1.3.4 + '@changesets/logger': 0.0.5 + '@changesets/types': 5.2.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 + dev: true + + /@changesets/errors/0.1.4: + resolution: {integrity: sha512-HAcqPF7snsUJ/QzkWoKfRfXushHTu+K5KZLJWPb34s4eCZShIf8BFO3fwq6KU8+G7L5KdtN2BzQAXOSXEyiY9Q==} + dependencies: + extendable-error: 0.1.7 + dev: true + + /@changesets/get-dependents-graph/1.3.4: + resolution: {integrity: sha512-+C4AOrrFY146ydrgKOo5vTZfj7vetNu1tWshOID+UjPUU9afYGDXI8yLnAeib1ffeBXV3TuGVcyphKpJ3cKe+A==} + dependencies: + '@changesets/types': 5.2.0 + '@manypkg/get-packages': 1.1.3 + chalk: 2.4.2 + fs-extra: 7.0.1 + semver: 5.7.1 + dev: true + + /@changesets/get-github-info/0.5.1: + resolution: {integrity: sha512-w2yl3AuG+hFuEEmT6j1zDlg7GQLM/J2UxTmk0uJBMdRqHni4zXGe/vUlPfLom5KfX3cRfHc0hzGvloDPjWFNZw==} + dependencies: + dataloader: 1.4.0 + node-fetch: 2.6.7 + transitivePeerDependencies: + - encoding + dev: true + + /@changesets/get-release-plan/3.0.15: + resolution: {integrity: sha512-W1tFwxE178/en+zSj/Nqbc3mvz88mcdqUMJhRzN1jDYqN3QI4ifVaRF9mcWUU+KI0gyYEtYR65tour690PqTcA==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/assemble-release-plan': 5.2.2 + '@changesets/config': 2.2.0 + '@changesets/pre': 1.0.13 + '@changesets/read': 0.5.8 + '@changesets/types': 5.2.0 + '@manypkg/get-packages': 1.1.3 + dev: true + + /@changesets/get-version-range-type/0.3.2: + resolution: {integrity: sha512-SVqwYs5pULYjYT4op21F2pVbcrca4qA/bAA3FmFXKMN7Y+HcO8sbZUTx3TAy2VXulP2FACd1aC7f2nTuqSPbqg==} + dev: true + + /@changesets/git/1.5.0: + resolution: {integrity: sha512-Xo8AT2G7rQJSwV87c8PwMm6BAc98BnufRMsML7m7Iw8Or18WFvFmxqG5aOL5PBvhgq9KrKvaeIBNIymracSuHg==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/errors': 0.1.4 + '@changesets/types': 5.2.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + spawndamnit: 2.0.0 + dev: true + + /@changesets/logger/0.0.5: + resolution: {integrity: sha512-gJyZHomu8nASHpaANzc6bkQMO9gU/ib20lqew1rVx753FOxffnCrJlGIeQVxNWCqM+o6OOleCo/ivL8UAO5iFw==} + dependencies: + chalk: 2.4.2 + dev: true + + /@changesets/parse/0.3.15: + resolution: {integrity: sha512-3eDVqVuBtp63i+BxEWHPFj2P1s3syk0PTrk2d94W9JD30iG+OER0Y6n65TeLlY8T2yB9Fvj6Ev5Gg0+cKe/ZUA==} + dependencies: + '@changesets/types': 5.2.0 + js-yaml: 3.14.1 + dev: true + + /@changesets/pre/1.0.13: + resolution: {integrity: sha512-jrZc766+kGZHDukjKhpBXhBJjVQMied4Fu076y9guY1D3H622NOw8AQaLV3oQsDtKBTrT2AUFjt9Z2Y9Qx+GfA==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/errors': 0.1.4 + '@changesets/types': 5.2.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + dev: true + + /@changesets/read/0.5.8: + resolution: {integrity: sha512-eYaNfxemgX7f7ELC58e7yqQICW5FB7V+bd1lKt7g57mxUrTveYME+JPaBPpYx02nP53XI6CQp6YxnR9NfmFPKw==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/git': 1.5.0 + '@changesets/logger': 0.0.5 + '@changesets/parse': 0.3.15 + '@changesets/types': 5.2.0 + chalk: 2.4.2 + fs-extra: 7.0.1 + p-filter: 2.1.0 + dev: true + + /@changesets/types/4.1.0: + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + dev: true + + /@changesets/types/5.2.0: + resolution: {integrity: sha512-km/66KOqJC+eicZXsm2oq8A8bVTSpkZJ60iPV/Nl5Z5c7p9kk8xxh6XGRTlnludHldxOOfudhnDN2qPxtHmXzA==} + dev: true + + /@changesets/write/0.2.1: + resolution: {integrity: sha512-KUd49nt2fnYdGixIqTi1yVE1nAoZYUMdtB3jBfp77IMqjZ65hrmZE5HdccDlTeClZN0420ffpnfET3zzeY8pdw==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/types': 5.2.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.7.1 + dev: true + + /@gar/promisify/1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: true + + /@istanbuljs/load-nyc-config/1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema/0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console/29.3.1: + resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + slash: 3.0.0 + dev: true + + /@jest/core/29.3.1: + resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.3.1 + '@jest/reporters': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.3.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + jest-changed-files: 29.2.0 + jest-config: 29.3.1_@types+node@18.11.9 + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-resolve-dependencies: 29.3.1 + jest-runner: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + jest-watcher: 29.3.1 + micromatch: 4.0.5 + pretty-format: 29.3.1 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + dev: true + + /@jest/environment/29.3.1: + resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + jest-mock: 29.3.1 + dev: true + + /@jest/expect-utils/29.3.1: + resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.2.0 + dev: true + + /@jest/expect/29.3.1: + resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.3.1 + jest-snapshot: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers/29.3.1: + resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@sinonjs/fake-timers': 9.1.2 + '@types/node': 18.11.9 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-util: 29.3.1 + dev: true + + /@jest/globals/29.3.1: + resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/types': 29.3.1 + jest-mock: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters/29.3.1: + resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.17 + '@types/node': 18.11.9 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.5 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + jest-worker: 29.3.1 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas/29.0.0: + resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.24.51 + dev: true + + /@jest/source-map/29.2.0: + resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + callsites: 3.1.0 + graceful-fs: 4.2.10 + dev: true + + /@jest/test-result/29.3.1: + resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.3.1 + '@jest/types': 29.3.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.1 + dev: true + + /@jest/test-sequencer/29.3.1: + resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.3.1 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + slash: 3.0.0 + dev: true + + /@jest/transform/29.3.1: + resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.20.2 + '@jest/types': 29.3.1 + '@jridgewell/trace-mapping': 0.3.17 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types/29.3.1: + resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.1 + '@types/node': 18.11.9 + '@types/yargs': 17.0.13 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@jridgewell/gen-mapping/0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + + /@jridgewell/resolve-uri/3.1.0: + resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.4.14: + resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + dev: true + + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + + /@manypkg/find-root/1.1.0: + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + dependencies: + '@babel/runtime': 7.18.6 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + dev: true + + /@manypkg/get-packages/1.1.3: + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + dependencies: + '@babel/runtime': 7.18.6 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + dev: true + + /@marionebl/bundle-id/2.0.1: + resolution: {integrity: sha512-Mfj4xyHpfmIh45Hd7AaW1+YT2u39p7OxSsZiFkzg3f02QDTXXdyG8aBbgWnQZCBrfheMmJkYX9/gYkxAn7BioQ==} + engines: {node: '>=4'} + dependencies: + '@marionebl/run-applescript': 3.0.0 + dev: true + + /@marionebl/is/0.5.1-0: + resolution: {integrity: sha512-EEU1UUsQQzMaH7nyzB7VzasjtAAMJyN7QNXYL4ghhmcvbrvrHbfcTWCiyjkPjorADxI2gUCINMNiXQc46UFxUA==} + engines: {node: '>=4'} + dev: true + + /@marionebl/run-applescript/3.0.0: + resolution: {integrity: sha512-dhNj9Y8e+vxWvguBJMK1gSqyR9P5l9QeKtWS+yDDPu2GOb1EgLqvVS9KtPyGnpmvHNiEh+toiwrTuvbbO8bB7A==} + engines: {node: '>=4'} + dependencies: + execa: 0.4.0 + dev: true + + /@marionebl/sander/0.6.1: + resolution: {integrity: sha512-7f3zZddAk92G1opoX/glbDO6YbrzmMAJAw0RJAcvunnV7sR4L9llyBUAABptKoF1Jf37UQ1QTJy5p2H4J4rBNA==} + dependencies: + graceful-fs: 4.2.10 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: true + + /@nodelib/fs.scandir/2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat/2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk/1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.13.0 + dev: true + + /@npmcli/fs/1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.3.7 + dev: true + + /@npmcli/move-file/1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: true + + /@sinclair/typebox/0.24.51: + resolution: {integrity: sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==} + dev: true + + /@sinonjs/commons/1.8.5: + resolution: {integrity: sha512-rTpCA0wG1wUxglBSFdMMY0oTrKYvgf4fNgv/sXbfCVAdf+FnPBdKJR/7XbpTCwbCrvCbdPYnlWaUUYz4V2fPDA==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers/9.1.2: + resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==} + dependencies: + '@sinonjs/commons': 1.8.5 + dev: true + + /@stiligita/constants/1.0.0-0: + resolution: {integrity: sha512-lDrQuFkKRiG/YHa71hWLOiRpiAvsG9stTb3yizjNBV27QRi5TqLjrM1WEkprvrjeZpiEjXNXH3Kz7Jnng7JTCQ==} + dev: true + + /@stiligita/core/1.0.0-0: + resolution: {integrity: sha512-9vFUJARAQQzljemVKvrJTQ1xb1ZDhzjH1MP722tlDjygd8CPgi0m6WIVXXpqLFGG2h5gFxWSzcAZI/a/AKAGzw==} + dependencies: + '@stiligita/constants': 1.0.0-0 + '@stiligita/dom': 1.0.0-0 + '@stiligita/dom-elements': 1.0.0-0 + dev: true + + /@stiligita/dom-elements/1.0.0-0: + resolution: {integrity: sha512-WFjVHN8bm/6GxmxgPuVjOjtT41Azn4QaMn090F2BCYx8vh/AvN2TpHXJiuCfOYtdDtZ1AQK2x7qdpF7BAZ5ILg==} + dependencies: + '@stiligita/utils': 1.0.0-0 + dev: true + + /@stiligita/dom/1.0.0-0: + resolution: {integrity: sha512-7tAugrbH5V8a44qB00tqasbfPuhQv4UCNr88l+BjzPffluqDvKa3N2m3m7XGOQBVkVMYHi8HGlLZnWSVSu5xig==} + dependencies: + '@stiligita/constants': 1.0.0-0 + dev: true + + /@stiligita/hash-code/1.0.0-0: + resolution: {integrity: sha512-ZDKVLZVmwtA+/e5WyidITspB+nH9LQ1RSfj43CwDubuWXgqJT3u6ya/9r0eu5JRhTzsLWUHHPveqFLzBozUpDg==} + dev: true + + /@stiligita/keyframes/1.0.0-0: + resolution: {integrity: sha512-T5fB0Ff0Fgj4JJTqBjugHpoWzB6bGrBJj3zpu7xxsbq2+Sw6sg/3bPQF6Dk7j1FaNk2KeEL9GDCiLh2oZKyghg==} + dependencies: + '@stiligita/hash-code': 1.0.0-0 + '@stiligita/store': 1.0.0-0 + '@stiligita/templates': 1.0.0-0 + dev: true + + /@stiligita/react/1.0.0-0: + resolution: {integrity: sha512-Lk3pK6OEGu2bBTt4ZZaE/SEPpIYiUpIQN7LwCJWKpsnfbaqs6dD1rqrD/GUH/OJs2jM3ZUc3c+rMej/zxV0MpA==} + dependencies: + '@stiligita/constants': 1.0.0-0 + '@stiligita/core': 1.0.0-0 + '@stiligita/dom': 1.0.0-0 + '@stiligita/hash-code': 1.0.0-0 + '@stiligita/keyframes': 1.0.0-0 + '@stiligita/store': 1.0.0-0 + '@stiligita/stylesheets': 1.0.0-0 + '@stiligita/templates': 1.0.0-0 + '@stiligita/utils': 1.0.0-0 + dev: true + + /@stiligita/store/1.0.0-0: + resolution: {integrity: sha512-kFKC9bEYt5142N07P3b8Ly0r5R0yF3V2aAQHjf2oq6iY/ZFeDKzQ+pVUf+KKL7nRiVk9dnXltAVKmtsVaBebeg==} + dependencies: + '@stiligita/dom': 1.0.0-0 + '@stiligita/stylesheets': 1.0.0-0 + '@stiligita/utils': 1.0.0-0 + dev: true + + /@stiligita/stylesheets/1.0.0-0: + resolution: {integrity: sha512-tOPRnUyZtbBmz50y28BKD3Ip4IxPxKMwFqcFc92qiy5XDNH84Q6duLFlcVM0EMUdNiL0/UMbf7+jBIboZn4Lfg==} + dependencies: + '@stiligita/constants': 1.0.0-0 + '@stiligita/dom': 1.0.0-0 + '@stiligita/store': 1.0.0-0 + dev: true + + /@stiligita/templates/1.0.0-0: + resolution: {integrity: sha512-2GpffrhWKX1xGgmKss1dG4xcNTiRNwB5oJQCVnL8Ikc5jQDjsd2wGpp78DY1bcMepSD/me+0q1CsjM5hgFbjdw==} + dependencies: + '@stiligita/utils': 1.0.0-0 + dev: true + + /@stiligita/utils/1.0.0-0: + resolution: {integrity: sha512-8RRAMOB+vEC8FknZtoNKQnttATUN9uERYFC7+qjsd3X3UTb3o2oqVmLFU/kUY5Q72PxbBQqX7u0NAEnEytuMtA==} + dev: true + + /@svitejs/changesets-changelog-github-compact/0.1.1: + resolution: {integrity: sha512-eBi211CfmKtkxB6tINicaDPBMbolswPbaAy7kCx+uUFL/LxztLm9cB+7jP54TgCrv+mMz8vSJWIs/baH63PjsA==} + engines: {node: ^12.20 || ^14.13.1 || >= 16} + dependencies: + '@changesets/get-github-info': 0.5.1 + dotenv: 16.0.3 + transitivePeerDependencies: + - encoding + dev: true + + /@tootallnate/once/1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: true + + /@types/babel__core/7.1.20: + resolution: {integrity: sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==} + dependencies: + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 + '@types/babel__generator': 7.6.4 + '@types/babel__template': 7.4.1 + '@types/babel__traverse': 7.18.2 + dev: true + + /@types/babel__generator/7.6.4: + resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} + dependencies: + '@babel/types': 7.20.2 + dev: true + + /@types/babel__template/7.4.1: + resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} + dependencies: + '@babel/parser': 7.20.3 + '@babel/types': 7.20.2 + dev: true + + /@types/babel__traverse/7.18.2: + resolution: {integrity: sha512-FcFaxOr2V5KZCviw1TnutEMVUVsGt4D2hP1TAfXZAMKuHYW3xQhe3jTxNPWutgCJ3/X1c5yX8ZoGVEItxKbwBg==} + dependencies: + '@babel/types': 7.20.2 + dev: true + + /@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 3.0.5 + '@types/node': 18.11.9 + dev: true + + /@types/globby/6.1.0: + resolution: {integrity: sha512-j3XSDNoK4LO5T+ZviQD6PqfEjm07QFEacOTbJR3hnLWuWX0ZMLJl9oRPgj1PyrfGbXhfHFkksC9QZ9HFltJyrw==} + dependencies: + '@types/glob': 7.2.0 + dev: true + + /@types/graceful-fs/4.1.5: + resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} + dependencies: + '@types/node': 18.11.9 + dev: true + + /@types/ini/1.3.31: + resolution: {integrity: sha512-8ecxxaG4AlVEM1k9+BsziMw8UsX0qy3jYI1ad/71RrDZ+rdL6aZB0wLfAuflQiDhkD5o4yJ0uPK3OSUic3fG0w==} + dev: true + + /@types/is-ci/3.0.0: + resolution: {integrity: sha512-Q0Op0hdWbYd1iahB+IFNQcWXFq4O0Q5MwQP7uN0souuQ4rPg1vEYcnIOfr1gY+M+6rc8FGoRaBO1mOOvL29sEQ==} + dependencies: + ci-info: 3.3.2 + dev: true + + /@types/istanbul-lib-coverage/2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports/3.0.1: + resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==} + dependencies: + '@types/istanbul-lib-report': 3.0.0 + dev: true + + /@types/jest/21.1.10: + resolution: {integrity: sha512-qDyqzbcyNgW2RgWbl606xCYQ+5fK9khOW5+Hl3wH7RggVES0dB6GcZvpmPs/XIty5qpu1xYCwpiK+iRkJ3xFBw==} + dev: true + + /@types/jest/29.2.3: + resolution: {integrity: sha512-6XwoEbmatfyoCjWRX7z0fKMmgYKe9+/HrviJ5k0X/tjJWHGAezZOfYaxqQKuzG/TvQyr+ktjm4jgbk0s4/oF2w==} + dependencies: + expect: 29.3.1 + pretty-format: 29.3.1 + dev: true + + /@types/lodash/4.14.182: + resolution: {integrity: sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==} + dev: true + + /@types/minimatch/3.0.5: + resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + dev: true + + /@types/minimist/1.2.2: + resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + dev: true + + /@types/node/12.20.55: + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + dev: true + + /@types/node/18.11.9: + resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==} + dev: true + + /@types/node/8.10.66: + resolution: {integrity: sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==} + dev: true + + /@types/normalize-package-data/2.4.1: + resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + dev: true + + /@types/prettier/2.7.1: + resolution: {integrity: sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==} + dev: true + + /@types/q/1.5.5: + resolution: {integrity: sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==} + dev: true + + /@types/semver/6.2.3: + resolution: {integrity: sha512-KQf+QAMWKMrtBMsB8/24w53tEsxllMj6TuA80TT/5igJalLI/zm0L3oXRbIAl4Ohfc85gyHX/jhMwsVkmhLU4A==} + dev: true + + /@types/shell-escape/0.2.1: + resolution: {integrity: sha512-95hZXmBvwtvsLMPefKT9xquUSAJXsVDUaipyUiYoYi3ZdLhZ3w30w230Ugs96IdoJQb5ECvj0D82Jj/op00qWQ==} + dev: true + + /@types/stack-utils/2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/yargs-parser/21.0.0: + resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==} + dev: true + + /@types/yargs/17.0.13: + resolution: {integrity: sha512-9sWaruZk2JGxIQU+IhI1fhPYRcQ0UuTNuKuCW9bR5fp7qi2Llf7WDzNa17Cy7TKnh3cdxDOiyTu6gaLS0eDatg==} + dependencies: + '@types/yargs-parser': 21.0.0 + dev: true + + /abcq/1.0.2: + resolution: {integrity: sha512-Fjk/LXe1aHL7zQcjqDoKhYuIdB3iyv1S3/YJNPe6D0QjJuKXKq+N6ei5kVZtsr0Rp6ueTmhW4yZlLQaIKptyFg==} + dependencies: + tslib: 1.14.1 + dev: true + + /agent-base/6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /agentkeepalive/4.2.1: + resolution: {integrity: sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==} + engines: {node: '>= 8.0.0'} + dependencies: + debug: 4.3.4 + depd: 1.1.2 + humanize-ms: 1.2.1 + transitivePeerDependencies: + - supports-color + dev: true + + /aggregate-error/1.0.0: + resolution: {integrity: sha512-7heCOdGepPfjajU0Hi8wJypLsZIB6AeDN/YzW+Mmy8QU7iaEW579WzA9cWbke3cGYwmBazCVL2Zzdhq+iQ6pBg==} + engines: {node: '>=4'} + dependencies: + clean-stack: 1.3.0 + indent-string: 3.2.0 + dev: true + + /aggregate-error/3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: true + + /ansi-colors/4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: true + + /ansi-escapes/4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex/5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: true + + /ansi-styles/3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: true + + /ansi-styles/4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-to-rgb/1.0.0: + resolution: {integrity: sha512-Si3NA3kWxKg12Aj+IVElMbYZ1l0OC0g+goa6Xn0sA2vp8GMiGp6AnVbMvwNQjkEB6WSb4SVyGflxuoTaNucQIw==} + dev: true + + /any-promise/1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch/3.1.2: + resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /argparse/1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /array-find-index/1.0.2: + resolution: {integrity: sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==} + engines: {node: '>=0.10.0'} + dev: true + + /array-union/2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.flat/1.3.0: + resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.reduce/1.0.4: + resolution: {integrity: sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + es-array-method-boxes-properly: 1.0.0 + is-string: 1.0.7 + dev: true + + /arrify/1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + dev: true + + /babel-jest/29.3.1_@babel+core@7.20.2: + resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.20.2 + '@jest/transform': 29.3.1 + '@types/babel__core': 7.1.20 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.2.0_@babel+core@7.20.2 + chalk: 4.1.2 + graceful-fs: 4.2.10 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.20.2 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist/29.2.0: + resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.18.10 + '@babel/types': 7.20.2 + '@types/babel__core': 7.1.20 + '@types/babel__traverse': 7.18.2 + dev: true + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.2: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2 + dev: true + + /babel-preset-jest/29.2.0_@babel+core@7.20.2: + resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.20.2 + babel-plugin-jest-hoist: 29.2.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 + dev: true + + /balanced-match/1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: true + + /base64-js/1.2.0: + resolution: {integrity: sha512-hURVuTTGLOppKhjSe9lZy4NCjnvaIAF/juwazv4WtHwsk5rxKrU1WbxN+XtwKDSvkrNbIIaTBQd9wUsSwruZUg==} + dev: true + + /better-path-resolve/1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + dependencies: + is-windows: 1.0.2 + dev: true + + /big-integer/1.6.51: + resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} + engines: {node: '>=0.6'} + dev: true + + /boolbase/1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + + /bplist-parser/0.1.1: + resolution: {integrity: sha512-2AEM0FXy8ZxVLBuqX0hqt1gDwcnz2zygEkQ6zaD5Wko/sB9paUNwlpawrFtKeHUAQUOzjVy9AO4oeonqIHKA9Q==} + dependencies: + big-integer: 1.6.51 + dev: true + + /brace-expansion/1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces/3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /breakword/1.0.5: + resolution: {integrity: sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==} + dependencies: + wcwidth: 1.0.1 + dev: true + + /browserslist/4.21.4: + resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001431 + electron-to-chromium: 1.4.284 + node-releases: 2.0.6 + update-browserslist-db: 1.0.10_browserslist@4.21.4 + dev: true + + /bs-logger/0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser/2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + + /cacache/15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.4 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.1.11 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: true + + /call-bind/1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.2 + dev: true + + /callsites/3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-keys/2.1.0: + resolution: {integrity: sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==} + engines: {node: '>=0.10.0'} + dependencies: + camelcase: 2.1.1 + map-obj: 1.0.1 + dev: true + + /camelcase-keys/6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + dev: true + + /camelcase/2.1.1: + resolution: {integrity: sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==} + engines: {node: '>=0.10.0'} + dev: true + + /camelcase/5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase/6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite/1.0.30001431: + resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==} + dev: true + + /chalk/2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: true + + /chalk/4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk/5.1.2: + resolution: {integrity: sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /char-regex/1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet/0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + dev: true + + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + + /ci-info/3.3.2: + resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==} + dev: true + + /cjs-module-lexer/1.2.2: + resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==} + dev: true + + /clean-stack/1.3.0: + resolution: {integrity: sha512-4CCmhqt4yqbQQI9REDKCf+N6U3SToC5o7PoKCq4veHvr30TJ2Vmz1mYYF23VC0E7Z13tf4CXh9jXY0VC+Jtdng==} + engines: {node: '>=4'} + dev: true + + /clean-stack/2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: true + + /cli-highlight/2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + dev: true + + /cliui/6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + dev: true + + /cliui/7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /clone/1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + dev: true + + /cmd-ts/0.11.0: + resolution: {integrity: sha512-6RvjD+f9oGPeWoMS53oavafmQ9qC839PjP3CyvPkAIfqMEXTbrclni7t3fnyVJFNWxuBexnLshcotY0RuNrI8Q==} + dependencies: + chalk: 4.1.2 + debug: 4.3.4 + didyoumean: 1.2.2 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: true + + /co/4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /coa/2.0.2: + resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==} + engines: {node: '>= 4.0'} + dependencies: + '@types/q': 1.5.5 + chalk: 2.4.2 + q: 1.5.1 + dev: true + + /collect-v8-coverage/1.0.1: + resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==} + dev: true + + /color-convert/1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: true + + /color-convert/2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: true + + /color-name/1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: true + + /color-name/1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: true + + /color-string/1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: true + + /color/2.0.1: + resolution: {integrity: sha512-ubUCVVKfT7r2w2D3qtHakj8mbmKms+tThR8gI8zEYCbUBl8/voqFGt3kgBqGwXAopgXybnkuOq+qMYCRrp4cXw==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: true + + /command-exists/1.2.9: + resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} + dev: true + + /concat-map/0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + + /convert-source-map/1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /core-util-is/1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: true + + /cross-env/7.0.3: + resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} + engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dev: true + + /cross-spawn-async/2.2.5: + resolution: {integrity: sha512-snteb3aVrxYYOX9e8BabYFK9WhCDhTlw1YQktfTthBogxri4/2r9U2nQc0ffY73ZAxezDc+U8gvHAeU1wy1ubQ==} + deprecated: cross-spawn no longer requires a build toolchain, use it instead + dependencies: + lru-cache: 4.1.5 + which: 1.3.1 + dev: true + + /cross-spawn/5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + + /cross-spawn/7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: true + + /crypto-random-string/1.0.0: + resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} + engines: {node: '>=4'} + dev: true + + /css-select-base-adapter/0.1.1: + resolution: {integrity: sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==} + dev: true + + /css-select/2.1.0: + resolution: {integrity: sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==} + dependencies: + boolbase: 1.0.0 + css-what: 3.4.2 + domutils: 1.7.0 + nth-check: 1.0.2 + dev: true + + /css-tree/1.0.0-alpha.37: + resolution: {integrity: sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.4 + source-map: 0.6.1 + dev: true + + /css-tree/1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what/3.4.2: + resolution: {integrity: sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==} + engines: {node: '>= 6'} + dev: true + + /csso/4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + + /csv-generate/3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + dev: true + + /csv-parse/4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + dev: true + + /csv-stringify/5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + dev: true + + /csv/5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + dev: true + + /currently-unhandled/0.4.1: + resolution: {integrity: sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==} + engines: {node: '>=0.10.0'} + dependencies: + array-find-index: 1.0.2 + dev: true + + /dataloader/1.4.0: + resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} + dev: true + + /debug/4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /decamelize-keys/1.1.0: + resolution: {integrity: sha512-ocLWuYzRPoS9bfiSdDd3cxvrzovVMZnRDVEzAs+hWIVXGDbHxWMECij2OBuyB/An0FFW/nLuq6Kv1i/YC5Qfzg==} + engines: {node: '>=0.10.0'} + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + dev: true + + /decamelize/1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /dedent/0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deepmerge/4.2.2: + resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} + engines: {node: '>=0.10.0'} + dev: true + + /defaults/1.0.3: + resolution: {integrity: sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==} + dependencies: + clone: 1.0.4 + dev: true + + /define-properties/1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + + /depd/1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: true + + /detect-indent/6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + dev: true + + /detect-newline/3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /didyoumean/1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /diff-sequences/29.3.1: + resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /dir-glob/3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /dom-serializer/0.2.2: + resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==} + dependencies: + domelementtype: 2.3.0 + entities: 2.2.0 + dev: true + + /domelementtype/1.3.1: + resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==} + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domutils/1.7.0: + resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} + dependencies: + dom-serializer: 0.2.2 + domelementtype: 1.3.1 + dev: true + + /dotenv/16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + dev: true + + /electron-to-chromium/1.4.284: + resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} + dev: true + + /emittery/0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + dev: true + + /emoji-regex/8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: true + + /encoding/0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: true + + /enquirer/2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + dev: true + + /entities/2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + dev: true + + /err-code/2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: true + + /error-ex/1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + dev: true + + /es-abstract/1.20.1: + resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.1.2 + get-symbol-description: 1.0.0 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-symbols: 1.0.3 + internal-slot: 1.0.3 + is-callable: 1.2.4 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.2 + regexp.prototype.flags: 1.4.3 + string.prototype.trimend: 1.0.5 + string.prototype.trimstart: 1.0.5 + unbox-primitive: 1.0.2 + dev: true + + /es-array-method-boxes-properly/1.0.0: + resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} + dev: true + + /es-shim-unscopables/1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.3 + dev: true + + /es-to-primitive/1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.4 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /escalade/3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp/1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: true + + /escape-string-regexp/2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /esprima/4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /execa/0.4.0: + resolution: {integrity: sha512-QPexBaNjeOjyiZ47q0FCukTO1kX3F+HMM0EWpnxXddcr3MZtElILMkz9Y38nmSZtp03+ZiSRMffrKWBPOIoSIg==} + engines: {node: '>=0.12'} + dependencies: + cross-spawn-async: 2.2.5 + is-stream: 1.1.0 + npm-run-path: 1.0.0 + object-assign: 4.1.1 + path-key: 1.0.0 + strip-eof: 1.0.0 + dev: true + + /execa/0.8.0: + resolution: {integrity: sha512-zDWS+Rb1E8BlqqhALSt9kUhss8Qq4nN3iof3gsOdyINksElaPyNBtKUMTR62qhvgVWR0CqCX7sdnKe4MnUbFEA==} + engines: {node: '>=4'} + dependencies: + cross-spawn: 5.1.0 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + + /execa/5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /execa/6.1.0: + resolution: {integrity: sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 3.0.1 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 3.0.7 + strip-final-newline: 3.0.0 + dev: true + + /exit/0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect/29.3.1: + resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.3.1 + jest-get-type: 29.2.0 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + dev: true + + /extendable-error/0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + dev: true + + /external-editor/3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + dev: true + + /fast-glob/3.2.11: + resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify/2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fastq/1.13.0: + resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman/2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fill-range/7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + + /find-up/1.1.2: + resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} + engines: {node: '>=0.10.0'} + dependencies: + path-exists: 2.1.0 + pinkie-promise: 2.0.1 + dev: true + + /find-up/4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /find-yarn-workspace-root2/1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: true + + /fs-extra/7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-extra/8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.10 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + dev: true + + /fs.realpath/1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents/2.3.2: + resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind/1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true + + /function.prototype.name/1.1.5: + resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names/1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file/2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + dev: true + + /get-intrinsic/1.1.2: + resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + + /get-package-type/0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stdin/4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + dev: true + + /get-stdin/5.0.1: + resolution: {integrity: sha512-jZV7n6jGE3Gt7fgSTJoz91Ak5MuTLwMwkoYdjxuJ/AmjIsE1UC03y/IWkZCQGEvVNS9qoRNwy5BCqxImv0FVeA==} + engines: {node: '>=0.12.0'} + dev: true + + /get-stream/3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + dev: true + + /get-stream/6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description/1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.2 + dev: true + + /glob-parent/5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob/7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globby/11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.11 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /graceful-fs/4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + dev: true + + /grapheme-splitter/1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + dev: true + + /guess-terminal/1.0.0: + resolution: {integrity: sha512-CuErhdmGIkLiIveV6MiGoe7jqQBNGK67Khn8VgZHyQasVwcOEzG3WW/YTE8i5B5SY+T0xbgR4Nq+Asb6xMlTJQ==} + engines: {node: '>= 6'} + dev: true + + /hard-rejection/2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + dev: true + + /has-bigints/1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag/3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: true + + /has-flag/4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors/1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.1.2 + dev: true + + /has-symbols/1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag/1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has/1.0.3: + resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} + engines: {node: '>= 0.4.0'} + dependencies: + function-bind: 1.1.1 + dev: true + + /hex-rgb/1.0.0: + resolution: {integrity: sha512-RXIfX+4KhhQQM1XWFaMghHtVj7LfKhpFhV8PlrSTyFwGN25q8hMQ5/QoqPj0j1l58TluQj3cqOFdSB30sb/iQA==} + engines: {node: '>=0.10.0'} + dev: true + + /highlight.js/10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + dev: true + + /hosted-git-info/2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + dev: true + + /hosted-git-info/4.1.0: + resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} + engines: {node: '>=10'} + dependencies: + lru-cache: 6.0.0 + dev: true + + /html-escaper/2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-cache-semantics/4.1.0: + resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} + dev: true + + /http-proxy-agent/4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /https-proxy-agent/5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /human-id/1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + dev: true + + /human-signals/2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /human-signals/3.0.1: + resolution: {integrity: sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==} + engines: {node: '>=12.20.0'} + dev: true + + /humanize-ms/1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + dependencies: + ms: 2.1.3 + dev: true + + /iconv-lite/0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /iconv-lite/0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: true + + /ignore/5.2.0: + resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==} + engines: {node: '>= 4'} + dev: true + + /import-local/3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash/0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /indent-string/2.1.0: + resolution: {integrity: sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==} + engines: {node: '>=0.10.0'} + dependencies: + repeating: 2.0.1 + dev: true + + /indent-string/3.2.0: + resolution: {integrity: sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==} + engines: {node: '>=4'} + dev: true + + /indent-string/4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: true + + /infer-owner/1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: true + + /inflight/1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits/2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + + /ini/1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + dev: true + + /internal-slot/1.0.3: + resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.1.2 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + + /ip/1.1.8: + resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} + dev: true + + /is-arrayish/0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: true + + /is-arrayish/0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: true + + /is-bigint/1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-boolean-object/1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-callable/1.2.4: + resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} + engines: {node: '>= 0.4'} + dev: true + + /is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + hasBin: true + dependencies: + ci-info: 3.3.2 + dev: true + + /is-core-module/2.9.0: + resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} + dependencies: + has: 1.0.3 + dev: true + + /is-date-object/1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-extglob/2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-finite/1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + dev: true + + /is-fullwidth-code-point/3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: true + + /is-generator-fn/2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob/4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-lambda/1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: true + + /is-negative-zero/2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object/1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-number/7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: true + + /is-plain-obj/1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + dev: true + + /is-regex/1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + + /is-shared-array-buffer/1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-stream/1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-stream/2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-stream/3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string/1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + dev: true + + /is-subdir/1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + dependencies: + better-path-resolve: 1.0.0 + dev: true + + /is-symbol/1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-utf8/0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + dev: true + + /is-weakref/1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + dev: true + + /is-windows/1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + dev: true + + /isarray/1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: true + + /isexe/2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true + + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument/5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.20.2 + '@babel/parser': 7.20.3 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report/3.0.0: + resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} + engines: {node: '>=8'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 3.1.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports/3.1.5: + resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + + /jest-changed-files/29.2.0: + resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + dev: true + + /jest-circus/29.3.1: + resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/expect': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-runtime: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + p-limit: 3.1.0 + pretty-format: 29.3.1 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli/29.3.1_@types+node@18.11.9: + resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.10 + import-local: 3.1.0 + jest-config: 29.3.1_@types+node@18.11.9 + jest-util: 29.3.1 + jest-validate: 29.3.1 + prompts: 2.4.2 + yargs: 17.5.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /jest-config/29.3.1_@types+node@18.11.9: + resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.20.2 + '@jest/test-sequencer': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + babel-jest: 29.3.1_@babel+core@7.20.2 + chalk: 4.1.2 + ci-info: 3.3.2 + deepmerge: 4.2.2 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-circus: 29.3.1 + jest-environment-node: 29.3.1 + jest-get-type: 29.2.0 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-runner: 29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.3.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-diff/29.3.1: + resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + + /jest-docblock/29.2.0: + resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each/29.3.1: + resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + chalk: 4.1.2 + jest-get-type: 29.2.0 + jest-util: 29.3.1 + pretty-format: 29.3.1 + dev: true + + /jest-environment-node/29.3.1: + resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + jest-mock: 29.3.1 + jest-util: 29.3.1 + dev: true + + /jest-get-type/29.2.0: + resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map/29.3.1: + resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/graceful-fs': 4.1.5 + '@types/node': 18.11.9 + anymatch: 3.1.2 + fb-watchman: 2.0.2 + graceful-fs: 4.2.10 + jest-regex-util: 29.2.0 + jest-util: 29.3.1 + jest-worker: 29.3.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + dev: true + + /jest-leak-detector/29.3.1: + resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + + /jest-matcher-utils/29.3.1: + resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + pretty-format: 29.3.1 + dev: true + + /jest-message-util/29.3.1: + resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 29.3.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.10 + micromatch: 4.0.5 + pretty-format: 29.3.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock/29.3.1: + resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + jest-util: 29.3.1 + dev: true + + /jest-pnp-resolver/1.2.2_jest-resolve@29.3.1: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.3.1 + dev: true + + /jest-regex-util/29.2.0: + resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies/29.3.1: + resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.2.0 + jest-snapshot: 29.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve/29.3.1: + resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-pnp-resolver: 1.2.2_jest-resolve@29.3.1 + jest-util: 29.3.1 + jest-validate: 29.3.1 + resolve: 1.22.1 + resolve.exports: 1.1.0 + slash: 3.0.0 + dev: true + + /jest-runner/29.3.1: + resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.3.1 + '@jest/environment': 29.3.1 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.10 + jest-docblock: 29.2.0 + jest-environment-node: 29.3.1 + jest-haste-map: 29.3.1 + jest-leak-detector: 29.3.1 + jest-message-util: 29.3.1 + jest-resolve: 29.3.1 + jest-runtime: 29.3.1 + jest-util: 29.3.1 + jest-watcher: 29.3.1 + jest-worker: 29.3.1 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime/29.3.1: + resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.3.1 + '@jest/fake-timers': 29.3.1 + '@jest/globals': 29.3.1 + '@jest/source-map': 29.2.0 + '@jest/test-result': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.10 + jest-haste-map: 29.3.1 + jest-message-util: 29.3.1 + jest-mock: 29.3.1 + jest-regex-util: 29.2.0 + jest-resolve: 29.3.1 + jest-snapshot: 29.3.1 + jest-util: 29.3.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot/29.3.1: + resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.20.2 + '@babel/generator': 7.20.4 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.2 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.20.2 + '@babel/traverse': 7.20.1 + '@babel/types': 7.20.2 + '@jest/expect-utils': 29.3.1 + '@jest/transform': 29.3.1 + '@jest/types': 29.3.1 + '@types/babel__traverse': 7.18.2 + '@types/prettier': 2.7.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2 + chalk: 4.1.2 + expect: 29.3.1 + graceful-fs: 4.2.10 + jest-diff: 29.3.1 + jest-get-type: 29.2.0 + jest-haste-map: 29.3.1 + jest-matcher-utils: 29.3.1 + jest-message-util: 29.3.1 + jest-util: 29.3.1 + natural-compare: 1.4.0 + pretty-format: 29.3.1 + semver: 7.3.7 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util/29.3.1: + resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + chalk: 4.1.2 + ci-info: 3.3.2 + graceful-fs: 4.2.10 + picomatch: 2.3.1 + dev: true + + /jest-validate/29.3.1: + resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.3.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.2.0 + leven: 3.1.0 + pretty-format: 29.3.1 + dev: true + + /jest-watcher/29.3.1: + resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.3.1 + '@jest/types': 29.3.1 + '@types/node': 18.11.9 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.3.1 + string-length: 4.0.2 + dev: true + + /jest-worker/29.3.1: + resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.11.9 + jest-util: 29.3.1 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest/29.3.1_@types+node@18.11.9: + resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.3.1 + '@jest/types': 29.3.1 + import-local: 3.1.0 + jest-cli: 29.3.1_@types+node@18.11.9 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + + /js-tokens/4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml/3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /jsesc/2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: true + + /json5/2.2.1: + resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile/4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.10 + dev: true + + /kind-of/6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: true + + /kleur/3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /kleur/4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: true + + /lerna-changelog/2.2.0: + resolution: {integrity: sha512-yjYNAHrbnw8xYFKmYWJEP52Tk4xSdlNmzpYr26+3glbSGDmpe8UMo8f9DlEntjGufL+opup421oVTXcLshwAaQ==} + engines: {node: 12.* || 14.* || >= 16} + hasBin: true + dependencies: + chalk: 4.1.2 + cli-highlight: 2.1.11 + execa: 5.1.1 + hosted-git-info: 4.1.0 + make-fetch-happen: 9.1.0 + p-map: 3.0.0 + progress: 2.0.3 + yargs: 17.5.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /lines-and-columns/1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /load-asciicast/2.1.0: + resolution: {integrity: sha512-O/M86p6XAZLzlsQVNzbpyFMD2dZcFVcUPaaG7m4R8IQW9S2W4yh86AZbvoy5vDqOhS9rVacPMNdXkNMRQJXazQ==} + dev: true + + /load-json-file/1.1.0: + resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.10 + parse-json: 2.2.0 + pify: 2.3.0 + pinkie-promise: 2.0.1 + strip-bom: 2.0.0 + dev: true + + /load-yaml-file/0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.10 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /locate-path/5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.memoize/4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.startcase/4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: true + + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + + /loose-envify/1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /loud-rejection/1.6.0: + resolution: {integrity: sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==} + engines: {node: '>=0.10.0'} + dependencies: + currently-unhandled: 0.4.1 + signal-exit: 3.0.7 + dev: true + + /lru-cache/4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: true + + /lru-cache/6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: true + + /macos-app-config/1.0.1: + resolution: {integrity: sha512-uwq7imlYgHL8KTMRh3klKegSLAU8UN+CbZjExNZ/npoIi4RG2XSk5Ol04A08ttcqr0YZ+0tQZzpy4mtGJBSYgg==} + engines: {node: '>= 6'} + dependencies: + '@marionebl/bundle-id': 2.0.1 + '@marionebl/sander': 0.6.1 + bplist-parser: 0.1.1 + execa: 0.8.0 + dev: true + + /make-dir/3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.0 + dev: true + + /make-error/1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /make-fetch-happen/9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.2.1 + cacache: 15.3.0 + http-cache-semantics: 4.1.0 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.4 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: true + + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /map-obj/1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + dev: true + + /map-obj/4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + dev: true + + /mdn-data/2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /mdn-data/2.0.4: + resolution: {integrity: sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==} + dev: true + + /meow/3.7.0: + resolution: {integrity: sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==} + engines: {node: '>=0.10.0'} + dependencies: + camelcase-keys: 2.1.0 + decamelize: 1.2.0 + loud-rejection: 1.6.0 + map-obj: 1.0.1 + minimist: 1.2.6 + normalize-package-data: 2.5.0 + object-assign: 4.1.1 + read-pkg-up: 1.0.1 + redent: 1.0.0 + trim-newlines: 1.0.0 + dev: true + + /meow/6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + dependencies: + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 2.5.0 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.13.1 + yargs-parser: 18.1.3 + dev: true + + /merge-stream/2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2/1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch/4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mimic-fn/2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: true + + /mimic-fn/4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /min-indent/1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + dev: true + + /minimatch/3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + + /minimist-options/4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + dev: true + + /minimist/1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + dev: true + + /minipass-collect/1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + dev: true + + /minipass-fetch/1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.4 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: true + + /minipass-flush/1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + dev: true + + /minipass-pipeline/1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.4 + dev: true + + /minipass-sized/1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.4 + dev: true + + /minipass/3.3.4: + resolution: {integrity: sha512-I9WPbWHCGu8W+6k1ZiGpPu0GkoKBeorkfKNuAFBNS1HNFJvke82sxvI5bzcCNpWPorkOO5QQ+zomzzwRxejXiw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + yallist: 4.0.0 + dev: true + + /mixme/0.5.4: + resolution: {integrity: sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==} + engines: {node: '>= 8.0.0'} + dev: true + + /mkdirp/0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.6 + dev: true + + /mkdirp/1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: true + + /ms/2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: true + + /ms/2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: true + + /mz/2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /natural-compare/1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + + /node-fetch/1.7.3: + resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==} + dependencies: + encoding: 0.1.13 + is-stream: 1.1.0 + dev: true + + /node-fetch/2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: true + + /node-int64/0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases/2.0.6: + resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==} + dev: true + + /normalize-package-data/2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.1 + semver: 5.7.1 + validate-npm-package-license: 3.0.4 + dev: true + + /normalize-path/3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path/1.0.0: + resolution: {integrity: sha512-PrGAi1SLlqNvKN5uGBjIgnrTb8fl0Jz0a3JJmeMcGnIBh7UE9Gc4zsAMlwDajOMg2b1OgP6UPvoLUboTmMZPFA==} + engines: {node: '>=0.10.0'} + dependencies: + path-key: 1.0.0 + dev: true + + /npm-run-path/2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + dependencies: + path-key: 2.0.1 + dev: true + + /npm-run-path/4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /npm-run-path/5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /nth-check/1.0.2: + resolution: {integrity: sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==} + dependencies: + boolbase: 1.0.0 + dev: true + + /object-assign/4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: true + + /object-hash/1.3.1: + resolution: {integrity: sha512-OSuu/pU4ENM9kmREg0BdNrUDIl1heYa4mBZacJc+vVWz4GtAwu7jO8s4AIt2aGRUTqxykpWzI3Oqnsm13tTMDA==} + engines: {node: '>= 0.10.0'} + dev: true + + /object-inspect/1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: true + + /object-keys/1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign/4.1.2: + resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.getownpropertydescriptors/2.1.4: + resolution: {integrity: sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==} + engines: {node: '>= 0.8'} + dependencies: + array.prototype.reduce: 1.0.4 + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /object.values/1.1.5: + resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /once/1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + + /onetime/5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: true + + /onetime/6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /os-tmpdir/1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: true + + /outdent/0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + dev: true + + /p-filter/2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + dependencies: + p-map: 2.1.0 + dev: true + + /p-finally/1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: true + + /p-limit/2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate/4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map/2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + dev: true + + /p-map/3.0.0: + resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} + engines: {node: '>=8'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + + /p-try/2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /parse-json/2.2.0: + resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} + engines: {node: '>=0.10.0'} + dependencies: + error-ex: 1.3.2 + dev: true + + /parse-json/5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + + /parse5-htmlparser2-tree-adapter/6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + dependencies: + parse5: 6.0.1 + dev: true + + /parse5/5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + dev: true + + /parse5/6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /path-exists/2.1.0: + resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie-promise: 2.0.1 + dev: true + + /path-exists/4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute/1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/1.0.0: + resolution: {integrity: sha512-T3hWy7tyXlk3QvPFnT+o2tmXRzU4GkitkUWLp/WZ0S/FXd7XMx176tRurgTvHTNMJOQzTcesHNpBqetH86mQ9g==} + engines: {node: '>=0.10.0'} + dev: true + + /path-key/2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + dev: true + + /path-key/3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: true + + /path-key/4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-parse/1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-type/1.1.0: + resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} + engines: {node: '>=0.10.0'} + dependencies: + graceful-fs: 4.2.10 + pify: 2.3.0 + pinkie-promise: 2.0.1 + dev: true + + /path-type/4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: true + + /picomatch/2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify/2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pify/4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: true + + /pinkie-promise/2.0.1: + resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} + engines: {node: '>=0.10.0'} + dependencies: + pinkie: 2.0.4 + dev: true + + /pinkie/2.0.4: + resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates/4.0.5: + resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir/4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /plist/2.1.0: + resolution: {integrity: sha512-yirJ+8SSb8o7pkfyNv+fTzUP0GbK52HMvh0MjMycCxvpL8rHiAfKhXU/3R5znSJnrGakV0WNZhr8yTR4//PjyA==} + dependencies: + base64-js: 1.2.0 + xmlbuilder: 8.2.2 + xmldom: 0.1.31 + dev: true + + /preferred-pm/3.0.3: + resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: true + + /prettier/2.7.1: + resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format/29.3.1: + resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.0.0 + ansi-styles: 5.2.0 + react-is: 18.2.0 + dev: true + + /process-nextick-args/2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: true + + /progress-stream/2.0.0: + resolution: {integrity: sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==} + dependencies: + speedometer: 1.0.0 + through2: 2.0.5 + dev: true + + /progress/2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + dev: true + + /promise-inflight/1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: true + + /promise-retry/2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: true + + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /prop-types/15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /pseudomap/1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: true + + /pv/1.0.1: + resolution: {integrity: sha512-b+Okkpm5q5RMxdhPvP9gcZyH7PhlmcIdZblJh5fZjo8aw84bQ015m0oeMwVZOdCOLBxQZBLkz25NT74LwHzoAw==} + hasBin: true + dependencies: + bytes: 3.1.2 + minimist: 1.2.6 + progress-stream: 2.0.0 + dev: true + + /q/1.5.1: + resolution: {integrity: sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==} + engines: {node: '>=0.6.0', teleport: '>=0.2.0'} + dev: true + + /queue-microtask/1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-lru/4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + dev: true + + /react-dom/16.14.0_react@16.14.0: + resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} + peerDependencies: + react: ^16.14.0 + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + react: 16.14.0 + scheduler: 0.19.1 + dev: true + + /react-is/16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + dev: true + + /react/16.14.0: + resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + prop-types: 15.8.1 + dev: true + + /read-pkg-up/1.0.1: + resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} + engines: {node: '>=0.10.0'} + dependencies: + find-up: 1.1.2 + read-pkg: 1.1.0 + dev: true + + /read-pkg-up/7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + dev: true + + /read-pkg/1.1.0: + resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} + engines: {node: '>=0.10.0'} + dependencies: + load-json-file: 1.1.0 + normalize-package-data: 2.5.0 + path-type: 1.1.0 + dev: true + + /read-pkg/5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + dependencies: + '@types/normalize-package-data': 2.4.1 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + dev: true + + /read-yaml-file/1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.10 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: true + + /readable-stream/2.3.7: + resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: true + + /redent/1.0.0: + resolution: {integrity: sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==} + engines: {node: '>=0.10.0'} + dependencies: + indent-string: 2.1.0 + strip-indent: 1.0.1 + dev: true + + /redent/3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + dev: true + + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: true + + /regexp.prototype.flags/1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + functions-have-names: 1.2.3 + dev: true + + /repeating/2.0.1: + resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} + engines: {node: '>=0.10.0'} + dependencies: + is-finite: 1.1.0 + dev: true + + /require-directory/2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + dev: true + + /require-from-string/2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: true + + /require-main-filename/2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + dev: true + + /resolve-cwd/3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from/4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from/5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: true + + /resolve/1.22.1: + resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + hasBin: true + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /retry/0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: true + + /reusify/1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rimraf/2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /rimraf/3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: true + + /run-parallel/1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /safe-buffer/5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: true + + /safer-buffer/2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: true + + /sax/1.2.4: + resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} + dev: true + + /scheduler/0.19.1: + resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + dev: true + + /semver/5.7.1: + resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + hasBin: true + dev: true + + /semver/6.3.0: + resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} + hasBin: true + dev: true + + /semver/7.3.7: + resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /set-blocking/2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: true + + /shebang-command/1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + dependencies: + shebang-regex: 1.0.0 + dev: true + + /shebang-command/2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: true + + /shebang-regex/1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + dev: true + + /shebang-regex/3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: true + + /shell-escape/0.2.0: + resolution: {integrity: sha512-uRRBT2MfEOyxuECseCZd28jC1AJ8hmqqneWQ4VWUTgCAFvb3wKU1jLqj6egC4Exrr88ogg3dp+zroH4wJuaXzw==} + dev: true + + /side-channel/1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.2 + object-inspect: 1.12.2 + dev: true + + /signal-exit/3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: true + + /simple-swizzle/0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: true + + /sisteransi/1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash/3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /smart-buffer/4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: true + + /smartwrap/2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + array.prototype.flat: 1.3.0 + breakword: 1.0.5 + grapheme-splitter: 1.0.4 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 15.4.1 + dev: true + + /socks-proxy-agent/6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /socks/2.6.2: + resolution: {integrity: sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 1.1.8 + smart-buffer: 4.2.0 + dev: true + + /source-map-support/0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map/0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: true + + /spawndamnit/2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.7 + dev: true + + /spdx-correct/3.1.1: + resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-exceptions/2.3.0: + resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + dev: true + + /spdx-expression-parse/3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.11 + dev: true + + /spdx-license-ids/3.0.11: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + dev: true + + /speedometer/1.0.0: + resolution: {integrity: sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==} + dev: true + + /sprintf-js/1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /ssri/8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.4 + dev: true + + /stable/0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + dev: true + + /stack-utils/2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stream-transform/2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + dependencies: + mixme: 0.5.4 + dev: true + + /string-length/4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width/4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: true + + /string.prototype.trimend/1.0.5: + resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /string.prototype.trimstart/1.0.5: + resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + es-abstract: 1.20.1 + dev: true + + /string_decoder/1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /strip-ansi/6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: true + + /strip-bom/2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + dependencies: + is-utf8: 0.2.1 + dev: true + + /strip-bom/3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom/4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-eof/1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + dev: true + + /strip-final-newline/2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-final-newline/3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-indent/1.0.1: + resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + get-stdin: 4.0.1 + dev: true + + /strip-indent/3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + dependencies: + min-indent: 1.0.1 + dev: true + + /strip-json-comments/3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /supports-color/5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: true + + /supports-color/7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color/8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag/1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /svg-term-cli/2.1.1: + resolution: {integrity: sha512-aL5uAMiF0XtFq9uolRdmBtOzGKYMS8uMTvHKcF5E4iUdcD1N3fjiIMJQr6C6KFvXsW7ZKmRXNeEnXURE4/Jdbg==} + hasBin: true + dependencies: + '@marionebl/sander': 0.6.1 + chalk: 2.4.2 + command-exists: 1.2.9 + execa: 0.8.0 + get-stdin: 5.0.1 + guess-terminal: 1.0.0 + macos-app-config: 1.0.1 + meow: 3.7.0 + node-fetch: 1.7.3 + plist: 2.1.0 + svg-term: 1.3.1 + svgo: 1.3.2 + tempfile: 2.0.0 + tempy: 0.2.1 + term-schemes: 1.2.1 + dev: true + + /svg-term/1.3.1: + resolution: {integrity: sha512-8VYxa+fmkP0hkqTGCRSTkTorJ/oqutY6frkghTnmLaxTTAX6j+U99bCX0M21MP4jyVwdbXthukLEyg+LSY/0EA==} + dependencies: + '@stiligita/constants': 1.0.0-0 + '@stiligita/core': 1.0.0-0 + '@stiligita/keyframes': 1.0.0-0 + '@stiligita/react': 1.0.0-0 + '@stiligita/stylesheets': 1.0.0-0 + abcq: 1.0.2 + ansi-to-rgb: 1.0.0 + load-asciicast: 2.1.0 + lodash: 4.17.21 + object-hash: 1.3.1 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + tag-hoc: 1.0.0 + dev: true + + /svgo/1.3.2: + resolution: {integrity: sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==} + engines: {node: '>=4.0.0'} + deprecated: This SVGO version is no longer supported. Upgrade to v2.x.x. + hasBin: true + dependencies: + chalk: 2.4.2 + coa: 2.0.2 + css-select: 2.1.0 + css-select-base-adapter: 0.1.1 + css-tree: 1.0.0-alpha.37 + csso: 4.2.0 + js-yaml: 3.14.1 + mkdirp: 0.5.6 + object.values: 1.1.5 + sax: 1.2.4 + stable: 0.1.8 + unquote: 1.1.1 + util.promisify: 1.0.1 + dev: true + + /tag-hoc/1.0.0: + resolution: {integrity: sha512-pQD+6Kief8nO5saFecplPWnV//FlSF+s7nIjgbLi+qJYd5L/3nrNUGMn6HmtG41mdkkWZXvTkOGlqWcFki3yEg==} + dev: true + + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.3.4 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: true + + /temp-dir/1.0.0: + resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} + engines: {node: '>=4'} + dev: true + + /tempfile/2.0.0: + resolution: {integrity: sha512-ZOn6nJUgvgC09+doCEF3oB+r3ag7kUvlsXEGX069QRD60p+P3uP7XG9N2/at+EyIRGSN//ZY3LyEotA1YpmjuA==} + engines: {node: '>=4'} + dependencies: + temp-dir: 1.0.0 + uuid: 3.4.0 + dev: true + + /tempy/0.2.1: + resolution: {integrity: sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw==} + engines: {node: '>=4'} + dependencies: + temp-dir: 1.0.0 + unique-string: 1.0.0 + dev: true + + /term-schemes/1.2.1: + resolution: {integrity: sha512-pv+lTR5WhV7rPRI4lpcxXf58tCZTefPdeowmNQqX0uTcJp6mhiKzsDwEPX2uL6wHKzb2OnrN8Mrq1gVLsPueng==} + dependencies: + '@marionebl/is': 0.5.1-0 + '@types/globby': 6.1.0 + '@types/ini': 1.3.31 + '@types/jest': 21.1.10 + '@types/lodash': 4.14.182 + '@types/node': 8.10.66 + aggregate-error: 1.0.0 + bplist-parser: 0.1.1 + color: 2.0.1 + hex-rgb: 1.0.0 + ini: 1.3.8 + lodash: 4.17.21 + plist: 2.1.0 + require-from-string: 2.0.2 + resolve-from: 4.0.0 + terminal-default-colors: 1.0.2 + dev: true + + /term-size/2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + dev: true + + /terminal-default-colors/1.0.2: + resolution: {integrity: sha512-auu1piVOZjAQUb7aYmnk2uw/hUd9+WtWp1+3kGftWcnjVMZPAB88nhZo1tlIaxncBqblVUPFZwITdKOHY2eBmQ==} + dev: true + + /test-exclude/6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /thenify-all/1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify/3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /through2/2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + dependencies: + readable-stream: 2.3.7 + xtend: 4.0.2 + dev: true + + /tmp/0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + dev: true + + /tmpl/1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties/2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range/5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + + /toml/3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + dev: true + + /tr46/0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: true + + /trim-newlines/1.0.0: + resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} + engines: {node: '>=0.10.0'} + dev: true + + /trim-newlines/3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + dev: true + + /ts-dedent/2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + dev: true + + /ts-jest/29.0.3_r24ewcothphvclnu77pxb4u4se: + resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.3.1_@types+node@18.11.9 + jest-util: 29.3.1 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.7 + typescript: 4.8.4 + yargs-parser: 21.0.1 + dev: true + + /tslib/1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + dev: true + + /tty-table/4.1.6: + resolution: {integrity: sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + csv: 5.5.3 + kleur: 4.1.5 + smartwrap: 2.0.2 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 17.5.1 + dev: true + + /type-detect/4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest/0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest/0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + dev: true + + /type-fest/0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + dev: true + + /typescript/4.8.4: + resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + + /unbox-primitive/1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /unique-filename/1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + dev: true + + /unique-slug/2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: true + + /unique-string/1.0.0: + resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} + engines: {node: '>=4'} + dependencies: + crypto-random-string: 1.0.0 + dev: true + + /universalify/0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: true + + /unquote/1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + dev: true + + /update-browserslist-db/1.0.10_browserslist@4.21.4: + resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.21.4 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: true + + /util-deprecate/1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + + /util.promisify/1.0.1: + resolution: {integrity: sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==} + dependencies: + define-properties: 1.1.4 + es-abstract: 1.20.1 + has-symbols: 1.0.3 + object.getownpropertydescriptors: 2.1.4 + dev: true + + /uuid/3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: true + + /v8-to-istanbul/9.0.1: + resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + dev: true + + /validate-npm-package-license/3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + dependencies: + spdx-correct: 3.1.1 + spdx-expression-parse: 3.0.1 + dev: true + + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /wcwidth/1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.3 + dev: true + + /webidl-conversions/3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: true + + /whatwg-url/5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: true + + /which-boxed-primitive/1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-module/2.0.0: + resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + dev: true + + /which-pm/2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: true + + /which/1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /which/2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + + /wrap-ansi/6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi/7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrappy/1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + + /write-file-atomic/4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /xmlbuilder/8.2.2: + resolution: {integrity: sha512-eKRAFz04jghooy8muekqzo8uCSVNeyRedbuJrp0fovbLIi7wlsYtdUn3vBAAPq2Y3/0xMz2WMEUQ8yhVVO9Stw==} + engines: {node: '>=4.0'} + dev: true + + /xmldom/0.1.31: + resolution: {integrity: sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==} + engines: {node: '>=0.1'} + deprecated: Deprecated due to CVE-2021-21366 resolved in 0.5.0 + dev: true + + /xtend/4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + dev: true + + /y18n/4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + dev: true + + /y18n/5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + dev: true + + /yallist/2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: true + + /yallist/4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + + /yargs-parser/18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + dev: true + + /yargs-parser/20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser/21.0.1: + resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==} + engines: {node: '>=12'} + dev: true + + /yargs/15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.0 + y18n: 4.0.3 + yargs-parser: 18.1.3 + dev: true + + /yargs/16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs/17.5.1: + resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==} + engines: {node: '>=12'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.0.1 + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/renovate.json b/renovate.json index 50ddbdf..f7ca761 100644 --- a/renovate.json +++ b/renovate.json @@ -1,4 +1,6 @@ { + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": ["config:base"], "labels": ["PR: Dependency Update"], "packageRules": [ { @@ -7,9 +9,29 @@ "groupName": "all non-major dependencies", "groupSlug": "all-minor-patch" } + }, + { + "matchPackagePatterns": ["serde", "serde_json"], + "groupName": "serde", + "groupSlug": "serde" + }, + { + "matchPackagePatterns": ["clap", "clap_*"], + "groupName": "clap-rs", + "groupSlug": "clap-rs" + }, + { + "matchDepTypes": ["devDependencies", "dev-dependencies"], + "matchPackagePatterns": ["*"], + "automerge": true, + "groupName": "all dev dependencies", + "groupSlug": "all-dev-dependencies" + }, + { + "matchPackagePatterns": ["uraimo/run-on-arch-action"], + "matchManagers": ["github-actions"], + "allowedVersions": "2.1.2" } ], - "extends": [ - "config:base" - ] + "lockFileMaintenance": { "enabled": true } } diff --git a/site/package.json b/site/package.json index cc4a5c2..0fb2bdb 100644 --- a/site/package.json +++ b/site/package.json @@ -6,10 +6,5 @@ "license": "MIT", "scripts": { "build": "rm -rf public; mkdir public; cp ../.ci/install.sh ./public/install.txt" - }, - "devDependencies": { - "@vercel/node": "1.12.1", - "typescript": "4.5.4", - "vercel": "23.1.2" } } diff --git a/site/tsconfig.json b/site/tsconfig.json deleted file mode 100644 index fb88b50..0000000 --- a/site/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "target": "es5", - "module": "commonjs", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true - } -} diff --git a/site/vercel.json b/site/vercel.json index 26ea1fa..c314f79 100644 --- a/site/vercel.json +++ b/site/vercel.json @@ -1,17 +1,19 @@ { + "$schema": "https://openapi.vercel.sh/vercel.json", + "github": { + "silent": true + }, "redirects": [ { "source": "/", "destination": "https://github.com/Schniz/fnm" } ], - "rewrites": [ - { "source": "/install", "destination": "/install.txt" } - ], + "rewrites": [{ "source": "/install", "destination": "/install.txt" }], "headers": [ { "source": "/install", - "headers" : [ + "headers": [ { - "key" : "Cache-Control", - "value" : "public, max-age=3600" + "key": "Cache-Control", + "value": "public, max-age=3600" } ] } diff --git a/site/yarn.lock b/site/yarn.lock deleted file mode 100644 index b40b703..0000000 --- a/site/yarn.lock +++ /dev/null @@ -1,677 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/node@*": - version "14.11.2" - resolved "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz#2de1ed6670439387da1c9f549a2ade2b0a799256" - integrity sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA== - -"@vercel/build-utils@2.12.2": - version "2.12.2" - resolved "https://registry.yarnpkg.com/@vercel/build-utils/-/build-utils-2.12.2.tgz#285a3bb0b78864fb6f44478257bd275c57aa8651" - integrity sha512-KbSgG2ZCVXhUsdbnpv6gC7buygd31jaKiKhrd4Lzv1NwjnoeDZAXlm4hzvSPYHVtCY2jirKJWP2rFtMW8iAh9g== - -"@vercel/go@1.2.3": - version "1.2.3" - resolved "https://registry.yarnpkg.com/@vercel/go/-/go-1.2.3.tgz#6f2bdba5681f9d64ee17060c5d63589e2d45e2d8" - integrity sha512-BZCHRz43Qfr0DwZlZQCcofR+3cr+H+HK72/ZPkZy1Uq0NYjJMlmZ3ahuMgvJxT9lfC1RA6eOEUlUsZ+gqKcMCg== - -"@vercel/node@1.12.1": - version "1.12.1" - resolved "https://registry.yarnpkg.com/@vercel/node/-/node-1.12.1.tgz#15f42f64690f904f8a52a387123ce0958657060f" - integrity sha512-NcawIY05BvVkWlsowaxF2hl/hJg475U8JvT2FnGykFPMx31q1/FtqyTw/awSrKfOSRXR0InrbEIDIelmS9NzPA== - dependencies: - "@types/node" "*" - ts-node "8.9.1" - typescript "4.3.4" - -"@vercel/python@2.0.5": - version "2.0.5" - resolved "https://registry.yarnpkg.com/@vercel/python/-/python-2.0.5.tgz#76c09280febfac863c39651edffafbb0838a1df8" - integrity sha512-WCSTTw6He2COaSBiGDk2q5Q1ue+z5usRZcvUHCpsK6KvNkkV/PrY8JT73XQysMWKiXh6yQy19IUFAOqK/xwhig== - -"@vercel/ruby@1.2.7": - version "1.2.7" - resolved "https://registry.yarnpkg.com/@vercel/ruby/-/ruby-1.2.7.tgz#516d1c45f4961619338f3d3bb518ee43b863a5da" - integrity sha512-ZG2VxMHHSKocL57UWsfNc9UsblwYGm55/ujqGIBnkNUURnRgtUrwtWlEts1eJ4VHD754Lc/0/R1pfJXoN5SbRw== - -ansi-align@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb" - integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw== - dependencies: - string-width "^3.0.0" - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^4.1.0: - version "4.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -boxen@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64" - integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^5.3.1" - chalk "^3.0.0" - cli-boxes "^2.2.0" - string-width "^4.1.0" - term-size "^2.1.0" - type-fest "^0.8.1" - widest-line "^3.1.0" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4" - integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -cli-boxes@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -clone-response@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz#d1dc973920314df67fbeb94223b4ee350239e96b" - integrity sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws= - dependencies: - mimic-response "^1.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -global-dirs@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz#acdf3bb6685bcd55cb35e8a052266569e9469201" - integrity sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A== - dependencies: - ini "^1.3.5" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2: - version "4.2.4" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" - integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-installed-globally@^0.3.1: - version "0.3.2" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141" - integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g== - dependencies: - global-dirs "^2.0.1" - is-path-inside "^3.0.1" - -is-npm@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" - integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -latest-version@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -minimist@^1.2.0: - version "1.2.5" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pupa@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz#dbdc9ff48ffbea4a26a069b6f9f7abb051008726" - integrity sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA== - dependencies: - escape-goat "^2.0.0" - -rc@^1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -registry-auth-token@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz#1d37dffda72bbecd0f581e4715540213a65eb7da" - integrity sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w== - dependencies: - rc "^1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= - dependencies: - lowercase-keys "^1.0.0" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -signal-exit@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -source-map-support@^0.5.17: - version "0.5.19" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string-width@^4.0.0, string-width@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -term-size@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz#1f16adedfe9bdc18800e1776821734086fcc6753" - integrity sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw== - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -ts-node@8.9.1: - version "8.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-8.9.1.tgz#2f857f46c47e91dcd28a14e052482eb14cfd65a5" - integrity sha512-yrq6ODsxEFTLz0R3BX2myf0WBCSQh9A+py8PBo1dCzWIOcvisbyH6akNKqDHMgXePF2kir5mm5JXJTH3OUJYOQ== - dependencies: - arg "^4.1.0" - diff "^4.0.1" - make-error "^1.1.1" - source-map-support "^0.5.17" - yn "3.1.1" - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@4.3.4: - version "4.3.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.4.tgz#3f85b986945bcf31071decdd96cf8bfa65f9dcbc" - integrity sha512-uauPG7XZn9F/mo+7MrsRjyvbxFpzemRjKEZXS4AK83oP2KKOJPvb+9cO/gmnv8arWZvhnjVOXz7B49m1l0e9Ew== - -typescript@4.5.4: - version "4.5.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.4.tgz#a17d3a0263bf5c8723b9c52f43c5084edf13c2e8" - integrity sha512-VgYs2A2QIRuGphtzFV7aQJduJ2gyfTljngLzjpfW9FoYZF6xuw1W0vW9ghCKLfcWrCFxK81CSGRAvS1pn4fIUg== - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -update-notifier@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz#4866b98c3bc5b5473c020b1250583628f9a328f3" - integrity sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew== - dependencies: - boxen "^4.2.0" - chalk "^3.0.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.3.1" - is-npm "^4.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.0.0" - pupa "^2.0.1" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww= - dependencies: - prepend-http "^2.0.0" - -vercel@23.1.2: - version "23.1.2" - resolved "https://registry.yarnpkg.com/vercel/-/vercel-23.1.2.tgz#7f36772970c7c56f10de89983f03b3c0c72d294e" - integrity sha512-uS1k7wuXI6hbxiW+kn9vdAWL0bBi4jjVxc7Jwp8NhJjcRuzlydtt3gUEnhnC9AOIKQ4LxoAgmg50lSyYkrC8Hg== - dependencies: - "@vercel/build-utils" "2.12.2" - "@vercel/go" "1.2.3" - "@vercel/node" "1.12.1" - "@vercel/python" "2.0.5" - "@vercel/ruby" "1.2.7" - update-notifier "4.1.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== diff --git a/src/arch.rs b/src/arch.rs index 64f5f67..2a83961 100644 --- a/src/arch.rs +++ b/src/arch.rs @@ -11,6 +11,20 @@ pub enum Arch { S390x, } +impl Arch { + pub fn as_str(&self) -> &'static str { + match self { + Arch::X86 => "x86", + Arch::X64 => "x64", + Arch::Arm64 => "arm64", + Arch::Armv7l => "armv7l", + Arch::Ppc64le => "ppc64le", + Arch::Ppc64 => "ppc64", + Arch::S390x => "s390x", + } + } +} + #[cfg(unix)] /// handle common case: Apple Silicon / Node < 16 pub fn get_safe_arch<'a>(arch: &'a Arch, version: &Version) -> &'a Arch { @@ -55,17 +69,7 @@ impl std::str::FromStr for Arch { impl std::fmt::Display for Arch { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - let arch_str = match self { - Arch::X86 => String::from("x86"), - Arch::X64 => String::from("x64"), - Arch::Arm64 => String::from("arm64"), - Arch::Armv7l => String::from("armv7l"), - Arch::Ppc64le => String::from("ppc64le"), - Arch::Ppc64 => String::from("ppc64"), - Arch::S390x => String::from("s390x"), - }; - - write!(f, "{}", arch_str) + write!(f, "{}", self.as_str()) } } diff --git a/src/archive/zip.rs b/src/archive/zip.rs index 8b08ba6..f9bb01e 100644 --- a/src/archive/zip.rs +++ b/src/archive/zip.rs @@ -42,7 +42,7 @@ impl Extract for Zip { } } - if (&*file.name()).ends_with('/') { + if file.name().ends_with('/') { debug!( "File {} extracted to \"{}\"", i, @@ -58,7 +58,7 @@ impl Extract for Zip { ); if let Some(p) = outpath.parent() { if !p.exists() { - fs::create_dir_all(&p)?; + fs::create_dir_all(p)?; } } let mut outfile = fs::File::create(&outpath)?; diff --git a/src/choose_version_for_user_input.rs b/src/choose_version_for_user_input.rs index 18d9d3d..9c4de2c 100644 --- a/src/choose_version_for_user_input.rs +++ b/src/choose_version_for_user_input.rs @@ -6,8 +6,8 @@ use crate::user_version::UserVersion; use crate::version::Version; use colored::Colorize; use log::info; -use snafu::{ensure, ResultExt, Snafu}; use std::path::{Path, PathBuf}; +use thiserror::Error; #[derive(Debug)] pub struct ApplicableVersion { @@ -29,8 +29,8 @@ pub fn choose_version_for_user_input<'a>( requested_version: &'a UserVersion, config: &'a FnmConfig, ) -> Result, Error> { - let all_versions = - installed_versions::list(config.installations_dir()).context(VersionListing)?; + let all_versions = installed_versions::list(config.installations_dir()) + .map_err(|source| Error::VersionListing { source })?; let result = if let UserVersion::Full(Version::Bypassed) = requested_version { info!( @@ -54,18 +54,16 @@ pub fn choose_version_for_user_input<'a>( path: alias_path, version: Version::Bypassed, }) - } else { - ensure!( - alias_path.exists(), - CantFindVersion { - requested_version: requested_version.clone() - } - ); + } else if alias_path.exists() { info!("Using Node for alias {}", alias_name.cyan()); Some(ApplicableVersion { path: alias_path, version: Version::Alias(alias_name), }) + } else { + return Err(Error::CantFindVersion { + requested_version: requested_version.clone(), + }); } } else { let current_version = requested_version.to_version(&all_versions, config); @@ -86,10 +84,10 @@ pub fn choose_version_for_user_input<'a>( Ok(result) } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display("Can't find requested version: {}", requested_version))] + #[error("Can't find requested version: {}", requested_version)] CantFindVersion { requested_version: UserVersion }, - #[snafu(display("Can't list local installed versions: {}", source))] + #[error("Can't list local installed versions: {}", source)] VersionListing { source: installed_versions::Error }, } diff --git a/src/cli.rs b/src/cli.rs index 4d5c976..688f1a0 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -1,24 +1,24 @@ use crate::commands; use crate::commands::command::Command; use crate::config::FnmConfig; -use structopt::StructOpt; +use clap::Parser; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub enum SubCommand { /// List all remote Node.js versions - #[structopt(name = "list-remote", visible_aliases = &["ls-remote"])] + #[clap(name = "list-remote", bin_name = "list-remote", visible_aliases = &["ls-remote"])] LsRemote(commands::ls_remote::LsRemote), /// List all locally installed Node.js versions - #[structopt(name = "list", visible_aliases = &["ls"])] + #[clap(name = "list", bin_name = "list", visible_aliases = &["ls"])] LsLocal(commands::ls_local::LsLocal), /// Install a new Node.js version - #[structopt(name = "install")] + #[clap(name = "install", bin_name = "install")] Install(commands::install::Install), /// Change Node.js version - #[structopt(name = "use")] + #[clap(name = "use", bin_name = "use")] Use(commands::r#use::Use), /// Print and set up required environment variables for fnm @@ -29,29 +29,29 @@ pub enum SubCommand { /// 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` - #[structopt(name = "env")] + #[clap(name = "env", bin_name = "env")] Env(commands::env::Env), /// Print shell completions to stdout - #[structopt(name = "completions")] + #[clap(name = "completions", bin_name = "completions")] Completions(commands::completions::Completions), /// Alias a version to a common name - #[structopt(name = "alias")] + #[clap(name = "alias", bin_name = "alias")] Alias(commands::alias::Alias), /// Remove an alias definition - #[structopt(name = "unalias")] + #[clap(name = "unalias", bin_name = "unalias")] Unalias(commands::unalias::Unalias), /// Set a version as the default version /// /// This is a shorthand for `fnm alias VERSION default` - #[structopt(name = "default")] + #[clap(name = "default", bin_name = "default")] Default(commands::default::Default), /// Print the current Node.js version - #[structopt(name = "current")] + #[clap(name = "current", bin_name = "current")] Current(commands::current::Current), /// Run a command within fnm context @@ -60,14 +60,14 @@ pub enum SubCommand { /// -------- /// fnm exec --using=v12.0.0 node --version /// => v12.0.0 - #[structopt(name = "exec", verbatim_doc_comment)] + #[clap(name = "exec", bin_name = "exec", verbatim_doc_comment)] Exec(commands::exec::Exec), /// 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. - #[structopt(name = "uninstall")] + #[clap(name = "uninstall", bin_name = "uninstall")] Uninstall(commands::uninstall::Uninstall), } @@ -91,15 +91,15 @@ impl SubCommand { } /// A fast and simple Node.js manager. -#[derive(StructOpt, Debug)] -#[structopt(name = "fnm")] +#[derive(clap::Parser, Debug)] +#[clap(name = "fnm", version = env!("CARGO_PKG_VERSION"), bin_name = "fnm")] pub struct Cli { - #[structopt(flatten)] + #[clap(flatten)] pub config: FnmConfig, - #[structopt(subcommand)] + #[clap(subcommand)] pub subcmd: SubCommand, } pub fn parse() -> Cli { - Cli::from_args() + Cli::parse() } diff --git a/src/commands/alias.rs b/src/commands/alias.rs index 8d8ed59..cbee361 100644 --- a/src/commands/alias.rs +++ b/src/commands/alias.rs @@ -4,12 +4,10 @@ use crate::choose_version_for_user_input::{ choose_version_for_user_input, Error as ApplicableVersionError, }; use crate::config::FnmConfig; -use crate::installed_versions; use crate::user_version::UserVersion; -use snafu::{OptionExt, ResultExt, Snafu}; -use structopt::StructOpt; +use thiserror::Error; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct Alias { pub(crate) to_version: UserVersion, pub(crate) name: String, @@ -20,26 +18,24 @@ impl Command for Alias { fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { let applicable_version = choose_version_for_user_input(&self.to_version, config) - .context(CantUnderstandVersion)? - .context(VersionNotFound { + .map_err(|source| Error::CantUnderstandVersion { source })? + .ok_or(Error::VersionNotFound { version: self.to_version, })?; create_alias(config, &self.name, applicable_version.version()) - .context(CantCreateSymlink)?; + .map_err(|source| Error::CantCreateSymlink { source })?; Ok(()) } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display("Can't create symlink for alias: {}", source))] + #[error("Can't create symlink for alias: {}", source)] CantCreateSymlink { source: std::io::Error }, - #[snafu(display("Can't list local installed versions: {}", source))] - VersionListingError { source: installed_versions::Error }, - #[snafu(display("Version {} not found locally", version))] + #[error("Version {} not found locally", version)] VersionNotFound { version: UserVersion }, - #[snafu(display("{}", source))] + #[error(transparent)] CantUnderstandVersion { source: ApplicableVersionError }, } diff --git a/src/commands/completions.rs b/src/commands/completions.rs index 0c1289f..35fc156 100644 --- a/src/commands/completions.rs +++ b/src/commands/completions.rs @@ -2,14 +2,14 @@ use super::command::Command; use crate::cli::Cli; use crate::config::FnmConfig; use crate::shell::{infer_shell, AVAILABLE_SHELLS}; -use snafu::{OptionExt, Snafu}; -use structopt::clap::Shell; -use structopt::StructOpt; +use clap::{IntoApp, Parser}; +use clap_complete::{Generator, Shell}; +use thiserror::Error; -#[derive(StructOpt, Debug)] +#[derive(Parser, Debug)] pub struct Completions { /// The shell syntax to use. Infers when missing. - #[structopt(long, possible_values = &Shell::variants())] + #[clap(long)] shell: Option, } @@ -21,21 +21,22 @@ impl Command for Completions { let shell = self .shell .or_else(|| infer_shell().map(Into::into)) - .context(CantInferShell)?; - Cli::clap().gen_completions_to(env!("CARGO_PKG_NAME"), shell, &mut stdio); + .ok_or(Error::CantInferShell)?; + let app = Cli::command(); + shell.generate(&app, &mut stdio); Ok(()) } } -#[derive(Snafu, Debug)] +#[derive(Error, Debug)] pub enum Error { - #[snafu(display( + #[error( "{}\n{}\n{}\n{}", "Can't infer shell!", "fnm can't infer your shell based on the process tree.", "Maybe it is unsupported? we support the following shells:", shells_as_string() - ))] + )] CantInferShell, } diff --git a/src/commands/current.rs b/src/commands/current.rs index 74cb7e1..1081f72 100644 --- a/src/commands/current.rs +++ b/src/commands/current.rs @@ -1,9 +1,8 @@ use super::command::Command; use crate::config::FnmConfig; use crate::current_version::{current_version, Error}; -use structopt::StructOpt; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct Current {} impl Command for Current { diff --git a/src/commands/default.rs b/src/commands/default.rs index a24d208..496522c 100644 --- a/src/commands/default.rs +++ b/src/commands/default.rs @@ -2,9 +2,8 @@ use super::alias::Alias; use super::command::Command; use crate::config::FnmConfig; use crate::user_version::UserVersion; -use structopt::StructOpt; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct Default { version: UserVersion, } diff --git a/src/commands/env.rs b/src/commands/env.rs index 277e496..975520f 100644 --- a/src/commands/env.rs +++ b/src/commands/env.rs @@ -1,25 +1,30 @@ use super::command::Command; use crate::config::FnmConfig; +use crate::directories; use crate::fs::symlink_dir; use crate::path_ext::PathExt; use crate::shell::{infer_shell, Shell, AVAILABLE_SHELLS}; +use crate::version_switch_strategy::VersionSwitchStrategy; use crate::{outln, shims}; use colored::Colorize; -use snafu::{OptionExt, ResultExt, Snafu}; +use std::collections::HashMap; use std::fmt::Debug; -use structopt::StructOpt; +use thiserror::Error; -#[derive(StructOpt, Debug, Default)] +#[derive(clap::Parser, Debug, Default)] pub struct Env { /// The shell syntax to use. Infers when missing. - #[structopt(long)] - #[structopt(possible_values = AVAILABLE_SHELLS)] + #[clap(long)] + #[clap(possible_values = AVAILABLE_SHELLS)] shell: Option>, + /// Print JSON instead of shell commands. + #[clap(long, conflicts_with = "shell")] + json: bool, /// Deprecated. This is the default now. - #[structopt(long, hidden = true)] + #[clap(long, hide = true)] multi: bool, /// Print the script to change Node versions every directory change - #[structopt(long)] + #[clap(long)] use_on_cd: bool, /// Adds `node` shims to your PATH environment variable @@ -37,18 +42,18 @@ fn generate_symlink_path() -> String { ) } -fn make_symlink(config: &FnmConfig) -> std::path::PathBuf { - let base_dir = std::env::temp_dir() - .join("fnm_multishells") - .ensure_exists_silently(); +fn make_symlink(config: &FnmConfig) -> Result { + let base_dir = directories::multishell_storage().ensure_exists_silently(); let mut temp_dir = base_dir.join(generate_symlink_path()); while temp_dir.exists() { temp_dir = base_dir.join(generate_symlink_path()); } - symlink_dir(config.default_version_dir(), &temp_dir).expect("Can't create symlink!"); - temp_dir + match symlink_dir(config.default_version_dir(), &temp_dir) { + Ok(_) => Ok(temp_dir), + Err(source) => Err(Error::CantCreateSymlink { source, temp_dir }), + } } impl Command for Env { @@ -65,58 +70,91 @@ impl Command for Env { ); } - let shell: Box = self.shell.or_else(&infer_shell).context(CantInferShell)?; - let multishell_path = make_symlink(config); + let multishell_path = make_symlink(config)?; let binary_path = if self.with_shims { - shims::store_shim(config).context(CantCreateShims)? + shims::store_shim(config).map_err(|source| Error::CantCreateShims { source })? } else if cfg!(windows) { multishell_path.clone() } else { multishell_path.join("bin") }; - println!("{}", shell.path(&binary_path)); - println!( - "{}", - shell.set_env_var("FNM_MULTISHELL_PATH", multishell_path.to_str().unwrap()) - ); - println!( - "{}", - shell.set_env_var("FNM_DIR", config.base_dir_with_default().to_str().unwrap()) - ); - println!( - "{}", - shell.set_env_var("FNM_LOGLEVEL", config.log_level().clone().into()) - ); - println!( - "{}", - shell.set_env_var("FNM_NODE_DIST_MIRROR", config.node_dist_mirror.as_str()) - ); - println!( - "{}", - shell.set_env_var("FNM_ARCH", &config.arch.to_string()) - ); + + let fnm_dir = config.base_dir_with_default(); + + let env_vars = HashMap::from([ + ("FNM_MULTISHELL_PATH", multishell_path.to_str().unwrap()), + ( + "FNM_VERSION_FILE_STRATEGY", + config.version_file_strategy().as_str(), + ), + ("FNM_DIR", fnm_dir.to_str().unwrap()), + ("FNM_LOGLEVEL", config.log_level().as_str()), + ("FNM_NODE_DIST_MIRROR", config.node_dist_mirror.as_str()), + ("FNM_ARCH", config.arch.as_str()), + ( + "FNM_VERSION_SWITCH_STRATEGY", + if self.with_shims { + VersionSwitchStrategy::Shims + } else { + VersionSwitchStrategy::PathSymlink + } + .as_str(), + ), + ]); + + if self.json { + println!("{}", serde_json::to_string(&env_vars).unwrap()); + return Ok(()); + } + + let shell: Box = self + .shell + .or_else(infer_shell) + .ok_or(Error::CantInferShell)?; + + println!("{}", shell.path(&binary_path)?); + + for (name, value) in &env_vars { + println!("{}", shell.set_env_var(name, value)); + } + if self.use_on_cd { - println!("{}", shell.use_on_cd(config)); + println!("{}", shell.use_on_cd(config)?); } if let Some(v) = shell.rehash() { println!("{}", v); } + Ok(()) } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display( + #[error( "{}\n{}\n{}\n{}", "Can't infer shell!", "fnm can't infer your shell based on the process tree.", "Maybe it is unsupported? we support the following shells:", shells_as_string() - ))] + )] CantInferShell, - #[snafu(display("Can't create Node.js shims: {}", source))] - CantCreateShims { source: std::io::Error }, + #[error("Can't create Node.js shims: {}", source)] + CantCreateShims { + #[source] + source: std::io::Error, + }, + #[error("Can't create the symlink for multishells at {temp_dir:?}. Maybe there are some issues with permissions for the directory? {source}")] + CantCreateSymlink { + #[source] + source: std::io::Error, + temp_dir: std::path::PathBuf, + }, + #[error(transparent)] + ShellError { + #[from] + source: anyhow::Error, + }, } fn shells_as_string() -> String { diff --git a/src/commands/exec.rs b/src/commands/exec.rs index cfb5246..88b0ef0 100644 --- a/src/commands/exec.rs +++ b/src/commands/exec.rs @@ -9,20 +9,19 @@ use crate::user_version::UserVersion; use crate::user_version_reader::UserVersionReader; use colored::Colorize; use log::debug; -use snafu::{OptionExt, ResultExt, Snafu}; use std::process::{Command, Stdio}; -use structopt::StructOpt; +use thiserror::Error; -#[derive(Debug, StructOpt)] -#[structopt(setting = structopt::clap::AppSettings::TrailingVarArg)] +#[derive(Debug, clap::Parser)] +#[clap(trailing_var_arg = true)] pub struct Exec { /// Either an explicit version, or a filename with the version written in it - #[structopt(long = "using")] + #[clap(long = "using")] version: Option, /// Deprecated. This is the default now. - #[structopt(long = "using-file", hidden = true)] + #[clap(long = "using-file", hide = true)] using_file: bool, - #[structopt(long = "using-current", hidden = true, conflicts_with = "using")] + #[structopt(long = "using-current", hidden = true, conflicts_with = "version")] using_current: bool, /// The command to run arguments: Vec, @@ -42,12 +41,15 @@ impl Cmd for Exec { ); } - let (binary, arguments) = self.arguments.split_first().context(NoBinaryProvided)?; + let (binary, arguments) = self + .arguments + .split_first() + .ok_or(Error::NoBinaryProvided)?; let version = if self.using_current { let version = current_version(config) - .context(CantGetCurrentVersion)? - .context(NoCurrentVersion)?; + .map_err(|source| Error::CantGetCurrentVersion { source })? + .ok_or(Error::NoCurrentVersion)?; UserVersion::Full(version) } else { self.version @@ -56,13 +58,13 @@ impl Cmd for Exec { let current_dir = std::env::current_dir().unwrap(); UserVersionReader::Path(current_dir) }) - .into_user_version() - .context(CantInferVersion)? + .into_user_version(config) + .ok_or(Error::CantInferVersion)? }; let applicable_version = choose_version_for_user_input(&version, config) - .context(ApplicableVersionError)? - .context(VersionNotFound { version })?; + .map_err(|source| Error::ApplicableVersionError { source })? + .ok_or(Error::VersionNotFound { version })?; #[cfg(windows)] let bin_path = applicable_version.path().to_path_buf(); @@ -73,13 +75,14 @@ impl Cmd for Exec { debug!("Using Node.js from {}", bin_path.display()); let path_env = { - let paths_env = std::env::var_os("PATH").context(CantReadPathVariable)?; + let paths_env = std::env::var_os("PATH").ok_or(Error::CantReadPathVariable)?; let mut paths: Vec<_> = std::env::split_paths(&paths_env).collect(); paths.insert(0, bin_path); - std::env::join_paths(paths).context(CantAddPathToEnvironment)? + std::env::join_paths(paths) + .map_err(|source| Error::CantAddPathToEnvironment { source })? }; - let exit_status = Command::new(&binary) + let exit_status = Command::new(binary) .args(arguments) .stdin(Stdio::inherit()) .stdout(Stdio::inherit()) @@ -90,40 +93,35 @@ impl Cmd for Exec { .wait() .expect("Failed to grab exit code"); - let code = exit_status.code().context(CantReadProcessExitCode)?; + let code = exit_status.code().ok_or(Error::CantReadProcessExitCode)?; std::process::exit(code); } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display("Can't read path environment variable"))] + #[error("Can't read path environment variable")] CantReadPathVariable, - #[snafu(display("Can't add path to environment variable: {}", source))] - CantAddPathToEnvironment { - source: std::env::JoinPathsError, - }, - #[snafu(display( - "Can't find version in dotfiles. Please provide a version manually to the command." - ))] + #[error("Can't add path to environment variable: {}", source)] + CantAddPathToEnvironment { source: std::env::JoinPathsError }, + #[error("Can't find version in dotfiles. Please provide a version manually to the command.")] CantInferVersion, - #[snafu(display("Requested version {} is not currently installed", version))] - VersionNotFound { - version: UserVersion, - }, + #[error("Requested version {} is not currently installed", version)] + VersionNotFound { version: UserVersion }, + #[error(transparent)] ApplicableVersionError { + #[from] source: UserInputError, }, - #[snafu(display( - "Can't read exit code from process.\nMaybe the process was killed using a signal?" - ))] + #[error("Can't read exit code from process.\nMaybe the process was killed using a signal?")] CantReadProcessExitCode, - #[snafu(display("{}", source))] + #[error("{}", source)] CantGetCurrentVersion { + #[source] source: current_version::Error, }, - #[snafu(display("No current version. Please run `fnm use ` and retry."))] + #[error("No current version. Please run `fnm use ` and retry.")] NoCurrentVersion, - #[snafu(display("command not provided. Please provide a command to run as an argument, like {} or {}.\n{} {}", "node".italic(), "bash".italic(), "example:".yellow().bold(), "fnm exec --using=12 node --version".italic().yellow()))] + #[error("command not provided. Please provide a command to run as an argument, like {} or {}.\n{} {}", "node".italic(), "bash".italic(), "example:".yellow().bold(), "fnm exec --using=12 node --version".italic().yellow())] NoBinaryProvided, } diff --git a/src/commands/install.rs b/src/commands/install.rs index a3dd6a9..7b37d1c 100644 --- a/src/commands/install.rs +++ b/src/commands/install.rs @@ -10,16 +10,15 @@ use crate::version::Version; use crate::version_files::get_user_version_for_directory; use colored::Colorize; use log::debug; -use snafu::{ensure, OptionExt, ResultExt, Snafu}; -use structopt::StructOpt; +use thiserror::Error; -#[derive(StructOpt, Debug, Default)] +#[derive(clap::Parser, Debug, Default)] pub struct Install { /// A version string. Can be a partial semver or a LTS version name by the format lts/NAME pub version: Option, /// Install latest LTS - #[structopt(long, conflicts_with = "version")] + #[clap(long, conflicts_with = "version")] pub lts: bool, } @@ -50,21 +49,20 @@ impl super::command::Command for Install { let current_version = self .version()? - .or_else(|| get_user_version_for_directory(current_dir)) - .context(CantInferVersion)?; + .or_else(|| get_user_version_for_directory(current_dir, config)) + .ok_or(Error::CantInferVersion)?; let version = match current_version.clone() { UserVersion::Full(Version::Semver(actual_version)) => Version::Semver(actual_version), UserVersion::Full(v @ (Version::Bypassed | Version::Alias(_))) => { - ensure!(false, UninstallableVersion { version: v }); - unreachable!(); + return Err(Error::UninstallableVersion { version: v }); } UserVersion::Full(Version::Lts(lts_type)) => { let available_versions: Vec<_> = remote_node_index::list(&config.node_dist_mirror) - .context(CantListRemoteVersions)?; + .map_err(|source| Error::CantListRemoteVersions { source })?; let picked_version = lts_type .pick_latest(&available_versions) - .with_context(|| CantFindRelevantLts { + .ok_or_else(|| Error::CantFindRelevantLts { lts_type: lts_type.clone(), })? .version @@ -78,14 +76,14 @@ impl super::command::Command for Install { } current_version => { let available_versions: Vec<_> = remote_node_index::list(&config.node_dist_mirror) - .context(CantListRemoteVersions)? + .map_err(|source| Error::CantListRemoteVersions { source })? .drain(..) .map(|x| x.version) .collect(); current_version .to_version(&available_versions, config) - .context(CantFindNodeVersion { + .ok_or(Error::CantFindNodeVersion { requested_version: current_version, })? .clone() @@ -113,7 +111,7 @@ impl super::command::Command for Install { Err(err @ DownloaderError::VersionAlreadyInstalled { .. }) => { outln!(config, Error, "{} {}", "warning:".bold().yellow(), err); } - other_err => other_err.context(DownloadError)?, + other_err => other_err.map_err(|source| Error::DownloadError { source })?, }; if let UserVersion::Full(Version::Lts(lts_type)) = current_version { @@ -123,51 +121,41 @@ impl super::command::Command for Install { alias_name.cyan(), version.v_str().cyan() ); - create_alias(config, &alias_name, &version).context(IoError)?; + create_alias(config, &alias_name, &version)?; } if !config.default_version_dir().exists() { debug!("Tagging {} as the default version", version.v_str().cyan()); - create_alias(config, "default", &version).context(IoError)?; + create_alias(config, "default", &version)?; } Ok(()) } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display("Can't download the requested binary: {}", source))] - DownloadError { - source: DownloaderError, - }, + #[error("Can't download the requested binary: {}", source)] + DownloadError { source: DownloaderError }, + #[error(transparent)] IoError { + #[from] source: std::io::Error, }, - #[snafu(display( - "Can't find version in dotfiles. Please provide a version manually to the command." - ))] + #[error("Can't find version in dotfiles. Please provide a version manually to the command.")] CantInferVersion, - #[snafu(display("Having a hard time listing the remote versions: {}", source))] - CantListRemoteVersions { - source: crate::http::Error, - }, - #[snafu(display( + #[error("Having a hard time listing the remote versions: {}", source)] + CantListRemoteVersions { source: crate::http::Error }, + #[error( "Can't find a Node version that matches {} in remote", requested_version - ))] - CantFindNodeVersion { - requested_version: UserVersion, - }, - #[snafu(display("Can't find relevant LTS named {}", lts_type))] - CantFindRelevantLts { - lts_type: crate::lts::LtsType, - }, - #[snafu(display("The requested version is not installable: {}", version.v_str()))] - UninstallableVersion { - version: Version, - }, - #[snafu(display("Too many versions provided. Please don't use --lts with a version string."))] + )] + CantFindNodeVersion { requested_version: UserVersion }, + #[error("Can't find relevant LTS named {}", lts_type)] + CantFindRelevantLts { lts_type: crate::lts::LtsType }, + #[error("The requested version is not installable: {}", version.v_str())] + UninstallableVersion { version: Version }, + #[error("Too many versions provided. Please don't use --lts with a version string.")] TooManyVersionsProvided, } diff --git a/src/commands/ls_local.rs b/src/commands/ls_local.rs index bdbb1d1..438a6cc 100644 --- a/src/commands/ls_local.rs +++ b/src/commands/ls_local.rs @@ -3,11 +3,10 @@ use crate::config::FnmConfig; use crate::current_version::current_version; use crate::version::Version; use colored::Colorize; -use snafu::{ResultExt, Snafu}; use std::collections::HashMap; -use structopt::StructOpt; +use thiserror::Error; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct LsLocal {} impl super::command::Command for LsLocal { @@ -15,16 +14,17 @@ impl super::command::Command for LsLocal { fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { let base_dir = config.installations_dir(); - let mut versions = - crate::installed_versions::list(base_dir).context(CantListLocallyInstalledVersion)?; + let mut versions = crate::installed_versions::list(base_dir) + .map_err(|source| Error::CantListLocallyInstalledVersion { source })?; versions.insert(0, Version::Bypassed); versions.sort(); - let aliases_hash = generate_aliases_hash(config).context(CantReadAliases)?; + let aliases_hash = + generate_aliases_hash(config).map_err(|source| Error::CantReadAliases { source })?; let curr_version = current_version(config).ok().flatten(); for version in versions { let version_aliases = match aliases_hash.get(&version.v_str()) { - None => "".into(), + None => String::new(), Some(versions) => { let version_string = versions .iter() @@ -60,12 +60,12 @@ fn generate_aliases_hash(config: &FnmConfig) -> std::io::Result Result<(), Self::Error> { - let all_versions = remote_node_index::list(&config.node_dist_mirror).context(HttpError)?; + let all_versions = remote_node_index::list(&config.node_dist_mirror)?; for version in all_versions { print!("{}", version.version); @@ -24,7 +23,11 @@ impl super::command::Command for LsRemote { } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - HttpError { source: crate::http::Error }, + #[error(transparent)] + HttpError { + #[from] + source: crate::http::Error, + }, } diff --git a/src/commands/unalias.rs b/src/commands/unalias.rs index 4bedabc..40fed89 100644 --- a/src/commands/unalias.rs +++ b/src/commands/unalias.rs @@ -3,10 +3,9 @@ use crate::fs::remove_symlink_dir; use crate::user_version::UserVersion; use crate::version::Version; use crate::{choose_version_for_user_input, config::FnmConfig}; -use snafu::{OptionExt, ResultExt, Snafu}; -use structopt::StructOpt; +use thiserror::Error; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct Unalias { pub(crate) requested_alias: String, } @@ -21,20 +20,21 @@ impl Command for Unalias { ) .ok() .flatten() - .with_context(|| AliasNotFound { + .ok_or(Error::AliasNotFound { requested_alias: self.requested_alias, })?; - remove_symlink_dir(&requested_version.path()).context(CantDeleteSymlink)?; + remove_symlink_dir(requested_version.path()) + .map_err(|source| Error::CantDeleteSymlink { source })?; Ok(()) } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display("Can't delete symlink: {}", source))] + #[error("Can't delete symlink: {}", source)] CantDeleteSymlink { source: std::io::Error }, - #[snafu(display("Requested alias {} not found", requested_alias))] + #[error("Requested alias {} not found", requested_alias)] AliasNotFound { requested_alias: String }, } diff --git a/src/commands/uninstall.rs b/src/commands/uninstall.rs index be448c5..b254260 100644 --- a/src/commands/uninstall.rs +++ b/src/commands/uninstall.rs @@ -8,10 +8,9 @@ use crate::version::Version; use crate::version_files::get_user_version_for_directory; use colored::Colorize; use log::debug; -use snafu::{ensure, OptionExt, ResultExt, Snafu}; -use structopt::StructOpt; +use thiserror::Error; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct Uninstall { version: Option, } @@ -20,49 +19,48 @@ impl Command for Uninstall { type Error = Error; fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { - let all_versions = - installed_versions::list(config.installations_dir()).context(VersionListingError)?; + let all_versions = installed_versions::list(config.installations_dir()) + .map_err(|source| Error::VersionListingError { source })?; let requested_version = self .version .or_else(|| { let current_dir = std::env::current_dir().unwrap(); - get_user_version_for_directory(current_dir) + get_user_version_for_directory(current_dir, config) }) - .context(CantInferVersion)?; + .ok_or(Error::CantInferVersion)?; - ensure!( - !matches!(requested_version, UserVersion::Full(Version::Bypassed)), - CantUninstallSystemVersion - ); + if matches!(requested_version, UserVersion::Full(Version::Bypassed)) { + return Err(Error::CantUninstallSystemVersion); + } let available_versions: Vec<&Version> = all_versions .iter() .filter(|v| requested_version.matches(v, config)) .collect(); - ensure!( - available_versions.len() < 2, - PleaseBeMoreSpecificToDelete { + if available_versions.len() >= 2 { + return Err(Error::PleaseBeMoreSpecificToDelete { matched_versions: available_versions .iter() - .map(|x| x.v_str()) - .collect::>() - } - ); + .map(std::string::ToString::to_string) + .collect(), + }); + } let version = requested_version .to_version(&all_versions, config) - .context(CantFindVersion)?; + .ok_or(Error::CantFindVersion)?; - let matching_aliases = version.find_aliases(config).context(IoError)?; + let matching_aliases = version.find_aliases(config)?; let root_path = version .root_path(config) - .with_context(|| RootPathNotFound { + .ok_or_else(|| Error::RootPathNotFound { version: version.clone(), })?; debug!("Removing Node version from {:?}", root_path); - std::fs::remove_dir_all(root_path).context(CantDeleteNodeVersion)?; + std::fs::remove_dir_all(root_path) + .map_err(|source| Error::CantDeleteNodeVersion { source })?; outln!( config, Info, @@ -72,7 +70,8 @@ impl Command for Uninstall { for alias in matching_aliases { debug!("Removing alias from {:?}", alias.path()); - remove_symlink_dir(alias.path()).context(CantDeleteSymlink)?; + remove_symlink_dir(alias.path()) + .map_err(|source| Error::CantDeleteSymlink { source })?; outln!( config, Info, @@ -85,26 +84,27 @@ impl Command for Uninstall { } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display("Can't get locally installed versions: {}", source))] + #[error("Can't get locally installed versions: {}", source)] VersionListingError { source: installed_versions::Error }, - #[snafu(display( - "Can't find version in dotfiles. Please provide a version manually to the command." - ))] + #[error("Can't find version in dotfiles. Please provide a version manually to the command.")] CantInferVersion, - #[snafu(display("Can't uninstall system version"))] + #[error("Can't uninstall system version")] CantUninstallSystemVersion, - #[snafu(display("Too many versions had matched, please be more specific.\nFound {} matching versions, expected 1:\n{}", matched_versions.len(), matched_versions.iter().map(|v| format!("* {}", v)).collect::>().join("\n")))] + #[error("Too many versions had matched, please be more specific.\nFound {} matching versions, expected 1:\n{}", matched_versions.len(), matched_versions.iter().map(|v| format!("* {}", v)).collect::>().join("\n"))] PleaseBeMoreSpecificToDelete { matched_versions: Vec }, - #[snafu(display("Can't find a matching version"))] + #[error("Can't find a matching version")] CantFindVersion, - #[snafu(display("Root path not found for version {}", version))] + #[error("Root path not found for version {}", version)] RootPathNotFound { version: Version }, - #[snafu(display("io error: {}", source))] - IoError { source: std::io::Error }, - #[snafu(display("Can't delete Node.js version: {}", source))] + #[error("io error: {}", source)] + IoError { + #[from] + source: std::io::Error, + }, + #[error("Can't delete Node.js version: {}", source)] CantDeleteNodeVersion { source: std::io::Error }, - #[snafu(display("Can't delete symlink: {}", source))] + #[error("Can't delete symlink: {}", source)] CantDeleteSymlink { source: std::io::Error }, } diff --git a/src/commands/use.rs b/src/commands/use.rs index 3c44b17..809af91 100644 --- a/src/commands/use.rs +++ b/src/commands/use.rs @@ -1,65 +1,75 @@ use super::command::Command; use super::install::Install; +use crate::current_version::current_version; use crate::fs; use crate::installed_versions; use crate::outln; use crate::system_version; use crate::user_version::UserVersion; use crate::version::Version; +use crate::version_file_strategy::VersionFileStrategy; +use crate::version_switch_strategy::VersionSwitchStrategy; use crate::{config::FnmConfig, user_version_reader::UserVersionReader}; use colored::Colorize; -use snafu::{ensure, OptionExt, ResultExt, Snafu}; -use structopt::StructOpt; +use std::path::Path; +use thiserror::Error; -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct Use { version: Option, /// Install the version if it isn't installed yet - #[structopt(long)] + #[clap(long)] install_if_missing: bool, + + /// Don't output a message identifying the version being used + /// if it will not change due to execution of this command + #[clap(long)] + silent_if_unchanged: bool, } impl Command for Use { type Error = Error; fn apply(self, config: &FnmConfig) -> Result<(), Self::Error> { - let multishell_path = config.multishell_path().context(FnmEnvWasNotSourced)?; + let multishell_path = config.multishell_path().ok_or(Error::FnmEnvWasNotSourced)?; warn_if_multishell_path_not_in_path_env_var(multishell_path, config); - let all_versions = - installed_versions::list(config.installations_dir()).context(VersionListingError)?; + let all_versions = installed_versions::list(config.installations_dir()) + .map_err(|source| Error::VersionListingError { source })?; let requested_version = self .version .unwrap_or_else(|| { let current_dir = std::env::current_dir().unwrap(); UserVersionReader::Path(current_dir) }) - .into_user_version() - .context(CantInferVersion)?; + .into_user_version(config) + .ok_or_else(|| match config.version_file_strategy() { + VersionFileStrategy::Local => InferVersionError::Local, + VersionFileStrategy::Recursive => InferVersionError::Recursive, + }) + .map_err(|source| Error::CantInferVersion { source })?; - let version_path = if let UserVersion::Full(Version::Bypassed) = requested_version { - outln!( - config, - Info, + let (message, version_path) = if let UserVersion::Full(Version::Bypassed) = + requested_version + { + let message = format!( "Bypassing fnm: using {} node", system_version::display_name().cyan() ); - system_version::path() + (message, system_version::path()) } else if let Some(alias_name) = requested_version.alias_name() { let alias_path = config.aliases_dir().join(&alias_name); let system_path = system_version::path(); if matches!(fs::shallow_read_symlink(&alias_path), Ok(shallow_path) if shallow_path == system_path) { - outln!( - config, - Info, + let message = format!( "Bypassing fnm: using {} node", system_version::display_name().cyan() ); - system_path + (message, system_path) } else if alias_path.exists() { - outln!(config, Info, "Using Node for alias {}", alias_name.cyan()); - alias_path + let message = format!("Using Node for alias {}", alias_name.cyan()); + (message, alias_path) } else { install_new_version(requested_version, config, self.install_if_missing)?; return Ok(()); @@ -67,45 +77,67 @@ impl Command for Use { } else { let current_version = requested_version.to_version(&all_versions, config); if let Some(version) = current_version { - outln!(config, Info, "Using Node {}", version.to_string().cyan()); - config + let version_path = config .installations_dir() .join(version.to_string()) - .join("installation") + .join("installation"); + let message = format!("Using Node {}", version.to_string().cyan()); + (message, version_path) } else { install_new_version(requested_version, config, self.install_if_missing)?; return Ok(()); } }; - replace_symlink(&version_path, multishell_path).context(SymlinkingCreationIssue)?; + if !self.silent_if_unchanged || will_version_change(&version_path, config) { + outln!(config, Info, "{}", message); + } + + if let Some(multishells_path) = multishell_path.parent() { + std::fs::create_dir_all(multishells_path).map_err(|_err| { + Error::MultishellDirectoryCreationIssue { + path: multishells_path.to_path_buf(), + } + })?; + } + + replace_symlink(&version_path, multishell_path) + .map_err(|source| Error::SymlinkingCreationIssue { source })?; Ok(()) } } +fn will_version_change(resolved_path: &Path, config: &FnmConfig) -> bool { + let current_version_path = current_version(config) + .unwrap_or(None) + .map(|v| v.installation_path(config)); + + current_version_path.as_deref() != Some(resolved_path) +} + fn install_new_version( requested_version: UserVersion, config: &FnmConfig, install_if_missing: bool, ) -> Result<(), Error> { - ensure!( - install_if_missing || should_install_interactively(&requested_version), - CantFindVersion { - version: requested_version - } - ); + if !install_if_missing && !should_install_interactively(&requested_version) { + return Err(Error::CantFindVersion { + version: requested_version, + }); + } Install { version: Some(requested_version.clone()), ..Install::default() } .apply(config) - .context(InstallError)?; + .map_err(|source| Error::InstallError { source })?; Use { version: Some(UserVersionReader::Direct(requested_version)), install_if_missing: true, + silent_if_unchanged: false, } .apply(config)?; @@ -119,8 +151,8 @@ fn install_new_version( /// /// This way, we can create a symlink if it is missing. fn replace_symlink(from: &std::path::Path, to: &std::path::Path) -> std::io::Result<()> { - let symlink_deletion_result = fs::remove_symlink_dir(&to); - match fs::symlink_dir(&from, &to) { + let symlink_deletion_result = fs::remove_symlink_dir(to); + match fs::symlink_dir(from, to) { ok @ Ok(_) => ok, err @ Err(_) => symlink_deletion_result.and(err), } @@ -153,6 +185,13 @@ fn warn_if_multishell_path_not_in_path_env_var( multishell_path: &std::path::Path, config: &FnmConfig, ) { + if matches!( + config.version_switch_strategy(), + VersionSwitchStrategy::Shims + ) { + return; + } + let bin_path = if cfg!(unix) { multishell_path.join("bin") } else { @@ -175,27 +214,36 @@ fn warn_if_multishell_path_not_in_path_env_var( ); } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display("Can't create the symlink: {}", source))] + #[error("Can't create the symlink: {}", source)] SymlinkingCreationIssue { source: std::io::Error }, - #[snafu(display("Can't read the symlink: {}", source))] - SymlinkReadFailed { source: std::io::Error }, - #[snafu(display("{}", source))] + #[error(transparent)] InstallError { source: ::Error }, - #[snafu(display("Can't get locally installed versions: {}", source))] + #[error("Can't get locally installed versions: {}", source)] VersionListingError { source: installed_versions::Error }, - #[snafu(display("Requested version {} is not currently installed", version))] + #[error("Requested version {} is not currently installed", version)] CantFindVersion { version: UserVersion }, - #[snafu(display( - "Can't find version in dotfiles. Please provide a version manually to the command." - ))] - CantInferVersion, - #[snafu(display( + #[error(transparent)] + CantInferVersion { + #[from] + source: InferVersionError, + }, + #[error( "{}\n{}\n{}", "We can't find the necessary environment variables to replace the Node version.", "You should setup your shell profile to evaluate `fnm env`, see https://github.com/Schniz/fnm#shell-setup on how to do this", "Check out our documentation for more information: https://fnm.vercel.app" - ))] + )] FnmEnvWasNotSourced, + #[error("Can't create the multishell directory: {}", path.display())] + MultishellDirectoryCreationIssue { path: std::path::PathBuf }, +} + +#[derive(Debug, Error)] +pub enum InferVersionError { + #[error("Can't find version in dotfiles. Please provide a version manually to the command.")] + Local, + #[error("Could not find any version to use. Maybe you don't have a default version set?\nTry running `fnm default ` to set one,\nor create a .node-version file inside your project to declare a Node.js version.")] + Recursive, } diff --git a/src/config.rs b/src/config.rs index ec69b4c..f65df35 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,19 +1,14 @@ -use crate::arch::Arch; use crate::log_level::LogLevel; -use crate::outln; use crate::path_ext::PathExt; -use colored::Colorize; +use crate::version_file_strategy::VersionFileStrategy; +use crate::{arch::Arch, version_switch_strategy::VersionSwitchStrategy}; use dirs::{data_dir, home_dir}; -use std::sync::atomic::{AtomicBool, Ordering}; -use structopt::StructOpt; use url::Url; -static HAS_WARNED_DEPRECATED_BASE_DIR: AtomicBool = AtomicBool::new(false); - -#[derive(StructOpt, Debug)] +#[derive(clap::Parser, Debug)] pub struct FnmConfig { /// https://nodejs.org/dist/ mirror - #[structopt( + #[clap( long, env = "FNM_NODE_DIST_MIRROR", default_value = "https://nodejs.org/dist", @@ -23,7 +18,7 @@ pub struct FnmConfig { pub node_dist_mirror: Url, /// The root directory of fnm installations. - #[structopt( + #[clap( long = "fnm-dir", env = "FNM_DIR", global = true, @@ -34,16 +29,11 @@ pub struct FnmConfig { /// Where the current node version link is stored. /// This value will be populated automatically by evaluating /// `fnm env` in your shell profile. Read more about it using `fnm help env` - #[structopt( - long, - env = "FNM_MULTISHELL_PATH", - hide_env_values = true, - hidden = true - )] + #[clap(long, env = "FNM_MULTISHELL_PATH", hide_env_values = true, hide = true)] multishell_path: Option, /// The log level of fnm commands - #[structopt( + #[clap( long, env = "FNM_LOGLEVEL", default_value = "info", @@ -55,14 +45,39 @@ pub struct FnmConfig { /// Override the architecture of the installed Node binary. /// Defaults to arch of fnm binary. - #[structopt( + #[clap( long, env = "FNM_ARCH", - default_value, + default_value_t, global = true, - hide_env_values = true + hide_env_values = true, + hide_default_value = true )] pub arch: Arch, + + /// A strategy for how to resolve the Node version. Used whenever `fnm use` or `fnm install` is + /// called without a version, or when `--use-on-cd` is configured on evaluation. + /// + /// * `local`: Use the local version of Node defined within the current directory + /// + /// * `recursive`: Use the version of Node defined within the current directory and all parent directories + #[clap( + long, + env = "FNM_VERSION_FILE_STRATEGY", + possible_values = VersionFileStrategy::possible_values(), + default_value = "local", + global = true, + hide_env_values = true, + )] + version_file_strategy: VersionFileStrategy, + + #[clap( + env = "FNM_VERSION_SWITCH_STRATEGY", + hide = true, + possible_values = VersionSwitchStrategy::possible_values(), + default_value = "path-symlink" + )] + version_switch_strategy: VersionSwitchStrategy, } impl Default for FnmConfig { @@ -73,11 +88,17 @@ impl Default for FnmConfig { multishell_path: None, log_level: LogLevel::Info, arch: Arch::default(), + version_file_strategy: VersionFileStrategy::default(), + version_switch_strategy: VersionSwitchStrategy::default(), } } } impl FnmConfig { + pub fn version_file_strategy(&self) -> &VersionFileStrategy { + &self.version_file_strategy + } + pub fn multishell_path(&self) -> Option<&std::path::Path> { match &self.multishell_path { None => None, @@ -102,24 +123,6 @@ impl FnmConfig { let modern = data_dir().map(|dir| dir.join("fnm")); if let Some(dir) = legacy { - if !HAS_WARNED_DEPRECATED_BASE_DIR.load(Ordering::SeqCst) { - HAS_WARNED_DEPRECATED_BASE_DIR.store(true, Ordering::SeqCst); - - let legacy_str = dir.display().to_string(); - let modern_str = modern.map_or("$XDG_DATA_HOME/fnm".to_string(), |path| { - path.display().to_string() - }); - - outln!( - self, Error, - "{}\n It looks like you have the {} directory on your disk.\n fnm is migrating its default storage location for application data to {}.\n You can read more about it here: {}\n", - "warning:".yellow().bold(), - legacy_str.italic(), - modern_str.italic(), - "https://github.com/schniz/fnm/issues/357".italic() - ); - } - return dir; } @@ -144,6 +147,10 @@ impl FnmConfig { .ensure_exists_silently() } + pub fn version_switch_strategy(&self) -> &VersionSwitchStrategy { + &self.version_switch_strategy + } + #[cfg(test)] pub fn with_base_dir(mut self, base_dir: Option) -> Self { self.base_dir = base_dir; diff --git a/src/current_version.rs b/src/current_version.rs index 6f7fab3..8dbf846 100644 --- a/src/current_version.rs +++ b/src/current_version.rs @@ -1,10 +1,11 @@ +use thiserror::Error; + use crate::config::FnmConfig; use crate::system_version; use crate::version::Version; -use snafu::{OptionExt, ResultExt, Snafu}; pub fn current_version(config: &FnmConfig) -> Result, Error> { - let multishell_path = config.multishell_path().context(EnvNotApplied)?; + let multishell_path = config.multishell_path().ok_or(Error::EnvNotApplied)?; if multishell_path.read_link().ok() == Some(system_version::path()) { return Ok(Some(Version::Bypassed)); @@ -19,20 +20,21 @@ pub fn current_version(config: &FnmConfig) -> Result, Error> { .expect("Can't get filename") .to_str() .expect("Invalid OS string"); - let version = Version::parse(file_name).context(VersionError { version: file_name })?; + let version = Version::parse(file_name).map_err(|source| Error::VersionError { + source, + version: file_name.to_string(), + })?; Ok(Some(version)) } else { Ok(None) } } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - #[snafu(display( - "`fnm env` was not applied in this context.\nCan't find fnm's environment variables" - ))] + #[error("`fnm env` was not applied in this context.\nCan't find fnm's environment variables")] EnvNotApplied, - #[snafu(display("Can't read the version as a valid semver"))] + #[error("Can't read the version as a valid semver")] VersionError { source: semver::Error, version: String, diff --git a/src/default_version.rs b/src/default_version.rs new file mode 100644 index 0000000..dc42eb9 --- /dev/null +++ b/src/default_version.rs @@ -0,0 +1,9 @@ +use crate::config::FnmConfig; +use crate::version::Version; +use std::str::FromStr; + +pub fn find_default_version(config: &FnmConfig) -> Option { + let version_path = config.default_version_dir().canonicalize().ok()?; + let file_name = version_path.parent()?.file_name()?; + Version::from_str(file_name.to_str()?).ok()?.into() +} diff --git a/src/directories.rs b/src/directories.rs new file mode 100644 index 0000000..0f7c8c0 --- /dev/null +++ b/src/directories.rs @@ -0,0 +1,26 @@ +use std::path::PathBuf; + +fn xdg_dir(env: &str) -> Option { + let env_var = std::env::var(env).ok()?; + Some(PathBuf::from(env_var)) +} + +fn state_dir() -> Option { + xdg_dir("XDG_STATE_HOME").or_else(dirs::state_dir) +} + +fn cache_dir() -> Option { + xdg_dir("XDG_CACHE_HOME").or_else(dirs::cache_dir) +} + +fn runtime_dir() -> Option { + xdg_dir("XDG_RUNTIME_DIR").or_else(dirs::runtime_dir) +} + +pub fn multishell_storage() -> PathBuf { + runtime_dir() + .or_else(state_dir) + .or_else(cache_dir) + .unwrap_or_else(std::env::temp_dir) + .join("fnm_multishells") +} diff --git a/src/downloader.rs b/src/downloader.rs index 2a653d3..866481f 100644 --- a/src/downloader.rs +++ b/src/downloader.rs @@ -4,38 +4,34 @@ use crate::archive::{Error as ExtractError, Extract}; use crate::directory_portal::DirectoryPortal; use crate::version::Version; use log::debug; -use snafu::{ensure, OptionExt, ResultExt, Snafu}; use std::path::Path; use std::path::PathBuf; +use thiserror::Error; use url::Url; -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { + #[error(transparent)] HttpError { + #[from] source: crate::http::Error, }, + #[error(transparent)] IoError { + #[from] source: std::io::Error, }, - #[snafu(display("Can't extract the file: {}", source))] + #[error("Can't extract the file: {}", source)] CantExtractFile { + #[from] source: ExtractError, }, - #[snafu(display("The downloaded archive is empty"))] + #[error("The downloaded archive is empty")] TarIsEmpty, - #[snafu(display( - "{} for {} not found upstream.\nYou can `fnm ls-remote` to see available versions or try a different `--arch`.", - version, - arch - ))] - VersionNotFound { - version: Version, - arch: Arch, - }, - #[snafu(display("Version already installed at {:?}", path))] - VersionAlreadyInstalled { - path: PathBuf, - }, + #[error("{} for {} not found upstream.\nYou can `fnm ls-remote` to see available versions or try a different `--arch`.", version, arch)] + VersionNotFound { version: Version, arch: Arch }, + #[error("Version already installed at {:?}", path)] + VersionAlreadyInstalled { path: PathBuf }, } #[cfg(unix)] @@ -75,7 +71,7 @@ pub fn extract_archive_into>( let extractor = archive::TarXz::new(response); #[cfg(windows)] let extractor = archive::Zip::new(response); - extractor.extract_into(path).context(CantExtractFile)?; + extractor.extract_into(path)?; Ok(()) } @@ -88,23 +84,22 @@ pub fn install_node_dist>( ) -> Result<(), Error> { let installation_dir = PathBuf::from(installations_dir.as_ref()).join(version.v_str()); - ensure!( - !installation_dir.exists(), - VersionAlreadyInstalled { - path: installation_dir - } - ); + if installation_dir.exists() { + return Err(Error::VersionAlreadyInstalled { + path: installation_dir, + }); + } - std::fs::create_dir_all(installations_dir.as_ref()).context(IoError)?; + std::fs::create_dir_all(installations_dir.as_ref())?; let temp_installations_dir = installations_dir.as_ref().join(".downloads"); - std::fs::create_dir_all(&temp_installations_dir).context(IoError)?; + std::fs::create_dir_all(&temp_installations_dir)?; let portal = DirectoryPortal::new_in(&temp_installations_dir, installation_dir); let url = download_url(node_dist_mirror, version, arch); debug!("Going to call for {}", &url); - let response = crate::http::get(url.as_str()).context(HttpError)?; + let response = crate::http::get(url.as_str())?; if response.status() == 404 { return Err(Error::VersionNotFound { @@ -117,17 +112,15 @@ pub fn install_node_dist>( extract_archive_into(&portal, response)?; debug!("Extraction completed"); - let installed_directory = std::fs::read_dir(&portal) - .context(IoError)? + let installed_directory = std::fs::read_dir(&portal)? .next() - .context(TarIsEmpty)? - .context(IoError)?; + .ok_or(Error::TarIsEmpty)??; let installed_directory = installed_directory.path(); let renamed_installation_dir = portal.join("installation"); - std::fs::rename(installed_directory, renamed_installation_dir).context(IoError)?; + std::fs::rename(installed_directory, renamed_installation_dir)?; - portal.teleport().context(IoError)?; + portal.teleport()?; Ok(()) } @@ -159,13 +152,11 @@ mod tests { #[test_log::test] fn test_installing_npm() { let installations_dir = tempdir().unwrap(); - let npm_path = install_in(installations_dir.path()).join(if cfg!(windows) { - "npm.cmd" - } else { - "npm" - }); + let bin_dir = install_in(installations_dir.path()); + let npm_path = bin_dir.join(if cfg!(windows) { "npm.cmd" } else { "npm" }); let stdout = duct::cmd(npm_path.to_str().unwrap(), vec!["--version"]) + .env("PATH", bin_dir) .stdout_capture() .run() .expect("Can't run npm") diff --git a/src/installed_versions.rs b/src/installed_versions.rs index 4d875c3..bf2a147 100644 --- a/src/installed_versions.rs +++ b/src/installed_versions.rs @@ -1,11 +1,11 @@ use crate::version::Version; -use snafu::{ResultExt, Snafu}; use std::path::Path; +use thiserror::Error; pub fn list>(installations_dir: P) -> Result, Error> { let mut vec = vec![]; - for result_entry in installations_dir.as_ref().read_dir().context(IoError)? { - let entry = result_entry.context(IoError)?; + for result_entry in installations_dir.as_ref().read_dir()? { + let entry = result_entry?; if entry .file_name() .to_str() @@ -17,19 +17,25 @@ pub fn list>(installations_dir: P) -> Result, Error> let path = entry.path(); let filename = path .file_name() - .ok_or_else(|| std::io::Error::from(std::io::ErrorKind::NotFound)) - .context(IoError)? + .ok_or_else(|| std::io::Error::from(std::io::ErrorKind::NotFound))? .to_str() - .ok_or_else(|| std::io::Error::from(std::io::ErrorKind::NotFound)) - .context(IoError)?; - let version = Version::parse(filename).context(SemverError)?; + .ok_or_else(|| std::io::Error::from(std::io::ErrorKind::NotFound))?; + let version = Version::parse(filename)?; vec.push(version); } Ok(vec) } -#[derive(Debug, Snafu)] +#[derive(Debug, Error)] pub enum Error { - IoError { source: std::io::Error }, - SemverError { source: semver::Error }, + #[error(transparent)] + IoError { + #[from] + source: std::io::Error, + }, + #[error(transparent)] + SemverError { + #[from] + source: semver::Error, + }, } diff --git a/src/log_level.rs b/src/log_level.rs index 61d03f5..2157c02 100644 --- a/src/log_level.rs +++ b/src/log_level.rs @@ -22,6 +22,14 @@ impl LogLevel { } } + pub fn as_str(&self) -> &'static str { + match self { + Self::Quiet => "quiet", + Self::Error => "error", + Self::Info => "info", + } + } + pub fn possible_values() -> &'static [&'static str; 4] { &["quiet", "info", "all", "error"] } @@ -29,11 +37,7 @@ impl LogLevel { impl From for &'static str { fn from(level: LogLevel) -> Self { - match level { - LogLevel::Quiet => "quiet", - LogLevel::Info => "info", - LogLevel::Error => "error", - } + level.as_str() } } diff --git a/src/main.rs b/src/main.rs index 53003e3..3a04bb7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,10 +29,14 @@ mod system_version; mod user_version; mod user_version_reader; mod version; +mod version_file_strategy; mod version_files; #[macro_use] mod log_level; +mod default_version; +mod directories; +mod version_switch_strategy; fn main() { env_logger::init(); diff --git a/src/shell/bash.rs b/src/shell/bash.rs index 9589e5a..64982a1 100644 --- a/src/shell/bash.rs +++ b/src/shell/bash.rs @@ -1,41 +1,54 @@ +use crate::version_file_strategy::VersionFileStrategy; + use super::shell::Shell; -use indoc::indoc; +use indoc::{formatdoc, indoc}; use std::path::Path; #[derive(Debug)] pub struct Bash; impl Shell for Bash { - fn to_structopt_shell(&self) -> structopt::clap::Shell { - structopt::clap::Shell::Bash + fn to_clap_shell(&self) -> clap_complete::Shell { + clap_complete::Shell::Bash } - fn path(&self, path: &Path) -> String { - format!("export PATH={:?}:$PATH", path.to_str().unwrap()) + fn path(&self, path: &Path) -> anyhow::Result { + let path = path + .to_str() + .ok_or_else(|| anyhow::anyhow!("Can't convert path to string"))?; + Ok(format!("export PATH={:?}:$PATH", path)) } fn set_env_var(&self, name: &str, value: &str) -> String { format!("export {}={:?}", name, value) } - fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { - indoc!( - r#" - __fnm_use_if_file_found() { + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result { + let autoload_hook = match config.version_file_strategy() { + VersionFileStrategy::Local => indoc!( + r#" if [[ -f .node-version || -f .nvmrc ]]; then - fnm use + fnm use --silent-if-unchanged fi - } + "# + ), + VersionFileStrategy::Recursive => r#"fnm use --silent-if-unchanged"#, + }; + Ok(formatdoc!( + r#" + __fnm_use_if_file_found() {{ + {autoload_hook} + }} - __fnmcd() { + __fnmcd() {{ \cd "$@" || return $? __fnm_use_if_file_found - } + }} alias cd=__fnmcd __fnm_use_if_file_found - "# - ) - .into() + "#, + autoload_hook = autoload_hook + )) } } diff --git a/src/shell/fish.rs b/src/shell/fish.rs index 0d08af2..8856407 100644 --- a/src/shell/fish.rs +++ b/src/shell/fish.rs @@ -1,36 +1,49 @@ +use crate::version_file_strategy::VersionFileStrategy; + use super::shell::Shell; -use indoc::indoc; +use indoc::{formatdoc, indoc}; use std::path::Path; #[derive(Debug)] pub struct Fish; impl Shell for Fish { - fn to_structopt_shell(&self) -> structopt::clap::Shell { - structopt::clap::Shell::Fish + fn to_clap_shell(&self) -> clap_complete::Shell { + clap_complete::Shell::Fish } - fn path(&self, path: &Path) -> String { - format!("set -gx PATH {:?} $PATH;", path.to_str().unwrap()) + fn path(&self, path: &Path) -> anyhow::Result { + let path = path + .to_str() + .ok_or_else(|| anyhow::anyhow!("Can't convert path to string"))?; + Ok(format!("set -gx PATH {:?} $PATH;", path)) } fn set_env_var(&self, name: &str, value: &str) -> String { format!("set -gx {name} {value:?};", name = name, value = value) } - fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { - indoc!( + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result { + let autoload_hook = match config.version_file_strategy() { + VersionFileStrategy::Local => indoc!( + r#" + if test -f .node-version -o -f .nvmrc + fnm use --silent-if-unchanged + end + "# + ), + VersionFileStrategy::Recursive => r#"fnm use --silent-if-unchanged"#, + }; + Ok(formatdoc!( r#" function _fnm_autoload_hook --on-variable PWD --description 'Change Node version on directory change' status --is-command-substitution; and return - if test -f .node-version -o -f .nvmrc - fnm use - end + {autoload_hook} end _fnm_autoload_hook - "# - ) - .into() + "#, + autoload_hook = autoload_hook + )) } } diff --git a/src/shell/infer/mod.rs b/src/shell/infer/mod.rs index 157f042..e0c22c6 100644 --- a/src/shell/infer/mod.rs +++ b/src/shell/infer/mod.rs @@ -1,34 +1,21 @@ -use super::{Bash, Fish, PowerShell, Shell, WindowsCmd, Zsh}; -use log::debug; -use std::ffi::OsStr; -use sysinfo::{ProcessExt, System, SystemExt}; +mod unix; -pub fn infer_shell() -> Option> { - let mut system = System::new(); - let mut current_pid = sysinfo::get_current_pid().ok(); +mod windows; - while let Some(pid) = current_pid { - system.refresh_process(pid); - if let Some(process) = system.process(pid) { - current_pid = process.parent(); - let process_name = process - .exe() - .file_stem() - .and_then(OsStr::to_str) - .map(str::to_lowercase); - let sliced = process_name.as_ref().map(|x| &x[..]); - match sliced { - Some("sh" | "bash") => return Some(Box::from(Bash)), - Some("zsh") => return Some(Box::from(Zsh)), - Some("fish") => return Some(Box::from(Fish)), - Some("pwsh" | "powershell") => return Some(Box::from(PowerShell)), - Some("cmd") => return Some(Box::from(WindowsCmd)), - cmd_name => debug!("binary is not a supported shell: {:?}", cmd_name), - }; - } else { - current_pid = None; - } - } +#[cfg(unix)] +pub use self::unix::infer_shell; +#[cfg(not(unix))] +pub use self::windows::infer_shell; +pub(self) fn shell_from_string(shell: &str) -> Option> { + use super::{Bash, Fish, PowerShell, WindowsCmd, Zsh}; + match shell { + "sh" | "bash" => return Some(Box::from(Bash)), + "zsh" => return Some(Box::from(Zsh)), + "fish" => return Some(Box::from(Fish)), + "pwsh" | "powershell" => return Some(Box::from(PowerShell)), + "cmd" => return Some(Box::from(WindowsCmd)), + cmd_name => log::debug!("binary is not a supported shell: {:?}", cmd_name), + }; None } diff --git a/src/shell/infer/unix.rs b/src/shell/infer/unix.rs new file mode 100644 index 0000000..6836fed --- /dev/null +++ b/src/shell/infer/unix.rs @@ -0,0 +1,121 @@ +#![cfg(unix)] + +use crate::shell::Shell; +use log::debug; +use std::io::{Error, ErrorKind}; +use thiserror::Error; + +#[derive(Debug)] +struct ProcessInfo { + parent_pid: Option, + command: String, +} + +const MAX_ITERATIONS: u8 = 10; + +pub fn infer_shell() -> Option> { + let mut pid = Some(std::process::id()); + let mut visited = 0; + + while let Some(current_pid) = pid { + if visited > MAX_ITERATIONS { + return None; + } + + let process_info = get_process_info(current_pid) + .map_err(|err| { + debug!("{}", err); + err + }) + .ok()?; + let binary = process_info + .command + .trim_start_matches('-') + .split('/') + .last()?; + + if let Some(shell) = super::shell_from_string(binary) { + return Some(shell); + } + + pid = process_info.parent_pid; + visited += 1; + } + + None +} + +fn get_process_info(pid: u32) -> Result { + use std::io::{BufRead, BufReader}; + use std::process::Command; + + let buffer = Command::new("ps") + .arg("-o") + .arg("ppid,comm") + .arg(pid.to_string()) + .stdout(std::process::Stdio::piped()) + .spawn()? + .stdout + .ok_or_else(|| Error::from(ErrorKind::UnexpectedEof))?; + + let mut lines = BufReader::new(buffer).lines(); + + // skip header line + lines + .next() + .ok_or_else(|| Error::from(ErrorKind::UnexpectedEof))??; + + let line = lines + .next() + .ok_or_else(|| Error::from(ErrorKind::NotFound))??; + + let mut parts = line.split_whitespace(); + let ppid = parts.next().ok_or_else(|| ProcessInfoError::Parse { + expectation: "Can't read the ppid from ps, should be the first item in the table", + got: line.to_string(), + })?; + let command = parts.next().ok_or_else(|| ProcessInfoError::Parse { + expectation: "Can't read the command from ps, should be the second item in the table", + got: line.to_string(), + })?; + + Ok(ProcessInfo { + parent_pid: ppid.parse().ok(), + command: command.into(), + }) +} + +#[derive(Debug, Error)] +enum ProcessInfoError { + #[error("Can't read process info: {source}")] + Io { + #[source] + #[from] + source: std::io::Error, + }, + #[error("Can't parse process info output. {expectation}. Got: {got}")] + Parse { + got: String, + expectation: &'static str, + }, +} + +#[cfg(all(test, unix))] +mod tests { + use super::*; + use pretty_assertions::assert_eq; + use std::process::{Command, Stdio}; + + #[test] + fn test_get_process_info() -> anyhow::Result<()> { + let subprocess = Command::new("bash") + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn()?; + let process_info = get_process_info(subprocess.id()); + let parent_pid = process_info.ok().and_then(|x| x.parent_pid); + assert_eq!(parent_pid, Some(std::process::id())); + Ok(()) + } +} diff --git a/src/shell/infer/windows.rs b/src/shell/infer/windows.rs new file mode 100644 index 0000000..3b78180 --- /dev/null +++ b/src/shell/infer/windows.rs @@ -0,0 +1,33 @@ +#![cfg(not(unix))] + +use crate::shell::Shell; +use std::ffi::OsStr; +use sysinfo::{ProcessExt, System, SystemExt}; + +pub fn infer_shell() -> Option> { + let mut system = System::new(); + let mut current_pid = sysinfo::get_current_pid().ok(); + + while let Some(pid) = current_pid { + system.refresh_process(pid); + if let Some(process) = system.process(pid) { + current_pid = process.parent(); + let process_name = process + .exe() + .file_stem() + .and_then(OsStr::to_str) + .map(str::to_lowercase); + if let Some(shell) = process_name + .as_ref() + .map(|x| &x[..]) + .and_then(super::shell_from_string) + { + return Some(shell); + } + } else { + current_pid = None; + } + } + + None +} diff --git a/src/shell/powershell.rs b/src/shell/powershell.rs index 9603e6f..d3c8817 100644 --- a/src/shell/powershell.rs +++ b/src/shell/powershell.rs @@ -1,34 +1,51 @@ +use crate::version_file_strategy::VersionFileStrategy; + use super::Shell; -use indoc::indoc; +use indoc::{formatdoc, indoc}; use std::path::Path; #[derive(Debug)] pub struct PowerShell; impl Shell for PowerShell { - fn path(&self, path: &Path) -> String { - let current_path = std::env::var_os("PATH").expect("Can't read PATH env var"); + fn path(&self, path: &Path) -> anyhow::Result { + let current_path = + std::env::var_os("PATH").ok_or_else(|| anyhow::anyhow!("Can't read PATH env var"))?; let mut split_paths: Vec<_> = std::env::split_paths(¤t_path).collect(); split_paths.insert(0, path.to_path_buf()); - let new_path = std::env::join_paths(split_paths).expect("Can't join paths"); - self.set_env_var("PATH", new_path.to_str().expect("Can't read PATH")) + let new_path = std::env::join_paths(split_paths) + .map_err(|source| anyhow::anyhow!("Can't join paths: {}", source))?; + let new_path = new_path + .to_str() + .ok_or_else(|| anyhow::anyhow!("Can't read PATH"))?; + Ok(self.set_env_var("PATH", new_path)) } fn set_env_var(&self, name: &str, value: &str) -> String { format!(r#"$env:{} = "{}""#, name, value) } - fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { - indoc!(r#" - function Set-FnmOnLoad { If ((Test-Path .nvmrc) -Or (Test-Path .node-version)) { & fnm use } } - function Set-LocationWithFnm { param($path); Set-Location $path; Set-FnmOnLoad } - Set-Alias cd_with_fnm Set-LocationWithFnm -Force - Remove-Item alias:\cd - New-Alias cd Set-LocationWithFnm - Set-FnmOnLoad - "#).into() + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result { + let autoload_hook = match config.version_file_strategy() { + VersionFileStrategy::Local => indoc!( + r#" + If ((Test-Path .nvmrc) -Or (Test-Path .node-version)) { & fnm use --silent-if-unchanged } + "# + ), + VersionFileStrategy::Recursive => r#"fnm use --silent-if-unchanged"#, + }; + Ok(formatdoc!( + r#" + function global:Set-FnmOnLoad {{ {autoload_hook} }} + function global:Set-LocationWithFnm {{ param($path); if ($path -eq $null) {{Set-Location}} else {{Set-Location $path}}; Set-FnmOnLoad }} + Set-Alias -Scope global cd_with_fnm Set-LocationWithFnm + Set-Alias -Option AllScope -Scope global cd Set-LocationWithFnm + Set-FnmOnLoad + "#, + autoload_hook = autoload_hook + )) } - fn to_structopt_shell(&self) -> clap::Shell { - clap::Shell::PowerShell + fn to_clap_shell(&self) -> clap_complete::Shell { + clap_complete::Shell::PowerShell } } diff --git a/src/shell/shell.rs b/src/shell/shell.rs index 8d48824..45488fa 100644 --- a/src/shell/shell.rs +++ b/src/shell/shell.rs @@ -2,13 +2,13 @@ use std::fmt::Debug; use std::path::Path; pub trait Shell: Debug { - fn path(&self, path: &Path) -> String; + fn path(&self, path: &Path) -> anyhow::Result; fn set_env_var(&self, name: &str, value: &str) -> String; - fn use_on_cd(&self, config: &crate::config::FnmConfig) -> String; + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result; fn rehash(&self) -> Option { None } - fn to_structopt_shell(&self) -> structopt::clap::Shell; + fn to_clap_shell(&self) -> clap_complete::Shell; } #[cfg(windows)] @@ -32,8 +32,8 @@ impl std::str::FromStr for Box { } } -impl From> for structopt::clap::Shell { +impl From> for clap_complete::Shell { fn from(shell: Box) -> Self { - shell.to_structopt_shell() + shell.to_clap_shell() } } diff --git a/src/shell/windows_cmd/cd.cmd b/src/shell/windows_cmd/cd.cmd index a49c3a7..3e78176 100644 --- a/src/shell/windows_cmd/cd.cmd +++ b/src/shell/windows_cmd/cd.cmd @@ -1,10 +1,14 @@ @echo off cd %1 -if exist .nvmrc ( - fnm use +if "%FNM_VERSION_FILE_STRATEGY%" == "recursive" ( + fnm use --silent-if-unchanged ) else ( + if exist .nvmrc ( + fnm use --silent-if-unchanged + ) else ( if exist .node-version ( - fnm use + fnm use --silent-if-unchanged ) + ) ) -@echo on \ No newline at end of file +@echo on diff --git a/src/shell/windows_cmd/mod.rs b/src/shell/windows_cmd/mod.rs index f1f6d4c..57faeb3 100644 --- a/src/shell/windows_cmd/mod.rs +++ b/src/shell/windows_cmd/mod.rs @@ -5,29 +5,41 @@ use std::path::Path; pub struct WindowsCmd; impl Shell for WindowsCmd { - fn to_structopt_shell(&self) -> structopt::clap::Shell { + fn to_clap_shell(&self) -> clap_complete::Shell { + // TODO: move to Option panic!("Shell completion is not supported for Windows Command Prompt. Maybe try using PowerShell for a better experience?"); } - fn path(&self, path: &Path) -> String { - let current_path = std::env::var_os("path").expect("Can't read PATH env var"); + fn path(&self, path: &Path) -> anyhow::Result { + let current_path = + std::env::var_os("path").ok_or_else(|| anyhow::anyhow!("Can't read PATH env var"))?; let mut split_paths: Vec<_> = std::env::split_paths(¤t_path).collect(); split_paths.insert(0, path.to_path_buf()); - let new_path = std::env::join_paths(split_paths).expect("Can't join paths"); - format!("SET PATH={}", new_path.to_str().expect("Can't read PATH")) + let new_path = std::env::join_paths(split_paths) + .map_err(|err| anyhow::anyhow!("Can't join paths: {}", err))?; + let new_path = new_path + .to_str() + .ok_or_else(|| anyhow::anyhow!("Can't convert path to string"))?; + Ok(format!("SET PATH={}", new_path)) } fn set_env_var(&self, name: &str, value: &str) -> String { format!("SET {}={}", name, value) } - fn use_on_cd(&self, config: &crate::config::FnmConfig) -> String { + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result { let path = config.base_dir_with_default().join("cd.cmd"); - create_cd_file_at(&path).expect("Can't create cd.cmd file for use-on-cd"); - format!( - "doskey cd={} $*", - path.to_str().expect("Can't read path to cd.cmd") - ) + create_cd_file_at(&path).map_err(|source| { + anyhow::anyhow!( + "Can't create cd.cmd file for use-on-cd at {}: {}", + path.display(), + source + ) + })?; + let path = path + .to_str() + .ok_or_else(|| anyhow::anyhow!("Can't read path to cd.cmd"))?; + Ok(format!("doskey cd={} $*", path,)) } } diff --git a/src/shell/zsh.rs b/src/shell/zsh.rs index 9848048..9bc13ce 100644 --- a/src/shell/zsh.rs +++ b/src/shell/zsh.rs @@ -1,17 +1,22 @@ +use crate::version_file_strategy::VersionFileStrategy; + use super::shell::Shell; -use indoc::indoc; +use indoc::{formatdoc, indoc}; use std::path::Path; #[derive(Debug)] pub struct Zsh; impl Shell for Zsh { - fn to_structopt_shell(&self) -> structopt::clap::Shell { - structopt::clap::Shell::Zsh + fn to_clap_shell(&self) -> clap_complete::Shell { + clap_complete::Shell::Zsh } - fn path(&self, path: &Path) -> String { - format!("export PATH={:?}:$PATH", path.to_str().unwrap()) + fn path(&self, path: &Path) -> anyhow::Result { + let path = path + .to_str() + .ok_or_else(|| anyhow::anyhow!("Path is not valid UTF-8"))?; + Ok(format!("export PATH={:?}:$PATH", path)) } fn set_env_var(&self, name: &str, value: &str) -> String { @@ -22,20 +27,28 @@ impl Shell for Zsh { Some("rehash".to_string()) } - fn use_on_cd(&self, _config: &crate::config::FnmConfig) -> String { - indoc!( - r#" - autoload -U add-zsh-hook - _fnm_autoload_hook () { + fn use_on_cd(&self, config: &crate::config::FnmConfig) -> anyhow::Result { + let autoload_hook = match config.version_file_strategy() { + VersionFileStrategy::Local => indoc!( + r#" if [[ -f .node-version || -f .nvmrc ]]; then - fnm use + fnm use --silent-if-unchanged fi - } + "# + ), + VersionFileStrategy::Recursive => r#"fnm use --silent-if-unchanged"#, + }; + Ok(formatdoc!( + r#" + autoload -U add-zsh-hook + _fnm_autoload_hook () {{ + {autoload_hook} + }} add-zsh-hook chpwd _fnm_autoload_hook \ && _fnm_autoload_hook - "# - ) - .into() + "#, + autoload_hook = autoload_hook + )) } } diff --git a/src/user_version_reader.rs b/src/user_version_reader.rs index 78ab0ee..14190a6 100644 --- a/src/user_version_reader.rs +++ b/src/user_version_reader.rs @@ -1,3 +1,4 @@ +use crate::config::FnmConfig; use crate::user_version::UserVersion; use crate::version_files::{get_user_version_for_directory, get_user_version_for_file}; use std::path::PathBuf; @@ -10,11 +11,11 @@ pub enum UserVersionReader { } impl UserVersionReader { - pub fn into_user_version(self) -> Option { + pub fn into_user_version(self, config: &FnmConfig) -> Option { match self { Self::Direct(uv) => Some(uv), Self::Path(pathbuf) if pathbuf.is_file() => get_user_version_for_file(&pathbuf), - Self::Path(pathbuf) => get_user_version_for_directory(&pathbuf), + Self::Path(pathbuf) => get_user_version_for_directory(&pathbuf, config), } } } @@ -47,7 +48,8 @@ mod tests { write!(file, "14").unwrap(); let pathbuf = file.path().to_path_buf(); - let user_version = UserVersionReader::Path(pathbuf).into_user_version(); + let user_version = + UserVersionReader::Path(pathbuf).into_user_version(&FnmConfig::default()); assert_eq!(user_version, Some(UserVersion::OnlyMajor(14))); } @@ -58,14 +60,15 @@ mod tests { std::fs::write(node_version_path, "14").unwrap(); let pathbuf = directory.path().to_path_buf(); - let user_version = UserVersionReader::Path(pathbuf).into_user_version(); + let user_version = + UserVersionReader::Path(pathbuf).into_user_version(&FnmConfig::default()); assert_eq!(user_version, Some(UserVersion::OnlyMajor(14))); } #[test] fn test_direct_to_version() { - let user_version = - UserVersionReader::Direct(UserVersion::OnlyMajor(14)).into_user_version(); + let user_version = UserVersionReader::Direct(UserVersion::OnlyMajor(14)) + .into_user_version(&FnmConfig::default()); assert_eq!(user_version, Some(UserVersion::OnlyMajor(14))); } diff --git a/src/version.rs b/src/version.rs index 5883aa3..b6c4a13 100644 --- a/src/version.rs +++ b/src/version.rs @@ -13,7 +13,7 @@ pub enum Version { } fn first_letter_is_number(s: &str) -> bool { - s.chars().next().map_or(false, |x| x.is_digit(10)) + s.chars().next().map_or(false, |x| x.is_ascii_digit()) } impl Version { diff --git a/src/version_file_strategy.rs b/src/version_file_strategy.rs new file mode 100644 index 0000000..89005be --- /dev/null +++ b/src/version_file_strategy.rs @@ -0,0 +1,41 @@ +use std::str::FromStr; + +#[derive(Debug)] +pub enum VersionFileStrategy { + Local, + Recursive, +} + +impl VersionFileStrategy { + pub fn possible_values() -> &'static [&'static str] { + &["local", "recursive"] + } + + pub fn as_str(&self) -> &'static str { + match self { + VersionFileStrategy::Local => "local", + VersionFileStrategy::Recursive => "recursive", + } + } +} + +impl Default for VersionFileStrategy { + fn default() -> Self { + VersionFileStrategy::Local + } +} + +impl FromStr for VersionFileStrategy { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "local" => Ok(VersionFileStrategy::Local), + "recursive" => Ok(VersionFileStrategy::Recursive), + _ => Err(format!( + "Invalid strategy: {}. Expected one of: local, recursive", + s + )), + } + } +} diff --git a/src/version_files.rs b/src/version_files.rs index 4d0bbea..f002a68 100644 --- a/src/version_files.rs +++ b/src/version_files.rs @@ -1,4 +1,7 @@ +use crate::config::FnmConfig; +use crate::default_version; use crate::user_version::UserVersion; +use crate::version_file_strategy::VersionFileStrategy; use encoding_rs_io::DecodeReaderBytes; use log::info; use std::io::Read; @@ -7,7 +10,36 @@ use std::str::FromStr; const PATH_PARTS: [&str; 2] = [".nvmrc", ".node-version"]; -pub fn get_user_version_for_directory(path: impl AsRef) -> Option { +pub fn get_user_version_for_directory( + path: impl AsRef, + config: &FnmConfig, +) -> Option { + match config.version_file_strategy() { + VersionFileStrategy::Local => get_user_version_for_single_directory(path), + VersionFileStrategy::Recursive => { + get_user_version_for_directory_recursive(path).or_else(|| { + info!("Did not find anything recursively. Falling back to default alias."); + default_version::find_default_version(config).map(UserVersion::Full) + }) + } + } +} + +fn get_user_version_for_directory_recursive(path: impl AsRef) -> Option { + let mut current_path = Some(path.as_ref()); + + while let Some(child_path) = current_path { + if let Some(version) = get_user_version_for_single_directory(child_path) { + return Some(version); + } + + current_path = child_path.parent(); + } + + None +} + +pub fn get_user_version_for_single_directory(path: impl AsRef) -> Option { let path = path.as_ref(); for path_part in &PATH_PARTS { diff --git a/src/version_switch_strategy.rs b/src/version_switch_strategy.rs new file mode 100644 index 0000000..26eadb2 --- /dev/null +++ b/src/version_switch_strategy.rs @@ -0,0 +1,50 @@ +use std::str::FromStr; + +#[derive(Debug)] +pub enum VersionSwitchStrategy { + /// Creates a binary shim for calling `node`, instead of invoking it directly. + /// This is a WIP feature, and is not recommended for general use (unless one + /// wants to help with the development of this feature). + Shims, + + /// This is the default strategy. It creates a symlink to the Node.js binary + /// in the `bin` directory of the Node.js installation. + /// Then, it sets the `PATH` environment variable to point to that directory. + /// This is the most compatible strategy, but it requires rehashing the shell + /// every time you change the Node.js version. + PathSymlink, +} + +impl VersionSwitchStrategy { + pub fn possible_values() -> &'static [&'static str] { + &["shims", "path-symlink"] + } + + pub fn as_str(&self) -> &'static str { + match self { + Self::Shims => "shims", + Self::PathSymlink => "path-symlink", + } + } +} + +impl FromStr for VersionSwitchStrategy { + type Err = String; + + fn from_str(s: &str) -> Result { + match s { + "shims" => Ok(VersionSwitchStrategy::Shims), + "path-symlink" => Ok(VersionSwitchStrategy::PathSymlink), + _ => Err(format!( + "Unknown version switch strategy: {}. Valid values are: shims, path-symlink", + s + )), + } + } +} + +impl Default for VersionSwitchStrategy { + fn default() -> Self { + VersionSwitchStrategy::PathSymlink + } +} diff --git a/tests/e2e.rs b/tests/e2e.rs deleted file mode 100644 index e36dc9f..0000000 --- a/tests/e2e.rs +++ /dev/null @@ -1,4 +0,0 @@ -#[macro_use] -mod shellcode; - -mod feature_tests; diff --git a/tests/feature_tests/aliases.rs b/tests/feature_tests/aliases.rs deleted file mode 100644 index 355832d..0000000 --- a/tests/feature_tests/aliases.rs +++ /dev/null @@ -1,28 +0,0 @@ -use crate::shellcode::*; - -fn installed_versions() -> Call { - Call::new("fnm", vec!["ls"]) -} - -test_shell!(Bash, Zsh, Fish, PowerShell; { - EvalFnmEnv::default() - .then(Call::new("fnm", vec!["install", "6.11.3"])) - .then(Call::new("fnm", vec!["install", "8.11.3"])) - .then(Call::new("fnm", vec!["alias", "8.11", "oldie"])) - .then(Call::new("fnm", vec!["alias", "6", "older"])) - .then(Call::new("fnm", vec!["default", "older"])) - .then(OutputContains::new( - OutputContains::new(installed_versions(), "8.11.3"), - "oldie", - )) - .then(OutputContains::new( - OutputContains::new(OutputContains::new(installed_versions(), "6.11.3"), "older"), - "default", - )) - .then(Call::new("fnm", vec!["use", "older"])) - .then(test_node_version("v6.11.3")) - .then(Call::new("fnm", vec!["use", "oldie"])) - .then(test_node_version("v8.11.3")) - .then(Call::new("fnm", vec!["use", "default"])) - .then(test_node_version("v6.11.3")) -}); diff --git a/tests/feature_tests/current.rs b/tests/feature_tests/current.rs deleted file mode 100644 index 88085ad..0000000 --- a/tests/feature_tests/current.rs +++ /dev/null @@ -1,28 +0,0 @@ -test_shell!(Bash, Zsh, Fish, PowerShell, WinCmd; { - EvalFnmEnv::default() - .then(ExpectCommandOutput::new( - Call::new("fnm", vec!["current"]), - "none", - "currently activated version", - )) - .then(Call::new("fnm", vec!["install", "v8.11.3"])) - .then(Call::new("fnm", vec!["install", "v10.10.0"])) - .then(Call::new("fnm", vec!["use", "v8.11.3"])) - .then(ExpectCommandOutput::new( - Call::new("fnm", vec!["current"]), - "v8.11.3", - "currently activated version", - )) - .then(Call::new("fnm", vec!["use", "v10.10.0"])) - .then(ExpectCommandOutput::new( - Call::new("fnm", vec!["current"]), - "v10.10.0", - "currently activated version", - )) - .then(Call::new("fnm", vec!["use", "system"])) - .then(ExpectCommandOutput::new( - Call::new("fnm", vec!["current"]), - "system", - "currently activated version", - )) -}); diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Bash.snap deleted file mode 100644 index ccb9d3b..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Bash.snap +++ /dev/null @@ -1,17 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm alias system my_system -fnm ls | grep my_system -fnm alias system default -fnm alias my_system my_system2 -fnm ls | grep my_system2 -fnm use my_system | grep 'Bypassing fnm' -fnm unalias my_system -fnm use my_system 2>&1 | grep 'Requested version my_system is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Fish.snap deleted file mode 100644 index fe299c8..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Fish.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -fnm env | source -fnm alias system my_system -fnm ls | grep my_system -fnm alias system default -fnm alias my_system my_system2 -fnm ls | grep my_system2 -fnm use my_system | grep 'Bypassing fnm' -fnm unalias my_system -fnm use my_system 2>&1 | grep 'Requested version my_system is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__PowerShell.snap deleted file mode 100644 index 758c7cb..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__PowerShell.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm alias system my_system -$($__out__ = $(fnm ls | Select-String 'my_system'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -fnm alias system default -fnm alias my_system my_system2 -$($__out__ = $(fnm ls | Select-String 'my_system2'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -$($__out__ = $(fnm use my_system | Select-String 'Bypassing fnm'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -fnm unalias my_system -$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm use my_system 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Requested version my_system is not currently installed'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Zsh.snap deleted file mode 100644 index 2eeccfb..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__alias_system__Zsh.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -set -e -eval "$(fnm env)" -fnm alias system my_system -fnm ls | grep my_system -fnm alias system default -fnm alias my_system my_system2 -fnm ls | grep my_system2 -fnm use my_system | grep 'Bypassing fnm' -fnm unalias my_system -fnm use my_system 2>&1 | grep 'Requested version my_system is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Bash.snap deleted file mode 100644 index 29849d4..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Bash.snap +++ /dev/null @@ -1,32 +0,0 @@ ---- -source: tests/feature_tests/aliases.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install 6.11.3 -fnm install 8.11.3 -fnm alias 8.11 oldie -fnm alias 6 older -fnm default older -fnm ls | grep 8.11.3 | grep oldie -fnm ls | grep 6.11.3 | grep older | grep default -fnm use older -if [ "$(node -v)" != "v6.11.3" ]; then - echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" - exit 1 -fi - -fnm use oldie -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi - -fnm use default -if [ "$(node -v)" != "v6.11.3" ]; then - echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Fish.snap deleted file mode 100644 index 20d99a8..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Fish.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: tests/feature_tests/aliases.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install 6.11.3 -fnm install 8.11.3 -fnm alias 8.11 oldie -fnm alias 6 older -fnm default older -fnm ls | grep 8.11.3 | grep oldie -fnm ls | grep 6.11.3 | grep older | grep default -fnm use older -if test (node -v) != "v6.11.3" - echo 'Expected Node version to be "v6.11.3", Got: '(node -v) - exit 1 -end - -fnm use oldie -if test (node -v) != "v8.11.3" - echo 'Expected Node version to be "v8.11.3", Got: '(node -v) - exit 1 -end - -fnm use default -if test (node -v) != "v6.11.3" - echo 'Expected Node version to be "v6.11.3", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__aliases__PowerShell.snap deleted file mode 100644 index bedf44c..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__PowerShell.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: tests/feature_tests/aliases.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install 6.11.3 -fnm install 8.11.3 -fnm alias 8.11 oldie -fnm alias 6 older -fnm default older -$($__out__ = $($($__out__ = $(fnm ls | Select-String '8.11.3'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) | Select-String 'oldie'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -$($__out__ = $($($__out__ = $($($__out__ = $(fnm ls | Select-String '6.11.3'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) | Select-String 'older'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) | Select-String 'default'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -fnm use older -If ("$(node -v)" -ne "v6.11.3") { - Write-Output ('Expected Node version to be "v6.11.3", Got: ' + $(node -v)) - exit 1 -} - -fnm use oldie -If ("$(node -v)" -ne "v8.11.3") { - Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) - exit 1 -} - -fnm use default -If ("$(node -v)" -ne "v6.11.3") { - Write-Output ('Expected Node version to be "v6.11.3", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Zsh.snap deleted file mode 100644 index 41236c6..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__aliases__Zsh.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: tests/feature_tests/aliases.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install 6.11.3 -fnm install 8.11.3 -fnm alias 8.11 oldie -fnm alias 6 older -fnm default older -fnm ls | grep 8.11.3 | grep oldie -fnm ls | grep 6.11.3 | grep older | grep default -fnm use older -if [ "$(node -v)" != "v6.11.3" ]; then - echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" - exit 1 -fi - -fnm use oldie -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi - -fnm use default -if [ "$(node -v)" != "v6.11.3" ]; then - echo 'Expected Node version to be "v6.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic__Bash.snap deleted file mode 100644 index d2b5b87..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic__Bash.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install v8.11.3 -fnm use v8.11.3 -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic__Fish.snap deleted file mode 100644 index c8543d0..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic__Fish.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install v8.11.3 -fnm use v8.11.3 -if test (node -v) != "v8.11.3" - echo 'Expected Node version to be "v8.11.3", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic__PowerShell.snap deleted file mode 100644 index 4624f7d..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic__PowerShell.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install v8.11.3 -fnm use v8.11.3 -If ("$(node -v)" -ne "v8.11.3") { - Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic__WinCmd.snap deleted file mode 100644 index 6fa2aeb..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic__WinCmd.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i -fnm install v8.11.3 -fnm use v8.11.3 -node -v | findstr v8.11.3 -if %errorlevel% neq 0 ( - echo Node version does not match "v8.11.3" - exit 1 -) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic__Zsh.snap deleted file mode 100644 index 50a4478..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic__Zsh.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install v8.11.3 -fnm use v8.11.3 -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Bash.snap deleted file mode 100644 index 551aa6c..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Bash.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env --with-shims)" -fnm install v8.11.3 -fnm use v8.11.3 -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Fish.snap deleted file mode 100644 index 4ad9e4b..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Fish.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -fnm env --with-shims | source -fnm install v8.11.3 -fnm use v8.11.3 -if test (node -v) != "v8.11.3" - echo 'Expected Node version to be "v8.11.3", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__PowerShell.snap deleted file mode 100644 index 7d846ef..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__PowerShell.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -$ErrorActionPreference = "Stop" -fnm env --with-shims | Out-String | Invoke-Expression -fnm install v8.11.3 -fnm use v8.11.3 -If ("$(node -v)" -ne "v8.11.3") { - Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__WinCmd.snap deleted file mode 100644 index e6f667e..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__WinCmd.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -FOR /f "tokens=*" %i IN ('fnm env --with-shims') DO CALL %i -fnm install v8.11.3 -fnm use v8.11.3 -node -v | findstr v8.11.3 -if %errorlevel% neq 0 ( - echo Node version does not match "v8.11.3" - exit 1 -) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Zsh.snap deleted file mode 100644 index 28298e1..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__basic_with_shims__Zsh.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" - ---- -set -e -eval "$(fnm env --with-shims)" -fnm install v8.11.3 -fnm use v8.11.3 -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__current__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__current__Bash.snap deleted file mode 100644 index caa1076..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__current__Bash.snap +++ /dev/null @@ -1,32 +0,0 @@ ---- -source: tests/feature_tests/current.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -if [ "$(fnm current)" != "none" ]; then - echo 'Expected currently activated version to be "none", Got: '"$(fnm current)" - exit 1 -fi - -fnm install v8.11.3 -fnm install v10.10.0 -fnm use v8.11.3 -if [ "$(fnm current)" != "v8.11.3" ]; then - echo 'Expected currently activated version to be "v8.11.3", Got: '"$(fnm current)" - exit 1 -fi - -fnm use v10.10.0 -if [ "$(fnm current)" != "v10.10.0" ]; then - echo 'Expected currently activated version to be "v10.10.0", Got: '"$(fnm current)" - exit 1 -fi - -fnm use system -if [ "$(fnm current)" != "system" ]; then - echo 'Expected currently activated version to be "system", Got: '"$(fnm current)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__current__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__current__Fish.snap deleted file mode 100644 index 12e87bd..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__current__Fish.snap +++ /dev/null @@ -1,29 +0,0 @@ ---- -source: tests/feature_tests/current.rs -expression: "&source.trim()" ---- -fnm env | source -if test (fnm current) != "none" - echo 'Expected currently activated version to be "none", Got: '(fnm current) - exit 1 -end - -fnm install v8.11.3 -fnm install v10.10.0 -fnm use v8.11.3 -if test (fnm current) != "v8.11.3" - echo 'Expected currently activated version to be "v8.11.3", Got: '(fnm current) - exit 1 -end - -fnm use v10.10.0 -if test (fnm current) != "v10.10.0" - echo 'Expected currently activated version to be "v10.10.0", Got: '(fnm current) - exit 1 -end - -fnm use system -if test (fnm current) != "system" - echo 'Expected currently activated version to be "system", Got: '(fnm current) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__current__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__current__PowerShell.snap deleted file mode 100644 index d0968e5..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__current__PowerShell.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: tests/feature_tests/current.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -If ("$(fnm current)" -ne "none") { - Write-Output ('Expected currently activated version to be "none", Got: ' + $(fnm current)) - exit 1 -} - -fnm install v8.11.3 -fnm install v10.10.0 -fnm use v8.11.3 -If ("$(fnm current)" -ne "v8.11.3") { - Write-Output ('Expected currently activated version to be "v8.11.3", Got: ' + $(fnm current)) - exit 1 -} - -fnm use v10.10.0 -If ("$(fnm current)" -ne "v10.10.0") { - Write-Output ('Expected currently activated version to be "v10.10.0", Got: ' + $(fnm current)) - exit 1 -} - -fnm use system -If ("$(fnm current)" -ne "system") { - Write-Output ('Expected currently activated version to be "system", Got: ' + $(fnm current)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__current__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__current__WinCmd.snap deleted file mode 100644 index b8f32df..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__current__WinCmd.snap +++ /dev/null @@ -1,33 +0,0 @@ ---- -source: tests/feature_tests/current.rs -expression: "&source.trim()" ---- -FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i -fnm current | findstr none -if %errorlevel% neq 0 ( - echo currently activated version does not match "none" - exit 1 -) - -fnm install v8.11.3 -fnm install v10.10.0 -fnm use v8.11.3 -fnm current | findstr v8.11.3 -if %errorlevel% neq 0 ( - echo currently activated version does not match "v8.11.3" - exit 1 -) - -fnm use v10.10.0 -fnm current | findstr v10.10.0 -if %errorlevel% neq 0 ( - echo currently activated version does not match "v10.10.0" - exit 1 -) - -fnm use system -fnm current | findstr system -if %errorlevel% neq 0 ( - echo currently activated version does not match "system" - exit 1 -) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__current__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__current__Zsh.snap deleted file mode 100644 index b8771ce..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__current__Zsh.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: tests/feature_tests/current.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -if [ "$(fnm current)" != "none" ]; then - echo 'Expected currently activated version to be "none", Got: '"$(fnm current)" - exit 1 -fi - -fnm install v8.11.3 -fnm install v10.10.0 -fnm use v8.11.3 -if [ "$(fnm current)" != "v8.11.3" ]; then - echo 'Expected currently activated version to be "v8.11.3", Got: '"$(fnm current)" - exit 1 -fi - -fnm use v10.10.0 -if [ "$(fnm current)" != "v10.10.0" ]; then - echo 'Expected currently activated version to be "v10.10.0", Got: '"$(fnm current)" - exit 1 -fi - -fnm use system -if [ "$(fnm current)" != "system" ]; then - echo 'Expected currently activated version to be "system", Got: '"$(fnm current)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__exec__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__exec__Bash.snap deleted file mode 100644 index a148908..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__exec__Bash.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -echo v8.10.0 > .nvmrc -fnm install -fnm install v6.10.0 -fnm install v10.10.0 -if [ "$(fnm exec -- node -v)" != "v8.10.0" ]; then - echo 'Expected version file exec to be "v8.10.0", Got: '"$(fnm exec -- node -v)" - exit 1 -fi - -if [ "$(fnm exec --using=6 -- node -v)" != "v6.10.0" ]; then - echo 'Expected exec:6 node -v to be "v6.10.0", Got: '"$(fnm exec --using=6 -- node -v)" - exit 1 -fi - -if [ "$(fnm exec --using=10 -- node -v)" != "v10.10.0" ]; then - echo 'Expected exec:6 node -v to be "v10.10.0", Got: '"$(fnm exec --using=10 -- node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__exec__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__exec__Fish.snap deleted file mode 100644 index efb51fb..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__exec__Fish.snap +++ /dev/null @@ -1,23 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -echo v8.10.0 > .nvmrc -fnm install -fnm install v6.10.0 -fnm install v10.10.0 -if test (fnm exec -- node -v) != "v8.10.0" - echo 'Expected version file exec to be "v8.10.0", Got: '(fnm exec -- node -v) - exit 1 -end - -if test (fnm exec --using=6 -- node -v) != "v6.10.0" - echo 'Expected exec:6 node -v to be "v6.10.0", Got: '(fnm exec --using=6 -- node -v) - exit 1 -end - -if test (fnm exec --using=10 -- node -v) != "v10.10.0" - echo 'Expected exec:6 node -v to be "v10.10.0", Got: '(fnm exec --using=10 -- node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__exec__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__exec__PowerShell.snap deleted file mode 100644 index 6c00309..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__exec__PowerShell.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -echo 'v8.10.0' > '.nvmrc' -fnm install -fnm install v6.10.0 -fnm install v10.10.0 -If ("$(fnm exec -- node -v)" -ne "v8.10.0") { - Write-Output ('Expected version file exec to be "v8.10.0", Got: ' + $(fnm exec -- node -v)) - exit 1 -} - -If ("$(fnm exec --using=6 -- node -v)" -ne "v6.10.0") { - Write-Output ('Expected exec:6 node -v to be "v6.10.0", Got: ' + $(fnm exec --using=6 -- node -v)) - exit 1 -} - -If ("$(fnm exec --using=10 -- node -v)" -ne "v10.10.0") { - Write-Output ('Expected exec:6 node -v to be "v10.10.0", Got: ' + $(fnm exec --using=10 -- node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__exec__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__exec__WinCmd.snap deleted file mode 100644 index 26e2609..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__exec__WinCmd.snap +++ /dev/null @@ -1,26 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i -echo v8.10.0 > .nvmrc -fnm install -fnm install v6.10.0 -fnm install v10.10.0 -fnm exec -- node -v | findstr v8.10.0 -if %errorlevel% neq 0 ( - echo version file exec does not match "v8.10.0" - exit 1 -) - -fnm exec --using=6 -- node -v | findstr v6.10.0 -if %errorlevel% neq 0 ( - echo exec:6 node -v does not match "v6.10.0" - exit 1 -) - -fnm exec --using=10 -- node -v | findstr v10.10.0 -if %errorlevel% neq 0 ( - echo exec:6 node -v does not match "v10.10.0" - exit 1 -) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__exec__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__exec__Zsh.snap deleted file mode 100644 index 61e262d..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__exec__Zsh.snap +++ /dev/null @@ -1,24 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -echo v8.10.0 > .nvmrc -fnm install -fnm install v6.10.0 -fnm install v10.10.0 -if [ "$(fnm exec -- node -v)" != "v8.10.0" ]; then - echo 'Expected version file exec to be "v8.10.0", Got: '"$(fnm exec -- node -v)" - exit 1 -fi - -if [ "$(fnm exec --using=6 -- node -v)" != "v6.10.0" ]; then - echo 'Expected exec:6 node -v to be "v6.10.0", Got: '"$(fnm exec --using=6 -- node -v)" - exit 1 -fi - -if [ "$(fnm exec --using=10 -- node -v)" != "v10.10.0" ]; then - echo 'Expected exec:6 node -v to be "v10.10.0", Got: '"$(fnm exec --using=10 -- node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Bash.snap deleted file mode 100644 index 5faef8d..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Bash.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install v8.11.3 -fnm install v8.11.3 2>&1 | grep 'already installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Fish.snap deleted file mode 100644 index 180b0be..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Fish.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install v8.11.3 -fnm install v8.11.3 2>&1 | grep 'already installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__PowerShell.snap deleted file mode 100644 index 839a04c..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__PowerShell.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install v8.11.3 -$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm install v8.11.3 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'already installed'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Zsh.snap deleted file mode 100644 index a39f741..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__existing_installation__Zsh.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install v8.11.3 -fnm install v8.11.3 2>&1 | grep 'already installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Bash.snap deleted file mode 100644 index 1fc4ced..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Bash.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install --lts -fnm ls | grep lts-latest -fnm use 'lts/*' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Fish.snap deleted file mode 100644 index b5e9318..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Fish.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install --lts -fnm ls | grep lts-latest -fnm use 'lts/*' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__PowerShell.snap deleted file mode 100644 index a603c53..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__PowerShell.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install --lts -$($__out__ = $(fnm ls | Select-String 'lts-latest'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -fnm use 'lts/*' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Zsh.snap deleted file mode 100644 index fca57fd..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__latest_lts__Zsh.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install --lts -fnm ls | grep lts-latest -fnm use 'lts/*' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Bash.snap deleted file mode 100644 index 4f04428..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Bash.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm ls diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Fish.snap deleted file mode 100644 index f7cf730..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Fish.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm ls diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__PowerShell.snap deleted file mode 100644 index baac870..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__PowerShell.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm ls diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__WinCmd.snap deleted file mode 100644 index 8854265..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__WinCmd.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i -fnm ls diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Zsh.snap deleted file mode 100644 index 69486d7..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__list_local_with_nothing_installed__Zsh.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm ls diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Bash.snap deleted file mode 100644 index cb47e2d..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Bash.snap +++ /dev/null @@ -1,30 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm --log-level='error' env)" -if [ "$(fnm install v8.11.3 -echo empty)" != "empty" ]; then - echo 'Expected fnm install to be "empty", Got: '"$(fnm install v8.11.3 -echo empty)" - exit 1 -fi - -if [ "$(fnm use v8.11.3 -echo empty)" != "empty" ]; then - echo 'Expected fnm use to be "empty", Got: '"$(fnm use v8.11.3 -echo empty)" - exit 1 -fi - -if [ "$(fnm alias v8.11.3 something -echo empty)" != "empty" ]; then - echo 'Expected fnm alias to be "empty", Got: '"$(fnm alias v8.11.3 something -echo empty)" - exit 1 -fi - -fnm alias abcd efg 2>&1 | grep 'Can'\''t find requested version' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Fish.snap deleted file mode 100644 index bbf398d..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Fish.snap +++ /dev/null @@ -1,27 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm --log-level='error' env | source -if test (fnm install v8.11.3 -echo empty) != "empty" - echo 'Expected fnm install to be "empty", Got: '(fnm install v8.11.3 -echo empty) - exit 1 -end - -if test (fnm use v8.11.3 -echo empty) != "empty" - echo 'Expected fnm use to be "empty", Got: '(fnm use v8.11.3 -echo empty) - exit 1 -end - -if test (fnm alias v8.11.3 something -echo empty) != "empty" - echo 'Expected fnm alias to be "empty", Got: '(fnm alias v8.11.3 something -echo empty) - exit 1 -end - -fnm alias abcd efg 2>&1 | grep 'Can'\''t find requested version' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__PowerShell.snap deleted file mode 100644 index fbf7920..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__PowerShell.snap +++ /dev/null @@ -1,28 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm --log-level='error' env | Out-String | Invoke-Expression -If ("$(fnm install v8.11.3 -echo empty)" -ne "empty") { - Write-Output ('Expected fnm install to be "empty", Got: ' + $(fnm install v8.11.3 -echo empty)) - exit 1 -} - -If ("$(fnm use v8.11.3 -echo empty)" -ne "empty") { - Write-Output ('Expected fnm use to be "empty", Got: ' + $(fnm use v8.11.3 -echo empty)) - exit 1 -} - -If ("$(fnm alias v8.11.3 something -echo empty)" -ne "empty") { - Write-Output ('Expected fnm alias to be "empty", Got: ' + $(fnm alias v8.11.3 something -echo empty)) - exit 1 -} - -$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm alias abcd efg 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Can''t find requested version'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Zsh.snap deleted file mode 100644 index db8f422..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_error__Zsh.snap +++ /dev/null @@ -1,28 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm --log-level='error' env)" -if [ "$(fnm install v8.11.3 -echo empty)" != "empty" ]; then - echo 'Expected fnm install to be "empty", Got: '"$(fnm install v8.11.3 -echo empty)" - exit 1 -fi - -if [ "$(fnm use v8.11.3 -echo empty)" != "empty" ]; then - echo 'Expected fnm use to be "empty", Got: '"$(fnm use v8.11.3 -echo empty)" - exit 1 -fi - -if [ "$(fnm alias v8.11.3 something -echo empty)" != "empty" ]; then - echo 'Expected fnm alias to be "empty", Got: '"$(fnm alias v8.11.3 something -echo empty)" - exit 1 -fi - -fnm alias abcd efg 2>&1 | grep 'Can'\''t find requested version' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Bash.snap deleted file mode 100644 index 9dc8725..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Bash.snap +++ /dev/null @@ -1,22 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm --log-level='quiet' env)" -if [ "$(fnm install v8.11.3)" != "" ]; then - echo 'Expected fnm install to be "", Got: '"$(fnm install v8.11.3)" - exit 1 -fi - -if [ "$(fnm use v8.11.3)" != "" ]; then - echo 'Expected fnm use to be "", Got: '"$(fnm use v8.11.3)" - exit 1 -fi - -if [ "$(fnm alias v8.11.3 something)" != "" ]; then - echo 'Expected fnm alias to be "", Got: '"$(fnm alias v8.11.3 something)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Fish.snap deleted file mode 100644 index 06896ec..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Fish.snap +++ /dev/null @@ -1,19 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm --log-level='quiet' env | source -if test (fnm install v8.11.3) != "" - echo 'Expected fnm install to be "", Got: '(fnm install v8.11.3) - exit 1 -end - -if test (fnm use v8.11.3) != "" - echo 'Expected fnm use to be "", Got: '(fnm use v8.11.3) - exit 1 -end - -if test (fnm alias v8.11.3 something) != "" - echo 'Expected fnm alias to be "", Got: '(fnm alias v8.11.3 something) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__PowerShell.snap deleted file mode 100644 index d2e95d4..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__PowerShell.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm --log-level='quiet' env | Out-String | Invoke-Expression -If ("$(fnm install v8.11.3)" -ne "") { - Write-Output ('Expected fnm install to be "", Got: ' + $(fnm install v8.11.3)) - exit 1 -} - -If ("$(fnm use v8.11.3)" -ne "") { - Write-Output ('Expected fnm use to be "", Got: ' + $(fnm use v8.11.3)) - exit 1 -} - -If ("$(fnm alias v8.11.3 something)" -ne "") { - Write-Output ('Expected fnm alias to be "", Got: ' + $(fnm alias v8.11.3 something)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Zsh.snap deleted file mode 100644 index 530c483..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__log_level_quiet__Zsh.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm --log-level='quiet' env)" -if [ "$(fnm install v8.11.3)" != "" ]; then - echo 'Expected fnm install to be "", Got: '"$(fnm install v8.11.3)" - exit 1 -fi - -if [ "$(fnm use v8.11.3)" != "" ]; then - echo 'Expected fnm use to be "", Got: '"$(fnm use v8.11.3)" - exit 1 -fi - -if [ "$(fnm alias v8.11.3 something)" != "" ]; then - echo 'Expected fnm alias to be "", Got: '"$(fnm alias v8.11.3 something)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Bash.snap deleted file mode 100644 index 4ebfc98..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Bash.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -echo 11.10.0 > .nvmrc -echo 11.10.0 > .node-version -fnm install -fnm use -if [ "$(node -v)" != "v11.10.0" ]; then - echo 'Expected Node version to be "v11.10.0", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Fish.snap deleted file mode 100644 index 747f7ea..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Fish.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -echo 11.10.0 > .nvmrc -echo 11.10.0 > .node-version -fnm install -fnm use -if test (node -v) != "v11.10.0" - echo 'Expected Node version to be "v11.10.0", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__PowerShell.snap deleted file mode 100644 index 0b8ad53..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__PowerShell.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -echo '11.10.0' > '.nvmrc' -echo '11.10.0' > '.node-version' -fnm install -fnm use -If ("$(node -v)" -ne "v11.10.0") { - Write-Output ('Expected Node version to be "v11.10.0", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__WinCmd.snap deleted file mode 100644 index 497708d..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__WinCmd.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i -echo 11.10.0 > .nvmrc -echo 11.10.0 > .node-version -fnm install -fnm use -node -v | findstr v11.10.0 -if %errorlevel% neq 0 ( - echo Node version does not match "v11.10.0" - exit 1 -) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Zsh.snap deleted file mode 100644 index f584c91..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__matching_dotfiles__Zsh.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -echo 11.10.0 > .nvmrc -echo 11.10.0 > .node-version -fnm install -fnm use -if [ "$(node -v)" != "v11.10.0" ]; then - echo 'Expected Node version to be "v11.10.0", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Bash.snap deleted file mode 100644 index 7d23095..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Bash.snap +++ /dev/null @@ -1,25 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install v8.11.3 -fnm install v11.9.0 -fnm use v8.11.3 -echo 'set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm use 11 -if [ "$(node -v)" '\!'= "v11.9.0" ]; then - echo '\''Expected Node version to be "v11.9.0", Got: '\''"$(node -v)" - exit 1 -fi -' | bash -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Fish.snap deleted file mode 100644 index a68263f..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Fish.snap +++ /dev/null @@ -1,20 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install v8.11.3 -fnm install v11.9.0 -fnm use v8.11.3 -fish -c ' -fnm env | source -fnm use 11 -if test (node -v) '\!'= "v11.9.0" - echo '\''Expected Node version to be "v11.9.0", Got: '\''(node -v) - exit 1 -end -' -if test (node -v) != "v8.11.3" - echo 'Expected Node version to be "v8.11.3", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__multishell__PowerShell.snap deleted file mode 100644 index cdbe4bb..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__PowerShell.snap +++ /dev/null @@ -1,21 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install v8.11.3 -fnm install v11.9.0 -fnm use v8.11.3 -echo '$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm use 11 -If ("$(node -v)" -ne "v11.9.0") { - Write-Output (''Expected Node version to be "v11.9.0", Got: '' + $(node -v)) - exit 1 -} -' | powershell -NoProfile -If ("$(node -v)" -ne "v8.11.3") { - Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Zsh.snap deleted file mode 100644 index 9ad4501..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__multishell__Zsh.snap +++ /dev/null @@ -1,21 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install v8.11.3 -fnm install v11.9.0 -fnm use v8.11.3 -echo 'set -e -eval "$(fnm env)" -fnm use 11 -if [ "$(node -v)" '\!'= "v11.9.0" ]; then - echo '\''Expected Node version to be "v11.9.0", Got: '\''"$(node -v)" - exit 1 -fi -' | zsh -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Bash.snap deleted file mode 100644 index 13ae610..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Bash.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -echo v8.11.3 > .nvmrc -fnm install -fnm use -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Fish.snap deleted file mode 100644 index f28a420..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Fish.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -echo v8.11.3 > .nvmrc -fnm install -fnm use -if test (node -v) != "v8.11.3" - echo 'Expected Node version to be "v8.11.3", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__PowerShell.snap deleted file mode 100644 index dc23465..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__PowerShell.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -echo 'v8.11.3' > '.nvmrc' -fnm install -fnm use -If ("$(node -v)" -ne "v8.11.3") { - Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__WinCmd.snap deleted file mode 100644 index 7598be6..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__WinCmd.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i -echo v8.11.3 > .nvmrc -fnm install -fnm use -node -v | findstr v8.11.3 -if %errorlevel% neq 0 ( - echo Node version does not match "v8.11.3" - exit 1 -) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Zsh.snap deleted file mode 100644 index 9c635cc..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__nvmrc__Zsh.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -echo v8.11.3 > .nvmrc -fnm install -fnm use -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Bash.snap deleted file mode 100644 index 620febd..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Bash.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install 6 -fnm use 6 -if [ "$(node -v)" != "v6.17.1" ]; then - echo 'Expected Node version to be "v6.17.1", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Fish.snap deleted file mode 100644 index 92cd649..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Fish.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install 6 -fnm use 6 -if test (node -v) != "v6.17.1" - echo 'Expected Node version to be "v6.17.1", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__PowerShell.snap deleted file mode 100644 index 79fef08..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__PowerShell.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install 6 -fnm use 6 -If ("$(node -v)" -ne "v6.17.1") { - Write-Output ('Expected Node version to be "v6.17.1", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__WinCmd.snap b/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__WinCmd.snap deleted file mode 100644 index 41b8d78..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__WinCmd.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -FOR /f "tokens=*" %i IN ('fnm env') DO CALL %i -fnm install 6 -fnm use 6 -node -v | findstr v6.17.1 -if %errorlevel% neq 0 ( - echo Node version does not match "v6.17.1" - exit 1 -) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Zsh.snap deleted file mode 100644 index 3d63b12..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__partial_semver__Zsh.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install 6 -fnm use 6 -if [ "$(node -v)" != "v6.17.1" ]; then - echo 'Expected Node version to be "v6.17.1", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Bash.snap deleted file mode 100644 index 5ce4a34..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Bash.snap +++ /dev/null @@ -1,15 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install 10 -fnm use 10 -fnm use system -if [ "$(node -v)" != "custom node" ]; then - echo 'Expected Node version to be "custom node", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Fish.snap deleted file mode 100644 index efc64b3..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Fish.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install 10 -fnm use 10 -fnm use system -if test (node -v) != "custom node" - echo 'Expected Node version to be "custom node", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__system_node__PowerShell.snap deleted file mode 100644 index f4b220e..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__PowerShell.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install 10 -fnm use 10 -fnm use system -If ("$(node -v)" -ne "custom node") { - Write-Output ('Expected Node version to be "custom node", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Zsh.snap deleted file mode 100644 index 64eaa3c..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__system_node__Zsh.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install 10 -fnm use 10 -fnm use system -if [ "$(node -v)" != "custom node" ]; then - echo 'Expected Node version to be "custom node", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Bash.snap deleted file mode 100644 index 6a7724a..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Bash.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install 11.10.0 -fnm install 8.11.3 -fnm alias 8.11.3 version8 -fnm ls | grep version8 -fnm unalias version8 -fnm use version8 2>&1 | grep 'Requested version version8 is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Fish.snap deleted file mode 100644 index d9e72f1..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Fish.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install 11.10.0 -fnm install 8.11.3 -fnm alias 8.11.3 version8 -fnm ls | grep version8 -fnm unalias version8 -fnm use version8 2>&1 | grep 'Requested version version8 is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__PowerShell.snap deleted file mode 100644 index d2e2788..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__PowerShell.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install 11.10.0 -fnm install 8.11.3 -fnm alias 8.11.3 version8 -$($__out__ = $(fnm ls | Select-String 'version8'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -fnm unalias version8 -$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm use version8 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Requested version version8 is not currently installed'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Zsh.snap deleted file mode 100644 index 6dab76a..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias__Zsh.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install 11.10.0 -fnm install 8.11.3 -fnm alias 8.11.3 version8 -fnm ls | grep version8 -fnm unalias version8 -fnm use version8 2>&1 | grep 'Requested version version8 is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Bash.snap deleted file mode 100644 index 3e7a132..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Bash.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm --log-level='error' env)" -fnm unalias lts 2>&1 | grep 'Requested alias lts not found' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Fish.snap deleted file mode 100644 index 5eb06ec..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Fish.snap +++ /dev/null @@ -1,6 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm --log-level='error' env | source -fnm unalias lts 2>&1 | grep 'Requested alias lts not found' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__PowerShell.snap deleted file mode 100644 index 4141c73..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__PowerShell.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm --log-level='error' env | Out-String | Invoke-Expression -$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm unalias lts 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Requested alias lts not found'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Zsh.snap deleted file mode 100644 index 53576ba..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__unalias_error__Zsh.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm --log-level='error' env)" -fnm unalias lts 2>&1 | grep 'Requested alias lts not found' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Bash.snap deleted file mode 100644 index b7211fc..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Bash.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: tests/feature_tests/uninstall.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -fnm install 12.0.0 -fnm alias 12.0.0 hello -fnm ls | grep v12.0.0 | grep hello -fnm uninstall hello -if [ "$(fnm ls)" != "* system" ]; then - echo 'Expected fnm ls to be "* system", Got: '"$(fnm ls)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Fish.snap deleted file mode 100644 index 832672b..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Fish.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/uninstall.rs -expression: "&source.trim()" ---- -fnm env | source -fnm install 12.0.0 -fnm alias 12.0.0 hello -fnm ls | grep v12.0.0 | grep hello -fnm uninstall hello -if test (fnm ls) != "* system" - echo 'Expected fnm ls to be "* system", Got: '(fnm ls) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__PowerShell.snap deleted file mode 100644 index 4b72e44..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__PowerShell.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/uninstall.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -fnm install 12.0.0 -fnm alias 12.0.0 hello -$($__out__ = $($($__out__ = $(fnm ls | Select-String 'v12.0.0'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) | Select-String 'hello'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) -fnm uninstall hello -If ("$(fnm ls)" -ne "* system") { - Write-Output ('Expected fnm ls to be "* system", Got: ' + $(fnm ls)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Zsh.snap deleted file mode 100644 index a4939b1..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__uninstall__Zsh.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/uninstall.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -fnm install 12.0.0 -fnm alias 12.0.0 hello -fnm ls | grep v12.0.0 | grep hello -fnm uninstall hello -if [ "$(fnm ls)" != "* system" ]; then - echo 'Expected fnm ls to be "* system", Got: '"$(fnm ls)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Bash.snap deleted file mode 100644 index 31cf2ef..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Bash.snap +++ /dev/null @@ -1,11 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -echo 'lts/*' > .node-version -fnm use --install-if-missing -fnm ls | grep lts-latest diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Fish.snap deleted file mode 100644 index e088983..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Fish.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -echo 'lts/*' > .node-version -fnm use --install-if-missing -fnm ls | grep lts-latest diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__PowerShell.snap deleted file mode 100644 index 85d36b8..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__PowerShell.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -echo 'lts/*' > '.node-version' -fnm use --install-if-missing -$($__out__ = $(fnm ls | Select-String 'lts-latest'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Zsh.snap deleted file mode 100644 index 4b49db9..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_install_if_missing__Zsh.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -echo 'lts/*' > .node-version -fnm use --install-if-missing -fnm ls | grep lts-latest diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Bash.snap deleted file mode 100644 index 517e2b8..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Bash.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm --log-level='error' env)" -echo 'lts/*' > .node-version -fnm use 2>&1 | grep 'Requested version lts-latest is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Fish.snap deleted file mode 100644 index f5c6918..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Fish.snap +++ /dev/null @@ -1,7 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm --log-level='error' env | source -echo 'lts/*' > .node-version -fnm use 2>&1 | grep 'Requested version lts-latest is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__PowerShell.snap deleted file mode 100644 index ffebbc6..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__PowerShell.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm --log-level='error' env | Out-String | Invoke-Expression -echo 'lts/*' > '.node-version' -$($__out__ = $($($_tmp_err_action = $ErrorActionPreference;$ErrorActionPreference = "Continue";fnm use 2>&1;$ErrorActionPreference = $_tmp_err_action) | Select-String 'Requested version lts-latest is not currently installed'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Zsh.snap deleted file mode 100644 index b34e2bf..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_alias_not_installed__Zsh.snap +++ /dev/null @@ -1,8 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm --log-level='error' env)" -echo 'lts/*' > .node-version -fnm use 2>&1 | grep 'Requested version lts-latest is not currently installed' diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Bash.snap deleted file mode 100644 index fbcdf6c..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Bash.snap +++ /dev/null @@ -1,12 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env)" -echo lts/dubnium > .nvmrc -fnm install -fnm use -fnm ls | grep lts-dubnium diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Fish.snap deleted file mode 100644 index 3be4a41..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Fish.snap +++ /dev/null @@ -1,9 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env | source -echo lts/dubnium > .nvmrc -fnm install -fnm use -fnm ls | grep lts-dubnium diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__PowerShell.snap deleted file mode 100644 index 766c6a0..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__PowerShell.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env | Out-String | Invoke-Expression -echo 'lts/dubnium' > '.nvmrc' -fnm install -fnm use -$($__out__ = $(fnm ls | Select-String 'lts-dubnium'); echo $__out__; if ($__out__ -eq $null){ exit 1 } else { $__out__ }) diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Zsh.snap deleted file mode 100644 index c222b9f..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_nvmrc_lts__Zsh.snap +++ /dev/null @@ -1,10 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env)" -echo lts/dubnium > .nvmrc -fnm install -fnm use -fnm ls | grep lts-dubnium diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Bash.snap deleted file mode 100644 index be3337a..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Bash.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env --use-on-cd)" -mkdir inner_path -echo v8.11.3 > inner_path/.node-version -fnm install v8.11.3 -cd inner_path -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Fish.snap deleted file mode 100644 index 0e0746b..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Fish.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env --use-on-cd | source -mkdir inner_path -echo v8.11.3 > inner_path/.node-version -fnm install v8.11.3 -cd inner_path -if test (node -v) != "v8.11.3" - echo 'Expected Node version to be "v8.11.3", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__PowerShell.snap deleted file mode 100644 index 5de718a..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__PowerShell.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env --use-on-cd | Out-String | Invoke-Expression -mkdir inner_path -echo 'v8.11.3' > 'inner_path/.node-version' -fnm install v8.11.3 -cd inner_path -If ("$(node -v)" -ne "v8.11.3") { - Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Zsh.snap deleted file mode 100644 index 09628ff..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_dot_node_version__Zsh.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env --use-on-cd)" -mkdir inner_path -echo v8.11.3 > inner_path/.node-version -fnm install v8.11.3 -cd inner_path -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Bash.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Bash.snap deleted file mode 100644 index dbfe7c0..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Bash.snap +++ /dev/null @@ -1,16 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -shopt -s expand_aliases - -eval "$(fnm env --use-on-cd)" -mkdir inner_path -echo v8.11.3 > inner_path/.nvmrc -fnm install v8.11.3 -cd inner_path -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Fish.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Fish.snap deleted file mode 100644 index c7aa857..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Fish.snap +++ /dev/null @@ -1,13 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -fnm env --use-on-cd | source -mkdir inner_path -echo v8.11.3 > inner_path/.nvmrc -fnm install v8.11.3 -cd inner_path -if test (node -v) != "v8.11.3" - echo 'Expected Node version to be "v8.11.3", Got: '(node -v) - exit 1 -end diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__PowerShell.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__PowerShell.snap deleted file mode 100644 index f9ceb49..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__PowerShell.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -$ErrorActionPreference = "Stop" -fnm env --use-on-cd | Out-String | Invoke-Expression -mkdir inner_path -echo 'v8.11.3' > 'inner_path/.nvmrc' -fnm install v8.11.3 -cd inner_path -If ("$(node -v)" -ne "v8.11.3") { - Write-Output ('Expected Node version to be "v8.11.3", Got: ' + $(node -v)) - exit 1 -} diff --git a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Zsh.snap b/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Zsh.snap deleted file mode 100644 index e07e748..0000000 --- a/tests/feature_tests/snapshots/e2e__feature_tests__use_on_cd_nvmrc__Zsh.snap +++ /dev/null @@ -1,14 +0,0 @@ ---- -source: tests/feature_tests/mod.rs -expression: "&source.trim()" ---- -set -e -eval "$(fnm env --use-on-cd)" -mkdir inner_path -echo v8.11.3 > inner_path/.nvmrc -fnm install v8.11.3 -cd inner_path -if [ "$(node -v)" != "v8.11.3" ]; then - echo 'Expected Node version to be "v8.11.3", Got: '"$(node -v)" - exit 1 -fi diff --git a/tests/feature_tests/uninstall.rs b/tests/feature_tests/uninstall.rs deleted file mode 100644 index f263365..0000000 --- a/tests/feature_tests/uninstall.rs +++ /dev/null @@ -1,14 +0,0 @@ -#[allow(unused_imports)] -use crate::shellcode::*; - -test_shell!(Bash, Zsh, Fish, PowerShell; { - EvalFnmEnv::default() - .then(Call::new("fnm", vec!["install", "12.0.0"])) - .then(Call::new("fnm", vec!["alias", "12.0.0", "hello"])) - .then(OutputContains::new( - OutputContains::new(Call::new("fnm", vec!["ls"]), "v12.0.0"), - "hello", - )) - .then(Call::new("fnm", vec!["uninstall", "hello"])) - .then(ExpectCommandOutput::new(Call::new("fnm", vec!["ls"]), "* system", "fnm ls")) -}); diff --git a/tests/shellcode/call.rs b/tests/shellcode/call.rs deleted file mode 100644 index 2f45b79..0000000 --- a/tests/shellcode/call.rs +++ /dev/null @@ -1,25 +0,0 @@ -use super::expression::Expression; -use super::shell::Shell; -use std::fmt::Write; - -#[derive(Debug)] -pub(crate) struct Call { - binary: &'static str, - args: Vec<&'static str>, -} - -impl Call { - pub(crate) fn new(binary: &'static str, args: Vec<&'static str>) -> Self { - Self { binary, args } - } -} - -impl Expression for Call { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - write!(writer, "{}", self.binary)?; - for arg in &self.args { - write!(writer, " {}", arg)?; - } - Ok(()) - } -} diff --git a/tests/shellcode/die_on_errors.rs b/tests/shellcode/die_on_errors.rs deleted file mode 100644 index 31a2ffd..0000000 --- a/tests/shellcode/die_on_errors.rs +++ /dev/null @@ -1,43 +0,0 @@ -use super::expression::Expression; -use super::shell::{Bash, Fish, PowerShell, WinCmd, Zsh}; -use indoc::writedoc; -use std::fmt::Write; - -#[derive(Debug)] -pub(crate) struct DieOnErrors; - -impl Expression for DieOnErrors { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - writedoc!( - writer, - r#" - set -e - shopt -s expand_aliases - "# - ) - } -} - -impl Expression for DieOnErrors { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - write!(writer, "set -e") - } -} - -impl Expression for DieOnErrors { - fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { - Ok(()) - } -} - -impl Expression for DieOnErrors { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - write!(writer, r#"$ErrorActionPreference = "Stop""#) - } -} - -impl Expression for DieOnErrors { - fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { - Ok(()) - } -} diff --git a/tests/shellcode/expect_command_output.rs b/tests/shellcode/expect_command_output.rs deleted file mode 100644 index 329c796..0000000 --- a/tests/shellcode/expect_command_output.rs +++ /dev/null @@ -1,128 +0,0 @@ -use super::expression::Expression; -use super::shell::{Bash, Fish, PowerShell, Shell, WinCmd, Zsh}; -use indoc::writedoc; -use std::fmt::Write; - -#[derive(Debug)] -pub(crate) struct ExpectCommandOutput> { - _shell: std::marker::PhantomData, - command: Command, - expected_output: &'static str, - message: &'static str, -} - -impl> ExpectCommandOutput { - pub(crate) fn new( - command: Command, - expected_output: &'static str, - message: &'static str, - ) -> Self { - Self { - _shell: std::marker::PhantomData, - command, - expected_output, - message, - } - } -} - -impl> Expression for ExpectCommandOutput { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut command = String::new(); - self.command.write_shell(&mut command)?; - - writedoc!( - writer, - r#" - if [ "$({command})" != "{expected_output}" ]; then - echo 'Expected {message} to be {expected_output:?}, Got: '"$({command})" - exit 1 - fi - "#, - command = command, - message = self.message, - expected_output = self.expected_output, - ) - } -} - -impl> Expression for ExpectCommandOutput { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut command = String::new(); - self.command.write_shell(&mut command)?; - - writedoc!( - writer, - r#" - if [ "$({command})" != "{expected_output}" ]; then - echo 'Expected {message} to be {expected_output:?}, Got: '"$({command})" - exit 1 - fi - "#, - command = command, - message = self.message, - expected_output = self.expected_output, - ) - } -} - -impl> Expression for ExpectCommandOutput { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut command = String::new(); - self.command.write_shell(&mut command)?; - - writedoc!( - writer, - r#" - if test ({command}) != "{expected_output}" - echo 'Expected {message} to be {expected_output:?}, Got: '({command}) - exit 1 - end - "#, - command = command, - expected_output = self.expected_output, - message = self.message, - ) - } -} - -impl> Expression for ExpectCommandOutput { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut command = String::new(); - self.command.write_shell(&mut command)?; - - writedoc!( - writer, - r#" - If ("$({command})" -ne "{expected_output}") {{ - Write-Output ('Expected {message} to be {expected_output:?}, Got: ' + $({command})) - exit 1 - }} - "#, - command = command, - expected_output = self.expected_output, - message = self.message, - ) - } -} - -impl> Expression for ExpectCommandOutput { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut command = String::new(); - self.command.write_shell(&mut command)?; - - writedoc!( - writer, - r#" - {command} | findstr {expected_output} - if %errorlevel% neq 0 ( - echo {message} does not match {expected_output:?} - exit 1 - ) - "#, - command = command, - expected_output = WinCmd::shell_escape(self.expected_output), - message = self.message, - ) - } -} diff --git a/tests/shellcode/expression.rs b/tests/shellcode/expression.rs deleted file mode 100644 index a00e531..0000000 --- a/tests/shellcode/expression.rs +++ /dev/null @@ -1,21 +0,0 @@ -use super::line_separated_expressions::LineSeparatedExpressions; -use super::shell::Shell; -use std::fmt::{Debug, Write}; - -pub(crate) trait Expression: Debug + Sized { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result; - - fn then>(self, other: B) -> LineSeparatedExpressions { - LineSeparatedExpressions { - _shell: std::marker::PhantomData, - a: self, - b: other, - } - } -} - -impl Expression for () { - fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { - Ok(()) - } -} diff --git a/tests/shellcode/get_stderr.rs b/tests/shellcode/get_stderr.rs deleted file mode 100644 index 328e9ba..0000000 --- a/tests/shellcode/get_stderr.rs +++ /dev/null @@ -1,25 +0,0 @@ -use super::*; -use std::marker::PhantomData; - -#[derive(Debug)] -pub(crate) struct GetStderr> { - _s: PhantomData, - expr: E, -} - -impl> GetStderr { - pub(crate) fn new(expr: E) -> Self { - Self { - _s: PhantomData, - expr, - } - } -} - -impl> Expression for GetStderr { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - self.expr.write_shell(writer)?; - write!(writer, " 2>&1")?; - Ok(()) - } -} diff --git a/tests/shellcode/ignore_errors.rs b/tests/shellcode/ignore_errors.rs deleted file mode 100644 index 4d52b71..0000000 --- a/tests/shellcode/ignore_errors.rs +++ /dev/null @@ -1,49 +0,0 @@ -use super::*; -use std::marker::PhantomData; - -#[derive(Debug)] -pub(crate) struct IgnoreErrors> { - _s: PhantomData, - expr: E, -} - -impl> IgnoreErrors { - pub(crate) fn new(expr: E) -> Self { - Self { - _s: PhantomData, - expr, - } - } -} - -impl> Expression for IgnoreErrors { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - self.expr.write_shell(writer)?; - Ok(()) - } -} - -impl> Expression for IgnoreErrors { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - self.expr.write_shell(writer)?; - Ok(()) - } -} - -impl> Expression for IgnoreErrors { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - self.expr.write_shell(writer)?; - Ok(()) - } -} - -impl> Expression for IgnoreErrors { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - write!(writer, r#"$($_tmp_err_action = $ErrorActionPreference;"#)?; - write!(writer, r#"$ErrorActionPreference = "Continue";"#)?; - self.expr.write_shell(writer)?; - write!(writer, ";")?; - write!(writer, r#"$ErrorActionPreference = $_tmp_err_action)"#)?; - Ok(()) - } -} diff --git a/tests/shellcode/line_separated_expressions.rs b/tests/shellcode/line_separated_expressions.rs deleted file mode 100644 index b944cfd..0000000 --- a/tests/shellcode/line_separated_expressions.rs +++ /dev/null @@ -1,62 +0,0 @@ -use super::expression::Expression; -use super::shell::Shell; -use std::fmt::Write; -use std::marker::PhantomData; - -#[derive(Debug)] -pub(crate) struct LineSeparatedExpressions, B: Expression> { - pub(crate) _shell: std::marker::PhantomData, - pub(crate) a: A, - pub(crate) b: B, -} - -impl, B: Expression> LineSeparatedExpressions { - pub fn then>( - self, - c: C, - ) -> LineSeparatedExpressions, C> { - LineSeparatedExpressions { - _shell: PhantomData, - a: self, - b: c, - } - } -} - -impl> LineSeparatedExpressions { - pub(crate) fn new(b: B) -> Self { - Self { - _shell: std::marker::PhantomData, - a: (), - b, - } - } -} - -impl, B: Expression> Expression - for LineSeparatedExpressions -{ - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - self.a.write_shell(writer)?; - writeln!(writer)?; - self.b.write_shell(writer) - } -} - -mod tests { - use super::super::raw::Raw; - use super::super::shell::Zsh; - use super::*; - use pretty_assertions::assert_eq; - - #[test] - fn test_line_separated_expression() { - let mut s = String::new(); - LineSeparatedExpressions::::new(Raw("Hello".into())) - .then(Raw("World".into())) - .then(Raw("Other".into())) - .write_shell(&mut s) - .unwrap(); - assert_eq!(s.trim(), "Hello\nWorld\nOther"); - } -} diff --git a/tests/shellcode/mod.rs b/tests/shellcode/mod.rs deleted file mode 100644 index c6ab55f..0000000 --- a/tests/shellcode/mod.rs +++ /dev/null @@ -1,113 +0,0 @@ -mod call; -mod die_on_errors; -mod eval_fnm_env; -mod expect_command_output; -mod expression; -mod get_stderr; -mod ignore_errors; -mod line_separated_expressions; -mod nothing; -mod output_contains; -mod raw; -mod shell; -mod sub_shell; -mod test_node_version; -mod write_file; - -#[allow(unused)] -pub use call::*; -#[allow(unused)] -pub use die_on_errors::*; -#[allow(unused)] -pub use eval_fnm_env::*; -#[allow(unused)] -pub use expect_command_output::*; -#[allow(unused)] -pub use expression::*; -#[allow(unused)] -pub use get_stderr::*; -#[allow(unused)] -pub use ignore_errors::*; -#[allow(unused)] -#[allow(unused)] -pub use line_separated_expressions::*; -#[allow(unused)] -pub use nothing::*; -#[allow(unused)] -pub use output_contains::*; -#[allow(unused)] -pub use raw::*; -#[allow(unused)] -pub use shell::*; -#[allow(unused)] -pub use sub_shell::*; -#[allow(unused)] -pub use test_node_version::*; -#[allow(unused)] -pub use write_file::*; - -use std::path::Path; - -pub(crate) fn run_test_file(dir: &Path, shell: &impl Shell, code: &str) { - let fnm_dir = tempfile::tempdir().unwrap(); - let target_dir = std::path::PathBuf::from(env!("CARGO_BIN_EXE_fnm")) - .parent() - .unwrap() - .to_path_buf(); - let path_str = { - let path_env = std::env::var("PATH").unwrap(); - let mut path_split: Vec<_> = std::env::split_paths(&path_env).collect(); - path_split.insert(0, target_dir); - path_split.insert(0, dir.join("bin")); // for custom binaries - std::env::join_paths(path_split).unwrap() - }; - duct::cmd(shell.binary_name(), shell.launch_args()) - .env("PATH", path_str) - .env("FNM_DIR", fnm_dir.path()) - .env("HOME", tempfile::tempdir().unwrap().path()) - .env_remove("FNM_MULTISHELL_PATH") - .dir(dir) - .stdin_bytes(code) - .run() - .unwrap(); -} - -#[macro_export] -macro_rules! test_shell { - ($($shell:ident),+; $block:block) => { - test_shell!($($shell),+; |_path| $block); - }; - ($($shell:ident),+; $f:expr) => { - $( - #[test] - #[serial_test::serial] - #[allow(non_snake_case, clippy::redundant_closure_call)] - fn $shell() { - use super::*; - #[allow(unused)] - use pretty_assertions::assert_eq; - let current_dir = tempfile::tempdir().expect("Can't create a temp dir"); - let shell = $crate::shellcode::$shell; - - let mut source = String::new(); - empty_shell_script(&shell) - .then($crate::shellcode::DieOnErrors) - .then(($f)(current_dir.path())) - .write_shell(&mut source) - .expect("Can't create shell script"); - - insta::assert_snapshot!(&source.trim()); - - if !shell.currently_supported() { - return; - } - - $crate::shellcode::run_test_file( - current_dir.path(), - &shell, - &source.trim() - ); - } - )+ - }; -} diff --git a/tests/shellcode/nothing.rs b/tests/shellcode/nothing.rs deleted file mode 100644 index ade91c5..0000000 --- a/tests/shellcode/nothing.rs +++ /dev/null @@ -1,19 +0,0 @@ -use super::expression::Expression; -use super::shell::Shell; -use std::fmt::Write; -use std::marker::PhantomData; - -#[derive(Debug)] -pub(crate) struct Nothing { - shell: PhantomData, -} - -pub(crate) fn empty_shell_script(_s: &S) -> Nothing { - Nothing { shell: PhantomData } -} - -impl Expression for Nothing { - fn write_shell(&self, _writer: &mut impl Write) -> std::fmt::Result { - Ok(()) - } -} diff --git a/tests/shellcode/output_contains.rs b/tests/shellcode/output_contains.rs deleted file mode 100644 index fc1395e..0000000 --- a/tests/shellcode/output_contains.rs +++ /dev/null @@ -1,65 +0,0 @@ -use super::*; -use std::marker::PhantomData; - -#[derive(Debug)] -pub(crate) struct OutputContains> { - _s: PhantomData, - output_of: Output, - contains: &'static str, -} - -impl> OutputContains { - pub(crate) fn new(output_of: Output, contains: &'static str) -> Self { - Self { - _s: PhantomData, - output_of, - contains, - } - } -} - -impl> Expression for OutputContains { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - self.output_of.write_shell(writer)?; - write!(writer, " | grep {}", Zsh::shell_escape(self.contains)) - } -} - -impl> Expression for OutputContains { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - self.output_of.write_shell(writer)?; - write!(writer, " | grep {}", Bash::shell_escape(self.contains)) - } -} - -impl> Expression for OutputContains { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - self.output_of.write_shell(writer)?; - write!(writer, " | grep {}", Fish::shell_escape(self.contains)) - } -} - -impl> Expression for OutputContains { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - // $($__out__ = (fnm ls | findstr 6.11.3); if ($LASTEXITCODE -ne 0) { "WELP" } else { $__out__ }) - write!(writer, "$(")?; - { - write!(writer, "$__out__ = $(")?; - { - self.output_of.write_shell(writer)?; - write!( - writer, - " | Select-String {}", - PowerShell::shell_escape(self.contains) - )?; - } - write!(writer, "); ")?; - write!(writer, "echo $__out__; ")?; - write!(writer, "if ($__out__ -eq $null)")?; - write!(writer, "{{ exit 1 }} ")?; - write!(writer, "else {{ $__out__ }}")?; - } - write!(writer, ")")?; - Ok(()) - } -} diff --git a/tests/shellcode/raw.rs b/tests/shellcode/raw.rs deleted file mode 100644 index 63acac4..0000000 --- a/tests/shellcode/raw.rs +++ /dev/null @@ -1,13 +0,0 @@ -use super::expression::Expression; -use super::shell::Shell; -use std::fmt::Write; - -/// For debugging purposes -#[derive(Debug)] -pub(crate) struct Raw(pub String); - -impl Expression for Raw { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - write!(writer, "{}", self.0) - } -} diff --git a/tests/shellcode/shell.rs b/tests/shellcode/shell.rs deleted file mode 100644 index 3bc45f0..0000000 --- a/tests/shellcode/shell.rs +++ /dev/null @@ -1,112 +0,0 @@ -use std::borrow::Cow; -use std::fmt::Debug; - -pub(crate) trait Shell: Debug { - fn currently_supported(&self) -> bool; - fn name(&self) -> &'static str; - fn binary_name(&self) -> &'static str; - fn shell_escape(str: &str) -> Cow; - fn launch_args(&self) -> &'static [&'static str] { - &[] - } -} - -#[derive(Debug)] -pub(crate) struct Fish; -impl Shell for Fish { - fn currently_supported(&self) -> bool { - cfg!(not(windows)) - } - fn name(&self) -> &'static str { - "fish" - } - fn binary_name(&self) -> &'static str { - "fish" - } - fn shell_escape(str: &str) -> Cow { - shell_escape::unix::escape(Cow::from(str)) - } -} - -#[derive(Debug)] -pub(crate) struct Bash; -impl Shell for Bash { - fn currently_supported(&self) -> bool { - true - } - fn name(&self) -> &'static str { - "bash" - } - fn binary_name(&self) -> &'static str { - "bash" - } - fn shell_escape(str: &str) -> Cow { - shell_escape::unix::escape(Cow::from(str)) - } -} - -#[derive(Debug)] -pub(crate) struct Zsh; -impl Shell for Zsh { - fn currently_supported(&self) -> bool { - cfg!(not(windows)) - } - fn name(&self) -> &'static str { - "zsh" - } - fn binary_name(&self) -> &'static str { - "zsh" - } - fn shell_escape(str: &str) -> Cow { - shell_escape::unix::escape(Cow::from(str)) - } -} - -#[derive(Debug)] -pub(crate) struct WinCmd; -impl Shell for WinCmd { - fn currently_supported(&self) -> bool { - cfg!(windows) - } - fn name(&self) -> &'static str { - "win_cmd" - } - fn binary_name(&self) -> &'static str { - "cmd" - } - fn shell_escape(str: &str) -> Cow { - Cow::from( - str.replace('\r', "") - .replace('\n', "^\n\n") - .replace('%', "%%") - .replace('|', "^|") - .replace('(', "^(") - .replace(')', "^)"), - ) - } -} - -#[derive(Debug)] -pub(crate) struct PowerShell; -impl Shell for PowerShell { - fn currently_supported(&self) -> bool { - true - } - fn name(&self) -> &'static str { - "powershell" - } - fn binary_name(&self) -> &'static str { - if cfg!(windows) { - "powershell" - } else { - "pwsh" - } - } - fn shell_escape(str: &str) -> Cow { - let new_str = format!("'{}'", str.replace('\'', "''")); - Cow::from(new_str) - } - fn launch_args(&self) -> &'static [&'static str] { - &["-NoProfile"] - } -} diff --git a/tests/shellcode/sub_shell.rs b/tests/shellcode/sub_shell.rs deleted file mode 100644 index 79fd353..0000000 --- a/tests/shellcode/sub_shell.rs +++ /dev/null @@ -1,55 +0,0 @@ -use super::expression::Expression; -use super::shell::*; -use std::fmt::Write; -use std::marker::PhantomData; - -#[derive(Debug)] -pub(crate) struct SubShell> { - _s: PhantomData, - expression: Exp, -} - -impl> SubShell { - pub(crate) fn new(expression: Exp) -> Self { - Self { - _s: PhantomData, - expression, - } - } -} - -impl> Expression for SubShell { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut s = String::new(); - self.expression.write_shell(&mut s)?; - write!(writer, r#"echo {} | zsh"#, Zsh::shell_escape(&s)) - } -} - -impl> Expression for SubShell { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut s = String::new(); - self.expression.write_shell(&mut s)?; - write!(writer, r#"echo {} | bash"#, Bash::shell_escape(&s)) - } -} - -impl> Expression for SubShell { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut s = String::new(); - self.expression.write_shell(&mut s)?; - write!(writer, r#"fish -c {}"#, Fish::shell_escape(&s)) - } -} - -impl> Expression for SubShell { - fn write_shell(&self, writer: &mut impl Write) -> std::fmt::Result { - let mut s = String::new(); - self.expression.write_shell(&mut s)?; - write!( - writer, - r#"echo {} | powershell -NoProfile"#, - PowerShell::shell_escape(&s) - ) - } -} diff --git a/tests/shellcode/test_node_version.rs b/tests/shellcode/test_node_version.rs deleted file mode 100644 index 0d64899..0000000 --- a/tests/shellcode/test_node_version.rs +++ /dev/null @@ -1,12 +0,0 @@ -use super::shell::Shell; -use super::{Call, ExpectCommandOutput}; - -pub(crate) fn test_node_version( - expected_version: &'static str, -) -> ExpectCommandOutput { - ExpectCommandOutput::new( - Call::new("node", vec!["-v"]), - expected_version, - "Node version", - ) -} diff --git a/tests/shellcode/write_file.rs b/tests/shellcode/write_file.rs deleted file mode 100644 index f31f840..0000000 --- a/tests/shellcode/write_file.rs +++ /dev/null @@ -1,24 +0,0 @@ -use super::*; - -#[derive(Debug)] -pub struct WriteFile { - name: &'static str, - contents: &'static str, -} - -impl WriteFile { - pub(crate) fn new(name: &'static str, contents: &'static str) -> Self { - Self { name, contents } - } -} - -impl Expression for WriteFile { - fn write_shell(&self, writer: &mut impl std::fmt::Write) -> std::fmt::Result { - write!( - writer, - "echo {} > {}", - S::shell_escape(self.contents), - S::shell_escape(self.name) - ) - } -} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..05c6d35 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "esnext", + "moduleResolution": "NodeNext", + "moduleDetection": "force", + "module": "esnext", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + } +} diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 00301cd..0000000 --- a/yarn.lock +++ /dev/null @@ -1,833 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@gar/promisify@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210" - integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw== - -"@npmcli/fs@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-1.0.0.tgz#589612cfad3a6ea0feafcb901d29c63fd52db09f" - integrity sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ== - dependencies: - "@gar/promisify" "^1.0.1" - semver "^7.3.5" - -"@npmcli/move-file@^1.0.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@npmcli/move-file/-/move-file-1.1.2.tgz#1a82c3e372f7cae9253eb66d72543d6b8685c674" - integrity sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.1.3: - version "4.1.4" - resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.1.4.tgz#d928028a4862cb11718e55227872e842a44c945b" - integrity sha512-+V/rGa3EuU74H6wR04plBb7Ks10FbtUQgRj/FQOG7uUIEuaINI+AiqJR1k6t3SVNs7o7ZjIdus6706qqzVq8jQ== - dependencies: - debug "^4.1.0" - depd "^1.1.2" - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ansi-regex@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -any-promise@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" - integrity sha1-q8av7tzqUugJzcA3au0845Y10X8= - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -cacache@^15.2.0: - version "15.3.0" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb" - integrity sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ== - dependencies: - "@npmcli/fs" "^1.0.0" - "@npmcli/move-file" "^1.0.1" - chownr "^2.0.0" - fs-minipass "^2.0.0" - glob "^7.1.4" - infer-owner "^1.0.4" - lru-cache "^6.0.0" - minipass "^3.1.1" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.2" - mkdirp "^1.0.3" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^8.0.1" - tar "^6.0.2" - unique-filename "^1.1.1" - -chalk@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-highlight@^2.1.11: - version "2.1.11" - resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" - integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== - dependencies: - chalk "^4.0.0" - highlight.js "^10.7.1" - mz "^2.4.0" - parse5 "^5.1.1" - parse5-htmlparser2-tree-adapter "^6.0.0" - yargs "^16.0.0" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cmd-ts@0.8.0: - version "0.8.0" - resolved "https://registry.yarnpkg.com/cmd-ts/-/cmd-ts-0.8.0.tgz#c5c1970d9f8259fdfa5686a39e5b6df37d8c60d0" - integrity sha512-7RSjtBLtJIo+ulrXZ1ogMbJUXkCHEKO1EzrrPNG/cXzEGhrpueAweIuW1T0WpgNPwwOWp2uM0uoAdCu/eaXcDQ== - dependencies: - chalk "^4.0.0" - debug "^4.1.1" - didyoumean "^1.2.1" - strip-ansi "^6.0.0" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -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" - integrity sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg== - dependencies: - ms "2.1.2" - -debug@^4.3.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" - integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== - dependencies: - ms "2.1.2" - -depd@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -didyoumean@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/didyoumean/-/didyoumean-1.2.1.tgz#e92edfdada6537d484d73c0172fd1eba0c4976ff" - integrity sha1-6S7f2tplN9SE1zwBcv0eugxJdv8= - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -encoding@^0.1.12: - version "0.1.13" - resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -execa@5.1.1, execa@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - 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" - -fs-minipass@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -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" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -highlight.js@^10.7.1: - version "10.7.3" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" - integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== - -hosted-git-info@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.0.2.tgz#5e425507eede4fea846b7262f0838456c4209961" - integrity sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg== - dependencies: - lru-cache "^6.0.0" - -http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - 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" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= - dependencies: - ms "^2.0.0" - -iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ip@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" - integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= - -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== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -lerna-changelog@2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/lerna-changelog/-/lerna-changelog-2.2.0.tgz#c43813bba81e30cdeb20aabaef4da390f0f38e41" - integrity sha512-yjYNAHrbnw8xYFKmYWJEP52Tk4xSdlNmzpYr26+3glbSGDmpe8UMo8f9DlEntjGufL+opup421oVTXcLshwAaQ== - dependencies: - chalk "^4.0.0" - cli-highlight "^2.1.11" - execa "^5.0.0" - hosted-git-info "^4.0.0" - make-fetch-happen "^9.0.0" - p-map "^3.0.0" - progress "^2.0.0" - yargs "^17.1.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-fetch-happen@^9.0.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968" - integrity sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg== - dependencies: - agentkeepalive "^4.1.3" - cacache "^15.2.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^6.0.0" - minipass "^3.1.3" - minipass-collect "^1.0.2" - minipass-fetch "^1.3.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.2" - promise-retry "^2.0.1" - socks-proxy-agent "^6.0.0" - ssri "^8.0.0" - -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" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^1.3.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-1.4.1.tgz#d75e0091daac1b0ffd7e9d41629faff7d0c1f1b6" - integrity sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw== - dependencies: - minipass "^3.1.0" - minipass-sized "^1.0.3" - minizlib "^2.0.0" - optionalDependencies: - encoding "^0.1.12" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-pipeline@^1.2.2, minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minipass@^3.1.3: - version "3.1.5" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.5.tgz#71f6251b0a33a49c01b3cf97ff77eda030dff732" - integrity sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw== - dependencies: - yallist "^4.0.0" - -minizlib@^2.0.0, minizlib@^2.1.1: - version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2, ms@^2.0.0: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -mz@^2.4.0: - version "2.7.0" - resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" - integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== - dependencies: - any-promise "^1.0.0" - object-assign "^4.0.1" - thenify-all "^1.0.0" - -negotiator@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== - -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" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - 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-map@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" - integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== - dependencies: - aggregate-error "^3.0.0" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -parse5-htmlparser2-tree-adapter@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" - integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== - dependencies: - parse5 "^6.0.1" - -parse5@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" - integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== - -parse5@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -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.5.1: - version "2.5.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" - integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -"safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.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@^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.3: - version "3.0.3" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -smart-buffer@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz#91605c25d91652f4661ea69ccf45f1b331ca21ba" - integrity sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw== - -socks-proxy-agent@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-6.1.0.tgz#869cf2d7bd10fea96c7ad3111e81726855e285c3" - integrity sha512-57e7lwCN4Tzt3mXz25VxOErJKXlPfXmkMLnk310v/jwW20jWRVcgsOit+xNkN3eIEdB47GwnfAEBLacZ/wVIKg== - dependencies: - agent-base "^6.0.2" - debug "^4.3.1" - socks "^2.6.1" - -socks@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e" - integrity sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA== - dependencies: - ip "^1.1.5" - smart-buffer "^4.1.0" - -ssri@^8.0.0, ssri@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-8.0.1.tgz#638e4e439e2ffbd2cd289776d5ca457c4f51a2af" - integrity sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ== - dependencies: - minipass "^3.1.1" - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -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@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -tar@^6.0.2: - version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -thenify-all@^1.0.0: - version "1.6.0" - resolved "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" - integrity sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY= - dependencies: - thenify ">= 3.1.0 < 4" - -"thenify@>= 3.1.0 < 4": - version "3.3.1" - resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" - integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== - dependencies: - any-promise "^1.0.0" - -toml@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" - integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -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@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs@^16.0.0: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.1.0: - version "17.1.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.1.0.tgz#0cd9827a0572c9a1795361c4d1530e53ada168cf" - integrity sha512-SQr7qqmQ2sNijjJGHL4u7t8vyDZdZ3Ahkmo4sc1w5xI9TBX0QDdG/g4SFnxtWOsGLjwHQue57eFALfwFCnixgg== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2"