diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..6fddca0 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,7 @@ +version: 2 +updates: + # Maintain dependencies for GitHub Actions + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml deleted file mode 100644 index 2b7f63e..0000000 --- a/.github/workflows/build.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: Build - -on: - push: - branches: - - main - pull_request: - -jobs: - plugin_test: - name: asdf plugin test - strategy: - matrix: - os: - - ubuntu-18.04 - - ubuntu-20.04 - - macos-10.15 - # - macos-11 - runs-on: ${{ matrix.os }} - steps: - - name: asdf_plugin_test - uses: asdf-vm/actions/plugin-test@v1 - with: - command: firebase --version diff --git a/.github/workflows/lint.yaml b/.github/workflows/lint.yml similarity index 50% rename from .github/workflows/lint.yaml rename to .github/workflows/lint.yml index a0ddb3f..97c7f71 100644 --- a/.github/workflows/lint.yaml +++ b/.github/workflows/lint.yml @@ -11,20 +11,25 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v2 - - name: asdf_install + uses: actions/checkout@v3 + + - name: Install asdf dependencies uses: asdf-vm/actions/install@v1 - - name: Shellcheck - run: shellcheck -x bin/* -P lib/ + - name: Run ShellCheck + run: scripts/shellcheck.bash - shfmt: + shellfmt: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v2 - - name: asdf_install + uses: actions/checkout@v3 + + - name: Install asdf dependencies uses: asdf-vm/actions/install@v1 - - name: Shell Format - List files to check + + - name: List file to shfmt run: shfmt -f . - - name: Shell Format - Validate - run: shfmt -d . + + - name: Run shfmt + run: scripts/shfmt.bash + diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yml similarity index 59% rename from .github/workflows/release.yaml rename to .github/workflows/release.yml index 4a118ee..74dc26d 100644 --- a/.github/workflows/release.yaml +++ b/.github/workflows/release.yml @@ -6,9 +6,10 @@ on: - main jobs: - release-please: + release: runs-on: ubuntu-latest steps: - - uses: GoogleCloudPlatform/release-please-action@v2 + - uses: GoogleCloudPlatform/release-please-action@v3 + name: Create Release with: release-type: simple diff --git a/.github/workflows/semantic-pr.yaml b/.github/workflows/semantic-pr.yml similarity index 69% rename from .github/workflows/semantic-pr.yaml rename to .github/workflows/semantic-pr.yml index 6f6f7b9..51e217f 100644 --- a/.github/workflows/semantic-pr.yaml +++ b/.github/workflows/semantic-pr.yml @@ -1,4 +1,4 @@ -name: Lint PR +name: Enforce Conventional Commit Style on: pull_request_target: @@ -8,10 +8,10 @@ on: - synchronize jobs: - main: + semantic-pr: runs-on: ubuntu-latest steps: - - uses: amannn/action-semantic-pull-request@v3.4.0 + - uses: amannn/action-semantic-pull-request@v4.5.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} with: diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..b4c2169 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,40 @@ +name: Test + +on: + push: + branches: + - main + pull_request: + +jobs: + asdf_plugin_test: + strategy: + matrix: + os: + - ubuntu-latest + - macos-latest + runs-on: ${{ matrix.os }} + steps: + - name: asdf plugin test + uses: asdf-vm/actions/plugin-test@v1 + with: + command: firebase --help + github_token: ${{ github.token }} + bats: + strategy: + matrix: + os: + - ubuntu-latest + - macos-latest + runs-on: ${{ matrix.os }} + steps: + - name: Checkout code + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Install asdf dependencies + uses: asdf-vm/actions/install@v1 + - name: Run tests + run: bats test + env: + GITHUB_API_TOKEN: ${{ github.token }} diff --git a/.husky/.gitignore b/.husky/.gitignore deleted file mode 100644 index 31354ec..0000000 --- a/.husky/.gitignore +++ /dev/null @@ -1 +0,0 @@ -_ diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100755 index 0bd658f..0000000 --- a/.husky/commit-msg +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -npx --no-install commitlint --edit "$1" diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100755 index 38065ab..0000000 --- a/.husky/pre-commit +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -MARKDOWN_JS_FILES=$(git diff --cached --name-only --diff-filter=ACMR "*.md" "*.js" "*.json" | sed 's| |\\ |g') -SHELL_FILES=$(git diff --cached --name-only --diff-filter=ACMR -- bin/ lib/ | sed 's| |\\ |g') - -if [ -n "$MARKDOWN_JS_FILES" ]; then - # Prettify all selected files, stage modified - echo "$MARKDOWN_JS_FILES" | xargs ./node_modules/.bin/prettier --write - echo "$MARKDOWN_JS_FILES" | xargs git add -fi - -# Shfmt changed files, stage modified -if [ -n "$SHELL_FILES" ]; then - # Shfmt changed files, stage modified - echo "$SHELL_FILES" | xargs shfmt -w - echo "$SHELL_FILES" | xargs git add -fi - -exit 0 diff --git a/.tool-versions b/.tool-versions index b77b89c..09939ad 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,4 +1,8 @@ -nodejs 16.15.1 +# Markdown Formatting +deno 1.23.1 +# Shell Script Testing Framework +bats 1.7.0 +# Shell Script Linter shellcheck 0.8.0 +# Shell Script Formatter shfmt 3.5.1 -pnpm 7.2.1 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 58239ea..284f8f3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,16 +2,22 @@ ## Setup -1. `git clone https://github.com/jthegedus/asdf-firebase.git` -2. `asdf install` -3. `npm i` +1. `git clone https://github.com/jthegedus/asdf-v.git` +1. ``` + asdf plugin add deno https://github.com/asdf-community/asdf-deno.git + asdf plugin add bats https://github.com/timgluz/asdf-bats.git + asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git + asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git + ``` +1. `asdf install` ## Structure - `bin/*`: asdf plugin functions -- `lib/dependencies.txt`: list of dependencies required for this plugin to execute and install the tool as well as the tool's dependencies. -- `lib/helpers.bash`: helper functions that are asdf-firebase specific -- `lib/utils.bash`: utility functions that are asdf-plugin agnostic +- `lib/dependencies.txt`: list of dependencies required for this plugin to + execute and install the tool as well as the tool's dependencies. +- `lib/envs.bash`: environment variables for install, use and testing of the + plugin ## Testing Locally @@ -20,14 +26,17 @@ ```shell asdf plugin remove firebase asdf plugin add firebase . -asdf install firebase 7.15.1 +asdf install firebase 11.2.2 ``` -### asdf plugin tests +### asdf tests + +Two types of testing are used. Bats tests under the `test/` dir and asdf +specific integration tests with `asdf plugin test`. ```shell asdf plugin test [--asdf-tool-version ] [--asdf-plugin-gitref ] [test-command*] -asdf plugin test firebase https://github.com/jthegedus/asdf-firebase.git firebase --version +asdf plugin test v https://github.com/jthegedus/asdf-v.git v --version ``` Tests are automatically run in GitHub Actions on push and PR. diff --git a/bin/download b/bin/download index ccbf895..59ceba5 100755 --- a/bin/download +++ b/bin/download @@ -5,26 +5,50 @@ set -euo pipefail current_script_path="${BASH_SOURCE[0]}" plugin_dir="$(dirname "$(dirname "$current_script_path")")" -# shellcheck source=../lib/utils.bash -source "${plugin_dir}/lib/utils.bash" - -function download() { - local filename="firebase" - local url - url="$(get_github_repo)/releases/download/v${ASDF_INSTALL_VERSION}/firebase-tools-$(get_os_name)" - - log_info "âŦ downloading ${filename} ${ASDF_INSTALL_VERSION} from ${url}" - status_code=$(curl -X GET \ - --write-out "%{http_code}" \ - --progress-bar \ - -Lo "${ASDF_DOWNLOAD_PATH}/${filename}" \ - "${url}") - - if [[ ${status_code} -eq 404 ]]; then - rm -rf "${ASDF_DOWNLOAD_PATH}" - log_failure_and_exit "An error occurred. firebase-tools may not have been found for version ${ASDF_INSTALL_VERSION}. Full versions are required, not just major version numbers." - fi - log_success "downloaded!" +# shellcheck source=../lib/envs.bash +. "${plugin_dir}/lib/envs.bash" + +function fail() { + printf "* ERROR: asdf-%s %s\\n" "$TOOL_NAME" "$*" + exit 1 } -download +# ref installs not supported +if [ "$ASDF_INSTALL_TYPE" != "version" ]; then + fail "supports release installs only. See \"asdf list all $TOOL_NAME\" for a list of supported versions." +fi + +if [ "$ASDF_INSTALL_TYPE" == "version" ]; then + # validate version(non-ref) is in list-all versions + results="$(asdf list all $TOOL_NAME)" + if ! grep -q "^$ASDF_INSTALL_VERSION$" <<<"$results"; then + fail "version \"$ASDF_INSTALL_VERSION\" not supported. \"asdf list all $TOOL_NAME\" will list available versions." + fi +fi + +os_name="default" +case $(uname -s) in +Linux*) + os_name="linux" + ;; +Darwin*) + os_name="macos" + ;; +*) + fail "Script only supports macOS and Ubuntu" + ;; +esac +url="${GH_REPO}/releases/download/v${ASDF_INSTALL_VERSION}/firebase-tools-${os_name}" + +printf "* Downloading %s@%s from %s\\n" "$TOOL_NAME" "$ASDF_INSTALL_VERSION" "$url" +status_code=$(curl -X GET \ + --write-out "%{http_code}" \ + --progress-bar \ + -Lo "${ASDF_DOWNLOAD_PATH}/${TOOL_NAME}" \ + "${url}") + +if [[ ${status_code} -eq 404 ]]; then + rm -rf "${ASDF_DOWNLOAD_PATH}" + fail "An error occurred. firebase-tools may not have been found for version ${ASDF_INSTALL_VERSION}. Full versions are required, not just major version numbers." +fi +printf "%s\\n" "* Downloaded to ${ASDF_DOWNLOAD_PATH}/${TOOL_NAME}" diff --git a/bin/help.deps b/bin/help.deps new file mode 100755 index 0000000..cbe1e8d --- /dev/null +++ b/bin/help.deps @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +set -euo pipefail + +current_script_path=${BASH_SOURCE[0]} +plugin_dir=$(dirname "$(dirname "$current_script_path")") + +# shellcheck source=../lib/envs.bash +. "${plugin_dir}/lib/envs.bash" + +printf "%s\\n\\n" "Dependencies:" +cat "$plugin_dir/lib/dependencies.txt" +printf "\\n" diff --git a/bin/help.links b/bin/help.links new file mode 100755 index 0000000..e2a4397 --- /dev/null +++ b/bin/help.links @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -euo pipefail + +current_script_path=${BASH_SOURCE[0]} +plugin_dir=$(dirname "$(dirname "$current_script_path")") + +# shellcheck source=../lib/envs.bash +. "${plugin_dir}/lib/envs.bash" + +printf "%s\\t%s\\n" "Git Repository:" "$GH_REPO" +printf "%s\\t%s\\n" "Documentation:" "$DOCS_SITE" diff --git a/bin/help.overview b/bin/help.overview new file mode 100755 index 0000000..dbf5ab2 --- /dev/null +++ b/bin/help.overview @@ -0,0 +1,11 @@ +#!/usr/bin/env bash + +set -euo pipefail + +current_script_path=${BASH_SOURCE[0]} +plugin_dir=$(dirname "$(dirname "$current_script_path")") + +# shellcheck source=../lib/envs.bash +. "${plugin_dir}/lib/envs.bash" + +printf "%s\\n\\n" "Manage $TOOL_NAME versions per project. The minimum supported $TOOL_NAME version is $MIN_SUPPORTED_VERSION" diff --git a/bin/install b/bin/install index e270a1e..b3ca8ff 100755 --- a/bin/install +++ b/bin/install @@ -2,38 +2,40 @@ set -euo pipefail -current_script_path="${BASH_SOURCE[0]}" -plugin_dir="$(dirname "$(dirname "$current_script_path")")" +current_script_path=${BASH_SOURCE[0]} +plugin_dir=$(dirname "$(dirname "$current_script_path")") -# shellcheck source=../lib/utils.bash -source "${plugin_dir}/lib/utils.bash" +# shellcheck source=../lib/envs.bash +. "${plugin_dir}/lib/envs.bash" -function install_firebase() { +function fail() { + printf "* ERROR: asdf-%s %s\\n" "$TOOL_NAME" "$*" + exit 1 +} + +# download & install +( # if not asdf version with asdf_download_path then call download script here if [ -z "${ASDF_DOWNLOAD_PATH:-}" ]; then tmp_download_dir=$(mktemp -d -t 'asdf_firebase_XXXXXX') trap 'rm -rf "${tmp_download_dir}"' EXIT - log_info "ℹī¸ run download script for older version of asdf" + printf "* run download script for older version of asdf" export ASDF_DOWNLOAD_PATH="${tmp_download_dir}" # download bash "$(dirname "$0")/download" fi - log_info "🚧 installing..." - # move executable mkdir -p "${ASDF_INSTALL_PATH}/bin" cp "${ASDF_DOWNLOAD_PATH}/firebase" "${ASDF_INSTALL_PATH}/bin" + printf "* Moved to %s\\n" "$ASDF_INSTALL_PATH" chmod +rx "${ASDF_INSTALL_PATH}/bin/firebase" - # test executable - test -x "${ASDF_INSTALL_PATH}/bin/firebase" || log_failure_and_exit "Expected ${ASDF_INSTALL_PATH}/bin/firebase to be executable." - log_success "firebase-tools ${ASDF_INSTALL_VERSION} installed!" -} - -if [ "${ASDF_INSTALL_TYPE}" != "version" ]; then - log_failure_and_exit "Please provide the firebase-tools version number you wish to install." -fi - -check_dependencies "$(dirname "$0")/../lib/dependencies.txt" "failure" -install_firebase + printf "* Testing if %s@%s is executable\\n" "$TOOL_NAME" "$ASDF_INSTALL_VERSION" + tool_cmd="$(printf "%s\\n" "$TOOL_TEST" | cut -d' ' -f1)" + test -x "$ASDF_INSTALL_PATH/bin/$tool_cmd" || fail "Expected $ASDF_INSTALL_PATH/bin/$tool_cmd to be executable." + printf "* Success! %s@%s is ready for use.\\n" "$TOOL_NAME" "$ASDF_INSTALL_VERSION" +) || ( + rm -rf "$ASDF_INSTALL_PATH" + fail "An error ocurred while installing $TOOL_NAME@$ASDF_INSTALL_VERSION" +) diff --git a/bin/latest-stable b/bin/latest-stable new file mode 100755 index 0000000..c2636e2 --- /dev/null +++ b/bin/latest-stable @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -euo pipefail + +current_script_path=${BASH_SOURCE[0]} +plugin_dir=$(dirname "$(dirname "$current_script_path")") + +# shellcheck source=../lib/envs.bash +. "${plugin_dir}/lib/envs.bash" + +curl_opts=(-sI) + +if [ -n "${GITHUB_API_TOKEN:-}" ]; then + curl_opts=("${curl_opts[@]}" -H "Authorization: token $GITHUB_API_TOKEN") +fi + +# use GitHub releases latest API and follow redirect to resolve final version +curl "${curl_opts[@]}" "$GH_REPO/releases/latest" | + sed -n -e "s|^location: $GH_REPO/releases/tag/||p" | + sed -n -e "s|\r||p" | + sed 's|^v||' diff --git a/bin/list-all b/bin/list-all index 87908c2..8daa845 100755 --- a/bin/list-all +++ b/bin/list-all @@ -2,17 +2,27 @@ set -euo pipefail -current_script_path="${BASH_SOURCE[0]}" -plugin_dir="$(dirname "$(dirname "$current_script_path")")" +current_script_path=${BASH_SOURCE[0]} +plugin_dir=$(dirname "$(dirname "$current_script_path")") -# shellcheck source=../lib/utils.bash -source "${plugin_dir}/lib/utils.bash" +# shellcheck source=../lib/envs.bash +. "${plugin_dir}/lib/envs.bash" -function list_all() { - git ls-remote --tags --refs "$(get_github_repo)" | +# output: returns a newline-separated list of git tags +function list_github_tags() { + git ls-remote --tags --refs "$GH_REPO" | grep -o 'refs/tags/.*' | cut -d/ -f3- | - sed 's/^v//' + sed 's|^v||' | + grep -Ev "$VERSIONS_TO_OMIT" # remove matched Git Tags from results } -list_all | sort_versions | xargs echo +# input: accepts newline-separated list of semver versions +# output: returns a sorted space-separated list of semver versions +function sort_versions() { + sed 'h; s/[-]/./g; s/.p\([[:digit:]]\)/.z.\1/; s/$/.z/; G; s/\n/ /' | + LC_ALL=C sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n | + awk '{print $2}' +} + +list_github_tags | sort_versions | xargs echo # asdf_allow: echo diff --git a/bin/post-plugin-add b/bin/post-plugin-add index ee933ca..b5566e3 100755 --- a/bin/post-plugin-add +++ b/bin/post-plugin-add @@ -2,10 +2,28 @@ set -euo pipefail -current_script_path="${BASH_SOURCE[0]}" -plugin_dir="$(dirname "$(dirname "$current_script_path")")" +current_script_path=${BASH_SOURCE[0]} +plugin_dir=$(dirname "$(dirname "$current_script_path")") -# shellcheck source=../lib/utils.bash -source "${plugin_dir}/lib/utils.bash" +# shellcheck source=../lib/envs.bash +. "$plugin_dir/lib/envs.bash" -check_dependencies "$(dirname "$0")/../lib/dependencies.txt" "warning" +function check_dependencies() { + local dependencies_file="${1}" + declare -a missing_dependencies=() + + # loop over file of line separated list of dependencies required by this tool + while IFS="" read -r p || [ -n "${p}" ]; do + if [ ! "$(command -v "${p}")" ]; then + missing_dependencies+=("${p}") + fi + done <"${dependencies_file}" + + if [ "${#missing_dependencies[@]}" -ne 0 ]; then + printf "* Missing dependencies! These are hard requirements to install asdf-%s.\\n" "$TOOL_NAME" + printf "* %s\\n" "${missing_dependencies[@]}" + printf "* You should install the listed dependencies before continuing.\\n" + fi +} + +check_dependencies "$plugin_dir/lib/dependencies.txt" diff --git a/lib/dependencies.txt b/lib/dependencies.txt index c53e432..36d1af7 100644 --- a/lib/dependencies.txt +++ b/lib/dependencies.txt @@ -3,14 +3,15 @@ bash curl cut dirname -echo git grep +ln +make +mkdir mktemp printf rm sed -source sort tar uname diff --git a/lib/envs.bash b/lib/envs.bash new file mode 100644 index 0000000..9c10330 --- /dev/null +++ b/lib/envs.bash @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -euo pipefail + +GH_REPO="https://github.com/firebase/firebase-tools" +DOCS_SITE="https://firebase.google.com/docs/cli" +TOOL_NAME="firebase" +TOOL_TEST="firebase --help" +MIN_SUPPORTED_VERSION="7.3.0" # First Firebase CLI version that shipped pre-compiled binaries. +VERSIONS_TO_OMIT="^[1-6]\\..*$|^7\\.[0-2]\\..*$" # Omit versions before MIN_SUPPORTED_VERSION from list-all output. diff --git a/lib/utils.bash b/lib/utils.bash deleted file mode 100755 index 5f0021e..0000000 --- a/lib/utils.bash +++ /dev/null @@ -1,78 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# START Logging -function log_failure_and_exit() { - printf "🚨 %s\\n" "${@}" - exit 1 -} - -function log_failure() { - printf "🚨 %s\\n" "${@}" -} - -function log_info() { - printf "%s\\n" "${@}" -} - -function log_success() { - printf "✅ %s\\n" "${@}" -} - -function log_warning() { - printf "⚠ī¸ %s\\n" "${@}" -} -# END Logging - -function check_dependencies() { - local dependencies_file="${1}" - local failure_type="${2}" # should be "warning" or "failure" - declare -a missing_dependencies=() - - # loop over file of line separated list of dependencies required by this tool - while IFS="" read -r p || [ -n "${p}" ]; do - if [ ! "$(command -v "${p}")" ]; then - missing_dependencies+=("${p}") - fi - done <"${dependencies_file}" - - if [ "${#missing_dependencies[@]}" -ne 0 ]; then - if [ "${failure_type}" == "warning" ]; then - log_warning "Missing dependencies! These are hard requirements to install the Google Cloud SDK." - log_warning "${missing_dependencies[@]}" - log_info "You should install the listed dependencies before continuing." - else - log_failure "Missing dependencies! These are hard requirements to install the Google Cloud SDK." - log_failure_and_exit "${missing_dependencies[@]}" - fi - else - log_success "All dependencies found on system!" - fi -} - -function get_os_name() { - local os_name - case $(uname -s) in - Linux*) - os_name="linux" - ;; - Darwin*) - os_name="macos" - ;; - *) - log_failure_and_exit "Script only supports macOS and Ubuntu" - ;; - esac - echo "${os_name}" -} - -function get_github_repo() { - echo "https://github.com/firebase/firebase-tools" -} - -function sort_versions() { - sed 'h; s/[-]/./g; s/.p\([[:digit:]]\)/.z.\1/; s/$/.z/; G; s/\n/ /' | - LC_ALL=C sort -t. -k 1,1n -k 2,2n -k 3,3n | - awk '{print $2}' -} diff --git a/package.json b/package.json deleted file mode 100644 index 00bd692..0000000 --- a/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "asdf-firebase", - "private": true, - "repository": { - "type": "git", - "url": "git+https://github.com/jthegedus/asdf-firebase.git" - }, - "license": "MIT", - "homepage": "https://github.com/jthegedus/asdf-firebase#readme", - "bugs": { - "url": "https://github.com/jthegedus/asdf-firebase/issues" - }, - "devDependencies": { - "@commitlint/cli": "^12.1.4", - "@commitlint/config-conventional": "^12.1.4", - "husky": "^6.0.0", - "prettier": "^2.7.1" - }, - "scripts": { - "prepare": "husky install" - }, - "prettier": { - "useTabs": true - }, - "commitlint": { - "extends": [ - "@commitlint/config-conventional" - ] - } -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 8b049ae..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,994 +0,0 @@ -lockfileVersion: 5.4 - -specifiers: - '@commitlint/cli': ^12.1.4 - '@commitlint/config-conventional': ^12.1.4 - husky: ^6.0.0 - prettier: ^2.7.1 - -devDependencies: - '@commitlint/cli': 12.1.4 - '@commitlint/config-conventional': 12.1.4 - husky: 6.0.0 - prettier: 2.7.1 - -packages: - - /@babel/code-frame/7.16.7: - resolution: {integrity: sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.17.12 - dev: true - - /@babel/helper-validator-identifier/7.16.7: - resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/highlight/7.17.12: - resolution: {integrity: sha512-7yykMVF3hfZY2jsHZEEgLc+3x4o1O+fYyULu11GynEUQNwB6lua+IIQn1FiJxNucd5UlyJryrwsOh8PL9Sn8Qg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.16.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@commitlint/cli/12.1.4: - resolution: {integrity: sha512-ZR1WjXLvqEffYyBPT0XdnSxtt3Ty1TMoujEtseW5o3vPnkA1UNashAMjQVg/oELqfaiAMnDw8SERPMN0e/0kLg==} - engines: {node: '>=v10'} - hasBin: true - dependencies: - '@commitlint/format': 12.1.4 - '@commitlint/lint': 12.1.4 - '@commitlint/load': 12.1.4 - '@commitlint/read': 12.1.4 - '@commitlint/types': 12.1.4 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - yargs: 16.2.0 - dev: true - - /@commitlint/config-conventional/12.1.4: - resolution: {integrity: sha512-ZIdzmdy4o4WyqywMEpprRCrehjCSQrHkaRTVZV411GyLigFQHlEBSJITAihLAWe88Qy/8SyoIe5uKvAsV5vRqQ==} - engines: {node: '>=v10'} - dependencies: - conventional-changelog-conventionalcommits: 4.6.3 - dev: true - - /@commitlint/ensure/12.1.4: - resolution: {integrity: sha512-MxHIBuAG9M4xl33qUfIeMSasbv3ktK0W+iygldBxZOL4QSYC2Gn66pZAQMnV9o3V+sVFHoAK2XUKqBAYrgbEqw==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - lodash: 4.17.21 - dev: true - - /@commitlint/execute-rule/12.1.4: - resolution: {integrity: sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg==} - engines: {node: '>=v10'} - dev: true - - /@commitlint/format/12.1.4: - resolution: {integrity: sha512-h28ucMaoRjVvvgS6Bdf85fa/+ZZ/iu1aeWGCpURnQV7/rrVjkhNSjZwGlCOUd5kDV1EnZ5XdI7L18SUpRjs26g==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - chalk: 4.1.2 - dev: true - - /@commitlint/is-ignored/12.1.4: - resolution: {integrity: sha512-uTu2jQU2SKvtIRVLOzMQo3KxDtO+iJ1p0olmncwrqy4AfPLgwoyCP2CiULq5M7xpR3+dE3hBlZXbZTQbD7ycIw==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - semver: 7.3.5 - dev: true - - /@commitlint/lint/12.1.4: - resolution: {integrity: sha512-1kZ8YDp4to47oIPFELUFGLiLumtPNKJigPFDuHt2+f3Q3IKdQ0uk53n3CPl4uoyso/Og/EZvb1mXjFR/Yce4cA==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/is-ignored': 12.1.4 - '@commitlint/parse': 12.1.4 - '@commitlint/rules': 12.1.4 - '@commitlint/types': 12.1.4 - dev: true - - /@commitlint/load/12.1.4: - resolution: {integrity: sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/execute-rule': 12.1.4 - '@commitlint/resolve-extends': 12.1.4 - '@commitlint/types': 12.1.4 - chalk: 4.1.2 - cosmiconfig: 7.0.1 - lodash: 4.17.21 - resolve-from: 5.0.0 - dev: true - - /@commitlint/message/12.1.4: - resolution: {integrity: sha512-6QhalEKsKQ/Y16/cTk5NH4iByz26fqws2ub+AinHPtM7Io0jy4e3rym9iE+TkEqiqWZlUigZnTwbPvRJeSUBaA==} - engines: {node: '>=v10'} - dev: true - - /@commitlint/parse/12.1.4: - resolution: {integrity: sha512-yqKSAsK2V4X/HaLb/yYdrzs6oD/G48Ilt0EJ2Mp6RJeWYxG14w/Out6JrneWnr/cpzemyN5hExOg6+TB19H/Lw==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/types': 12.1.4 - conventional-changelog-angular: 5.0.13 - conventional-commits-parser: 3.2.4 - dev: true - - /@commitlint/read/12.1.4: - resolution: {integrity: sha512-TnPQSJgD8Aod5Xeo9W4SaYKRZmIahukjcCWJ2s5zb3ZYSmj6C85YD9cR5vlRyrZjj78ItLUV/X4FMWWVIS38Jg==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/top-level': 12.1.4 - '@commitlint/types': 12.1.4 - fs-extra: 9.1.0 - git-raw-commits: 2.0.11 - dev: true - - /@commitlint/resolve-extends/12.1.4: - resolution: {integrity: sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg==} - engines: {node: '>=v10'} - dependencies: - import-fresh: 3.3.0 - lodash: 4.17.21 - resolve-from: 5.0.0 - resolve-global: 1.0.0 - dev: true - - /@commitlint/rules/12.1.4: - resolution: {integrity: sha512-W8m6ZSjg7RuIsIfzQiFHa48X5mcPXeKT9yjBxVmjHvYfS2FDBf1VxCQ7vO0JTVIdV4ohjZ0eKg/wxxUuZHJAZg==} - engines: {node: '>=v10'} - dependencies: - '@commitlint/ensure': 12.1.4 - '@commitlint/message': 12.1.4 - '@commitlint/to-lines': 12.1.4 - '@commitlint/types': 12.1.4 - dev: true - - /@commitlint/to-lines/12.1.4: - resolution: {integrity: sha512-TParumvbi8bdx3EdLXz2MaX+e15ZgoCqNUgqHsRLwyqLUTRbqCVkzrfadG1UcMQk8/d5aMbb327ZKG3Q4BRorw==} - engines: {node: '>=v10'} - dev: true - - /@commitlint/top-level/12.1.4: - resolution: {integrity: sha512-d4lTJrOT/dXlpY+NIt4CUl77ciEzYeNVc0VFgUQ6VA+b1rqYD2/VWFjBlWVOrklxtSDeKyuEhs36RGrppEFAvg==} - engines: {node: '>=v10'} - dependencies: - find-up: 5.0.0 - dev: true - - /@commitlint/types/12.1.4: - resolution: {integrity: sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw==} - engines: {node: '>=v10'} - dependencies: - chalk: 4.1.2 - dev: true - - /@types/minimist/1.2.2: - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} - dev: true - - /@types/normalize-package-data/2.4.1: - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} - dev: true - - /@types/parse-json/4.0.0: - resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} - dev: true - - /JSONStream/1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - 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 - - /array-ify/1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} - dev: true - - /arrify/1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - dev: true - - /at-least-node/1.0.0: - resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} - engines: {node: '>= 4.0.0'} - dev: true - - /callsites/3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - 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/5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - 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 - - /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 - - /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 - - /compare-func/2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - dependencies: - array-ify: 1.0.0 - dot-prop: 5.3.0 - dev: true - - /conventional-changelog-angular/5.0.13: - resolution: {integrity: sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - q: 1.5.1 - dev: true - - /conventional-changelog-conventionalcommits/4.6.3: - resolution: {integrity: sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==} - engines: {node: '>=10'} - dependencies: - compare-func: 2.0.0 - lodash: 4.17.21 - q: 1.5.1 - dev: true - - /conventional-commits-parser/3.2.4: - resolution: {integrity: sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==} - engines: {node: '>=10'} - hasBin: true - dependencies: - is-text-path: 1.0.1 - JSONStream: 1.3.5 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /cosmiconfig/7.0.1: - resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} - engines: {node: '>=10'} - dependencies: - '@types/parse-json': 4.0.0 - import-fresh: 3.3.0 - parse-json: 5.2.0 - path-type: 4.0.0 - yaml: 1.10.2 - dev: true - - /dargs/7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} - 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 - - /dot-prop/5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - dev: true - - /emoji-regex/8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - dev: true - - /error-ex/1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - 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 - - /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 - - /fs-extra/9.1.0: - resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} - engines: {node: '>=10'} - dependencies: - at-least-node: 1.0.0 - graceful-fs: 4.2.10 - jsonfile: 6.1.0 - universalify: 2.0.0 - dev: true - - /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true - - /get-caller-file/2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - dev: true - - /git-raw-commits/2.0.11: - resolution: {integrity: sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==} - engines: {node: '>=10'} - hasBin: true - dependencies: - dargs: 7.0.0 - lodash: 4.17.21 - meow: 8.1.2 - split2: 3.2.2 - through2: 4.0.2 - dev: true - - /global-dirs/0.1.1: - resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} - engines: {node: '>=4'} - dependencies: - ini: 1.3.8 - dev: true - - /graceful-fs/4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - dev: true - - /hard-rejection/2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} - 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/1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - dependencies: - function-bind: 1.1.1 - 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 - - /husky/6.0.0: - resolution: {integrity: sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ==} - hasBin: true - dev: true - - /import-fresh/3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - dev: true - - /indent-string/4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - 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 - - /is-arrayish/0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - dev: true - - /is-core-module/2.9.0: - resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} - dependencies: - has: 1.0.3 - dev: true - - /is-fullwidth-code-point/3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - dev: true - - /is-obj/2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - dev: true - - /is-plain-obj/1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} - dev: true - - /is-text-path/1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} - dependencies: - text-extensions: 1.9.0 - dev: true - - /js-tokens/4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - dev: true - - /json-parse-even-better-errors/2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - dev: true - - /jsonfile/6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.10 - dev: true - - /jsonparse/1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - dev: true - - /kind-of/6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - dev: true - - /lines-and-columns/1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - 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/4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - - /lru-cache/6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - 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 - - /meow/8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} - 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: 3.0.3 - read-pkg-up: 7.0.1 - redent: 3.0.0 - trim-newlines: 3.0.1 - type-fest: 0.18.1 - yargs-parser: 20.2.9 - dev: true - - /min-indent/1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - 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 - - /normalize-package-data/2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - dependencies: - hosted-git-info: 2.8.9 - resolve: 1.22.0 - semver: 5.7.1 - validate-npm-package-license: 3.0.4 - dev: true - - /normalize-package-data/3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - dependencies: - hosted-git-info: 4.1.0 - is-core-module: 2.9.0 - semver: 7.3.7 - validate-npm-package-license: 3.0.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-try/2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: true - - /parent-module/1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - dev: true - - /parse-json/5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.16.7 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - dev: true - - /path-exists/4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: true - - /path-parse/1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true - - /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - - /prettier/2.7.1: - resolution: {integrity: sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g==} - engines: {node: '>=10.13.0'} - hasBin: true - 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 - - /quick-lru/4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} - 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/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 - - /readable-stream/3.6.0: - resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - 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 - - /require-directory/2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.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-global/1.0.0: - resolution: {integrity: sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==} - engines: {node: '>=8'} - dependencies: - global-dirs: 0.1.1 - dev: true - - /resolve/1.22.0: - resolution: {integrity: sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==} - hasBin: true - dependencies: - is-core-module: 2.9.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - - /safe-buffer/5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - dev: true - - /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} - hasBin: true - dev: true - - /semver/7.3.5: - resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - 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 - - /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 - - /split2/3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} - dependencies: - readable-stream: 3.6.0 - 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_decoder/1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - dev: true - - /strip-ansi/6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.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 - - /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-preserve-symlinks-flag/1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - dev: true - - /text-extensions/1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} - dev: true - - /through/2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - dev: true - - /through2/4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - dependencies: - readable-stream: 3.6.0 - dev: true - - /trim-newlines/3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} - dev: true - - /type-fest/0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - 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 - - /universalify/2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - dev: true - - /util-deprecate/1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - 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 - - /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 - - /y18n/5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - dev: true - - /yallist/4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yaml/1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: true - - /yargs-parser/20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - 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 - - /yocto-queue/0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - dev: true diff --git a/scripts/format.bash b/scripts/format.bash new file mode 100755 index 0000000..60693a5 --- /dev/null +++ b/scripts/format.bash @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +shfmt -w . +deno fmt *.md diff --git a/scripts/shellcheck.bash b/scripts/shellcheck.bash new file mode 100755 index 0000000..a9866b4 --- /dev/null +++ b/scripts/shellcheck.bash @@ -0,0 +1,4 @@ +#!/usr/bin/env bash + +shellcheck -s bash -x \ + bin/* -P lib/ diff --git a/scripts/shfmt.bash b/scripts/shfmt.bash new file mode 100755 index 0000000..830d0ac --- /dev/null +++ b/scripts/shfmt.bash @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +shfmt -d . diff --git a/test/banned_commands.bats b/test/banned_commands.bats new file mode 100644 index 0000000..3d0a8cf --- /dev/null +++ b/test/banned_commands.bats @@ -0,0 +1,104 @@ +#!/usr/bin/env bats + +load test_setup + +# NOTE: Test to ensure cross-compatibility. +# Taken from asdf core repo test file of the same name. +# It may be out of date, so check periodically to see if there are new additions to banned_commands or banned_commands_regex. +# Source: https://github.com/asdf-vm/asdf/blob/624aede7f3480cd6a8817d5a73b72227e87fa668/test/banned_commands.bats + +banned_commands=( + # Process substitution isn't POSIX compliant and cause trouble + "<(" + # Command isn't included in the Ubuntu packages asdf depends on. Also not + # defined in POSIX + column + # echo isn't consistent across operating systems, and sometimes output can + # be confused with echo flags. printf does everything echo does and more. + echo + # It's best to avoid eval as it makes it easier to accidentally execute + # arbitrary strings + eval + # realpath not available by default on OSX. + realpath + # readlink on OSX behaves differently from readlink on other Unix systems + readlink + # source isn't POSIX compliant. . behaves the same and is POSIX compliant + # Except in fish, where . is deprecated, and will be removed in the future. + source +) + +banned_commands_regex=( + # grep -y does not work on alpine and should be "grep -i" either way + "grep.* -y" + # grep -P is not a valid option in OSX. + "grep.* -P" + # Ban grep long commands as they do not work on alpine + "grep[^|]+--\w{2,}" + # sort --sort-version isn't supported everywhere + "sort.*-V" + "sort.*--sort-versions" + + # ls often gets used when we want to glob for files that match a pattern + # or when we want to find all files/directories that match a pattern or are + # found in a certain location. Using shell globs is preferred over ls, and + # find is better at locating files that are in a certain location or that + # match certain filename patterns. + # https://github-wiki-see.page/m/koalaman/shellcheck/wiki/SC2012 + '\bls ' + + # Ban recusive asdf calls as they are inefficient and may introduce bugs. + # If you find yourself needing to invoke an `asdf` command from within + # asdf code, please source the appropriate file and invoke the + # corresponding function. + '\basdf ' +) + +setup() { + setup_asdf_dir +} + +teardown() { + clean_asdf_dir +} + +@test "banned commands are not found in source code" { + # Assert command is not used in the lib and bin dirs + # or expect an explicit comment at end of line, allowing it. + # Also ignore matches that are contained in comments or a string or + # followed by an underscore (indicating it's a variable and not a + # command). + for cmd in "${banned_commands[@]}"; do + run bash -c "grep -nHR '$cmd' lib bin scripts \ + | grep -v '#.*$cmd' \ + | grep -v '\".*$cmd.*\"' \ + | grep -v '${cmd}_' \ + | grep -v '# asdf_allow: $cmd'" + + # Only print output if we've found a banned command + #if [ "$status" -ne 1 ]; then + if [ "" != "$output" ]; then + echo "banned command $cmd: $output" + fi + + [ "$status" -eq 1 ] + [ "" == "$output" ] + done + + for cmd in "${banned_commands_regex[@]}"; do + run bash -c "grep -nHRE '$cmd' lib bin scripts \ + | grep -v '#.*$cmd' \ + | grep -v '\".*$cmd.*\"' \ + | grep -v '${cmd}_' \ + | grep -v '# asdf_allow: $cmd'" + + # Only print output if we've found a banned command + #if [ "$status" -ne 1 ]; then + if [ "" != "$output" ]; then + echo "banned command $cmd: $output" + fi + + [ "$status" -eq 1 ] + [ "" == "$output" ] + done +} diff --git a/test/bin_help.bats b/test/bin_help.bats new file mode 100644 index 0000000..93acc7c --- /dev/null +++ b/test/bin_help.bats @@ -0,0 +1,24 @@ +#!/usr/bin/env bats + +load test_setup + +setup() { + setup_asdf_dir + install_plugin +} + +teardown() { + clean_asdf_dir +} + +@test "asdf help firebase" { + run asdf help firebase + + [ "$?" -eq 0 ] + echo "$output" + [[ "$output" =~ "Manage $TOOL_NAME versions per project. The minimum supported $TOOL_NAME version is $MIN_SUPPORTED_VERSION" ]] + [[ "$output" =~ "Git Repository:" ]] + [[ "$output" =~ "$GH_REPO" ]] + [[ "$output" =~ "Documentation:" ]] + [[ "$output" =~ "$DOCS_SITE" ]] +} diff --git a/test/bin_install.bats b/test/bin_install.bats new file mode 100644 index 0000000..a8d367c --- /dev/null +++ b/test/bin_install.bats @@ -0,0 +1,62 @@ +#!/usr/bin/env bats + +load test_setup + +setup() { + setup_asdf_dir + install_plugin +} + +teardown() { + clean_asdf_dir +} + +@test "asdf install ${TOOL_NAME} ref:asdfasd: expect failure installing specific ref" { + run asdf install ${TOOL_NAME} ref:asdfasd + + [ "$?" -eq 0 ] + [[ "$output" =~ "* ERROR: asdf-${TOOL_NAME} supports release installs only. See \"asdf list all ${TOOL_NAME}\" for a list of supported versions." ]] +} + +@test "asdf install ${TOOL_NAME} 7.2.0: expect failure installing version below minimum supported" { + version_to_install="7.2.0" + expected="* ERROR: asdf-${TOOL_NAME} version \"${version_to_install}\" not supported. \"asdf list all ${TOOL_NAME}\" will list available versions." + run asdf install ${TOOL_NAME} ${version_to_install} + + [ "$?" -eq 0 ] + [[ "$output" = "$expected" ]] +} + +@test "asdf install ${TOOL_NAME} 1000.0.0: errors as version is not in \"asdf list all ${TOOL_NAME}\"" { + version_to_install="1000.0.0" + expected="* ERROR: asdf-${TOOL_NAME} version \"${version_to_install}\" not supported. \"asdf list all ${TOOL_NAME}\" will list available versions." + run asdf install ${TOOL_NAME} ${version_to_install} + + [ "$?" -eq 0 ] + [[ "$output" = "$expected" ]] +} + +@test "asdf install ${TOOL_NAME} ${MIN_SUPPORTED_VERSION}: installs point release" { + run asdf install ${TOOL_NAME} ${MIN_SUPPORTED_VERSION} + + [ "$?" -eq 0 ] + [[ "$output" =~ "Downloading ${TOOL_NAME}@${MIN_SUPPORTED_VERSION}" ]] + [[ "$output" =~ "Downloaded to" ]] + [[ "$output" =~ "Moved to" ]] + [[ "$output" =~ "Testing if ${TOOL_NAME}@${MIN_SUPPORTED_VERSION} is executable" ]] + [[ "$output" =~ "Success! ${TOOL_NAME}@${MIN_SUPPORTED_VERSION} is ready for use." ]] +} + +@test "asdf install ${TOOL_NAME} latest: installs latest release" { + run asdf latest firebase + latest_version="$output" + + run asdf install ${TOOL_NAME} latest + + [ "$?" -eq 0 ] + [[ "$output" =~ "Downloading ${TOOL_NAME}@${latest_version}" ]] + [[ "$output" =~ "Downloaded to" ]] + [[ "$output" =~ "Moved to" ]] + [[ "$output" =~ "Testing if ${TOOL_NAME}@${latest_version} is executable" ]] + [[ "$output" =~ "Success! ${TOOL_NAME}@${latest_version} is ready for use." ]] +} diff --git a/test/bin_latest_stable.bats b/test/bin_latest_stable.bats new file mode 100644 index 0000000..de5ff83 --- /dev/null +++ b/test/bin_latest_stable.bats @@ -0,0 +1,24 @@ +#!/usr/bin/env bats + +load test_setup + +setup() { + setup_asdf_dir + install_plugin +} + +teardown() { + clean_asdf_dir +} + +@test "asdf latest ${TOOL_NAME}: prints correct version from remote" { + expected=$(curl -sI "$GH_REPO/releases/latest" | + sed -n -e "s|^location: $GH_REPO/releases/tag/||p" | + sed -n -e "s|\r||p" | + sed 's|^v||') + + run asdf latest ${TOOL_NAME} + + [ "$?" -eq 0 ] + [[ "$output" = "$expected" ]] +} diff --git a/test/bin_list_all.bats b/test/bin_list_all.bats new file mode 100644 index 0000000..972ef01 --- /dev/null +++ b/test/bin_list_all.bats @@ -0,0 +1,22 @@ +#!/usr/bin/env bats + +load test_setup + +setup() { + setup_asdf_dir + install_plugin +} + +teardown() { + clean_asdf_dir +} + +@test "asdf list all ${TOOL_NAME}: prints versions from remotes" { + run asdf list all ${TOOL_NAME} + + [ "$?" -eq 0 ] + # check min supported versions are present + [[ "$output" =~ "${MIN_SUPPORTED_VERSION}" ]] + # ensure no versions prefixed with "v" as it should be stripped from GitHub URLs + [[ ! "$output" =~ "v${MIN_SUPPORTED_VERSION}" ]] +} diff --git a/test/test_setup.bash b/test/test_setup.bash new file mode 100644 index 0000000..eb1f955 --- /dev/null +++ b/test/test_setup.bash @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +set +u + +# Sourced script runs: +# * set -euo pipefail +# * sets: TOOL_NAME +# +# shellcheck source=lib/envs.bash +. "$(dirname "$BATS_TEST_DIRNAME")"/lib/envs.bash + +# Unset ASDF_DIR because it may already be set by the users shell, and some +# tests fail when it is set to something other than the temp dir. +unset ASDF_DIR + +setup_asdf_dir() { + if [ -n "${ASDF_BATS_SPACE_IN_PATH:-}" ]; then + BASE_DIR="$(mktemp -dt "asdf with spaces.XXXX")" + else + BASE_DIR="$(mktemp -dt asdf.XXXX)" + fi + HOME="$BASE_DIR/home" + ASDF_DIR="$HOME/.asdf" + mkdir -p "$ASDF_DIR/plugins" + mkdir -p "$ASDF_DIR/installs" + mkdir -p "$ASDF_DIR/shims" + mkdir -p "$ASDF_DIR/tmp" + ASDF_BIN="$(dirname "$BATS_TEST_DIRNAME")/bin" + + # shellcheck disable=SC2031 + PATH="$ASDF_BIN:$ASDF_DIR/shims:$PATH" +} + +install_plugin() { + asdf plugin add "$TOOL_NAME" "$BATS_TEST_DIRNAME/.." +} + +clean_asdf_dir() { + asdf plugin remove "$TOOL_NAME" + + rm -rf "$BASE_DIR" + unset ASDF_DIR + unset ASDF_DATA_DIR +}