diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 5949cf8..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,96 +0,0 @@ -const IndentSpaces = 4; -module.exports = { - parserOptions: { - sourceType: 'script' - , ecmaFeatures: { - impliedStrict: true - } - , ecmaVersion: 2020 - } - , extends: [ 'eslint:recommended', 'plugin:node/recommended' ] - , env: { - node: true - , mocha: true - , es2020: true - } - , rules: { - 'array-bracket-spacing': [ 'error', 'always' ] - , 'arrow-spacing': [ 'error', { 'before': true, 'after': true } ] - , 'block-scoped-var': 'error' - , 'brace-style': [ 'error', 'stroustrup' ] - , 'camelcase': 'error' - , 'comma-spacing': [ 'error', { 'after': true } ] - , 'comma-style': [ 'error', 'first' ] - , 'curly': [ 'warn' ] - , 'default-case': 'error' - , 'dot-location': [ 'error', 'property' ] - , 'dot-notation': [ 'error' ] - , 'eqeqeq': [ 'error', 'smart' ] - , 'func-call-spacing': [ 'error', 'never' ] - , 'handle-callback-err': 'error' - , 'indent': [ 'error', IndentSpaces, { 'MemberExpression': 1, 'ArrayExpression': 1, 'ObjectExpression': 1 } ] - , 'keyword-spacing': [ 'error', { 'overrides': { 'if': { 'after': false }, 'for': { 'after': false }, 'while': { 'after': false } } } ] - , 'line-comment-position': [ 'error', { 'position': 'above' } ] - , 'newline-per-chained-call': [ 'error', { 'ignoreChainWithDepth': 2 } ] - , 'no-alert': [ 'error' ] - , 'no-caller': 'error' - , 'no-console': 'warn' - , 'no-div-regex': 'error' - , 'no-duplicate-imports': [ 'error', { includeExports: true } ] - , 'no-else-return': [ 'error', { allowElseIf: false } ] - , 'no-empty-function': 'error' - , 'no-eq-null': 'error' - , 'no-floating-decimal': 'error' - , 'no-implicit-coercion': [ 'error' ] - , 'no-irregular-whitespace': [ 'error', { skipComments: true } ] - , 'no-lone-blocks': [ 'error' ] - , 'no-lonely-if': 'error' - , 'no-magic-numbers': [ 'error', { ignore: [ 2, 1, 0, -1 ], ignoreArrayIndexes: true } ] - , 'no-multi-spaces': 'error' - , 'no-param-reassign': [ 'error', { props: false } ] - , 'no-path-concat': 'error' - , 'no-return-await': 'error' - , 'no-script-url': 'error' - , 'no-self-compare': [ 'error' ] - , 'no-tabs': 'error' - , 'no-trailing-spaces': 'error' - , 'no-unneeded-ternary': [ 'error' ] - , 'no-unsafe-negation': [ 'error' ] - , 'no-unused-vars': [ 'error', { args: 'all', caughtErrors: 'all' } ] - , 'no-useless-return': 'error' - , 'no-var': 'error' - , 'no-whitespace-before-property': 'error' - , 'object-curly-spacing': [ 'error', 'always' ] - , 'one-var': [ 'error', { var: 'always', let: 'never', const: 'never' } ] - , 'prefer-const': 'error' - , 'prefer-destructuring': [ - 'error' - , { - VariableDeclarator: { - array: false - , object: true, - } - , AssignmentExpression: { - array: true - , object: false, - }, - } - , { - enforceForRenamedProperties: false, - } - , ] - , 'prefer-template': 'error' - , quotes: [ 'error', 'single', { allowTemplateLiterals: true } ] - , semi: [ 'error', 'always', { omitLastInOneLineBlock: true } ] - , 'space-before-blocks': [ 'error', 'always' ] - , 'space-in-parens': [ 'error', 'never' ] - , 'space-infix-ops': [ 'error' ] - , 'space-unary-ops': [ 'error', { words: true, nonwords: false } ] - , 'spaced-comment': [ 'error', 'always' ] - , yoda: 'error' - , 'node/callback-return': 'warn' - , 'node/global-require': 'warn' - , 'node/no-deprecated-api': 'warn' - , 'node/no-unpublished-require': 'off' - } -}; diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 1d9d208..0000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,72 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ master ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ master ] - schedule: - - cron: '32 15 * * 2' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - permissions: - actions: read - contents: read - security-events: write - - strategy: - fail-fast: false - matrix: - language: [ 'javascript' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] - # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support - - steps: - - name: Checkout repository - uses: actions/checkout@v3 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v3 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - - # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs - # queries: security-extended,security-and-quality - - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # â„šī¸ Command-line programs to run using the OS shell. - # 📚 See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun - - # If the Autobuild fails above, remove it and uncomment the following three lines. - # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. - - # - run: | - # echo "Run, Build Application using script" - # ./location_of_script_within_repo/buildscript.sh - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/eslint.yml b/.github/workflows/eslint.yml index eebd26f..d227ff7 100644 --- a/.github/workflows/eslint.yml +++ b/.github/workflows/eslint.yml @@ -1,50 +1,48 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. -# ESLint is a tool for identifying and reporting on patterns -# found in ECMAScript/JavaScript code. -# More details at https://github.com/eslint/eslint -# and https://eslint.org - name: ESLint on: push: branches: ["master"] + pull_request: - # The branches below must be a subset of the branches above branches: ["master"] + schedule: - cron: "40 5 * * 0" jobs: eslint: - name: Run eslint scanning + name: Run ESLint scanning runs-on: ubuntu-latest + permissions: contents: read security-events: write + steps: - name: Checkout code uses: actions/checkout@v4 - - name: Install ESLint - run: | - npm install eslint@8.56.0 - npm install @microsoft/eslint-formatter-sarif@3.0.0 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22.x + cache: npm + + - name: Install dependencies + run: npm ci - name: Run ESLint - run: npx eslint . - --config .eslintrc.js + run: > + npx eslint . + --config .eslint.config.js --quiet - --ext .js,.jsx,.ts,.tsx --format @microsoft/eslint-formatter-sarif --output-file eslint-results.sarif continue-on-error: true - name: Upload analysis results to GitHub - uses: github/codeql-action/upload-sarif@v3 + uses: github/codeql-action/upload-sarif@v4 with: sarif_file: eslint-results.sarif wait-for-processing: true diff --git a/.github/workflows/node.nix.js.yml b/.github/workflows/node.nix.js.yml index 678a83b..b0bff83 100644 --- a/.github/workflows/node.nix.js.yml +++ b/.github/workflows/node.nix.js.yml @@ -12,20 +12,19 @@ on: jobs: build: name: Build and Test - runs-on: ubuntu-latest + runs-on: ubuntu-latest strategy: matrix: - node-version: [20.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - env: - NVM_HOME: "nvm" + node-version: [22.x] steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - run: yarn install --frozen-lockfile - - run: yarn test + + - run: npm ci + + - run: npm run test diff --git a/.github/workflows/node.win.js.yml b/.github/workflows/node.win.js.yml index 1f1e402..d26131d 100644 --- a/.github/workflows/node.win.js.yml +++ b/.github/workflows/node.win.js.yml @@ -12,20 +12,19 @@ on: jobs: build: name: Build and Test Windows - runs-on: windows-latest + runs-on: windows-latest strategy: matrix: - node-version: [20.x] - # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - - env: - NVM_HOME: "nvm" + node-version: [22.x] steps: - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - - run: yarn install --frozen-lockfile - - run: yarn test + + - run: npm ci + + - run: npm run test diff --git a/.mocharc.yml b/.mocharc.yml deleted file mode 100644 index f83b2c1..0000000 --- a/.mocharc.yml +++ /dev/null @@ -1,7 +0,0 @@ -spec: - - "test/*.spec.js" # the positional arguments! -reporter: "spec" -watch-files: - - "src/**/*.js" - - "test/*.spec.js" -timeout: 5000 diff --git a/.yarnrc.yml b/.yarnrc.yml deleted file mode 100644 index add4a76..0000000 --- a/.yarnrc.yml +++ /dev/null @@ -1,7 +0,0 @@ -compressionLevel: mixed - -enableGlobalCache: false - -nodeLinker: node-modules - -yarnPath: .yarn/releases/yarn-4.7.0.cjs diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..ad6b843 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,131 @@ +import js from '@eslint/js'; +import globals from 'globals'; +import pluginN from 'eslint-plugin-n'; + +const IndentSpaces = 4; + +export default [ + js.configs.recommended, + pluginN.configs['flat/recommended-module'], + { + files: [ '**/*.js' ], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + globals: { + ...globals.node + } + }, + rules: { + 'array-bracket-spacing': [ 'error', 'always' ], + 'arrow-spacing': [ 'error', { before: true, after: true } ], + 'block-scoped-var': 'error', + 'brace-style': [ 'error', 'stroustrup' ], + camelcase: 'error', + 'comma-spacing': [ 'error', { after: true } ], + 'comma-style': [ 'error', 'first' ], + curly: 'warn', + 'default-case': 'error', + 'dot-location': [ 'error', 'property' ], + 'dot-notation': 'error', + eqeqeq: [ 'error', 'smart' ], + 'func-call-spacing': [ 'error', 'never' ], + indent: [ + 'error', + IndentSpaces, + { + MemberExpression: 1, + ArrayExpression: 1, + ObjectExpression: 1 + } + ], + 'keyword-spacing': [ + 'error', + { + overrides: { + if: { after: false }, + for: { after: false }, + while: { after: false } + } + } + ], + 'line-comment-position': [ 'error', { position: 'above' } ], + 'newline-per-chained-call': [ 'error', { ignoreChainWithDepth: 2 } ], + 'no-alert': 'error', + 'no-caller': 'error', + 'no-console': 'warn', + 'no-div-regex': 'error', + 'no-duplicate-imports': [ 'error', { includeExports: true } ], + 'no-else-return': [ 'error', { allowElseIf: false } ], + 'no-empty-function': 'error', + 'no-eq-null': 'error', + 'no-floating-decimal': 'error', + 'no-implicit-coercion': 'error', + 'no-irregular-whitespace': [ 'error', { skipComments: true } ], + 'no-lone-blocks': 'error', + 'no-lonely-if': 'error', + 'no-magic-numbers': [ + 'error', + { + ignore: [ 2, 1, 0, -1 ], + ignoreArrayIndexes: true + } + ], + 'no-multi-spaces': 'error', + 'no-param-reassign': [ 'error', { props: false } ], + 'no-trailing-spaces': 'error', + 'no-unneeded-ternary': 'error', + 'no-unsafe-negation': 'error', + 'no-unused-vars': [ + 'error', + { + args: 'all', + caughtErrors: 'all' + } + ], + 'no-useless-return': 'error', + 'no-var': 'error', + 'no-whitespace-before-property': 'error', + 'object-curly-spacing': [ 'error', 'always' ], + 'one-var': [ + 'error', + { + var: 'always', + let: 'never', + const: 'never' + } + ], + 'prefer-const': 'error', + 'prefer-destructuring': [ + 'error', + { + VariableDeclarator: { + array: false, + object: true + }, + AssignmentExpression: { + array: true, + object: false + } + }, + { + enforceForRenamedProperties: false + } + ], + 'prefer-template': 'error', + quotes: [ 'error', 'single', { allowTemplateLiterals: true } ], + semi: [ 'error', 'always', { omitLastInOneLineBlock: true } ], + 'space-before-blocks': [ 'error', 'always' ], + 'space-in-parens': [ 'error', 'never' ], + 'space-infix-ops': 'error', + 'space-unary-ops': [ 'error', { words: true, nonwords: false } ], + 'spaced-comment': [ 'error', 'always' ], + yoda: 'error', + + 'node/callback-return': 'warn', + 'node/global-require': 'warn', + 'node/no-deprecated-api': 'warn', + 'node/no-unpublished-import': 'off' + } + } +]; \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json deleted file mode 100644 index c187174..0000000 --- a/jsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "esnext", - "checkJs": true - }, - "include": [ - "src/**/*.js", - "test/*.spec.js" - ] -} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..4bdf70f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2354 @@ +{ + "name": "my-dev-tools", + "version": "4.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "my-dev-tools", + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "dotenv": "^17.4.2", + "luxon": "^3.7.2", + "semver": "^7.8.5", + "shelljs": "^0.10.0", + "simple-git": "^4.0.2", + "uuid": "11.1.1", + "yargs": "^17.7.3" + }, + "bin": { + "grefplus": "src/grefplus/cli.js" + }, + "devDependencies": { + "@microsoft/eslint-formatter-sarif": "^3.1.0", + "eslint": "^10.11.0", + "eslint-plugin-n": "^18.4.0", + "globals": "^17.12.0", + "mock-fs": "^5.5.0", + "randomatic": "^3.1.1" + }, + "engines": { + "node": "^22.22.0" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.2.0.tgz", + "integrity": "sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.5.0", + "@keyv/bigmap": "^1.3.1", + "hookified": "^1.15.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.5.0.tgz", + "integrity": "sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.5.1", + "keyv": "^5.6.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.4.0", + "hookified": "^1.15.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/@microsoft/eslint-formatter-sarif": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@microsoft/eslint-formatter-sarif/-/eslint-formatter-sarif-3.1.0.tgz", + "integrity": "sha512-/mn4UXziHzGXnKCg+r8HGgPy+w4RzpgdoqFuqaKOqUVBT5x2CygGefIrO4SusaY7t0C4gyIWMNu6YQT6Jw64Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint": "^8.9.0", + "jschardet": "latest", + "lodash": "^4.17.14", + "utf8": "^3.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@microsoft/eslint-formatter-sarif/node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@simple-git/args-pathspec": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@simple-git/args-pathspec/-/args-pathspec-1.0.4.tgz", + "integrity": "sha512-EtMX6XjRWSastG2SdkmSQByPtJ9dx/NIjnHbpQPCYt62j4RmSx5rgLTGpw0YCjF5h191gZOmBfheOT23cRSFdw==", + "license": "MIT" + }, + "node_modules/@simple-git/argv-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@simple-git/argv-parser/-/argv-parser-2.0.1.tgz", + "integrity": "sha512-M++IaVWrN+vYalilOHfwvT2IL3wYZtVEBQpmX6DLSOJLtxbZ+SUeIDE3IiPogzhPACLajwtxfa5rp+ZX1FczzQ==", + "license": "MIT", + "dependencies": { + "@simple-git/args-pathspec": "^1.0.4" + } + }, + "node_modules/@types/esrecurse": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", + "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", + "integrity": "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.2.0", + "@cacheable/utils": "^2.5.0", + "hookified": "^1.15.0", + "keyv": "^5.6.0", + "qified": "^0.10.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dotenv": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.4.2.tgz", + "integrity": "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.25.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.25.1.tgz", + "integrity": "sha512-nGXts5znJzmWPu+mIE9izCOzdg63oJca2mDzGWWTth7sr4aCToKcoyFVBQwN75Ij5Pf6p510EwkTqViTRzDV+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.11.0.tgz", + "integrity": "sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==", + "dev": true, + "license": "MIT", + "workspaces": [ + "packages/*" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.2", + "@eslint/config-array": "^0.23.5", + "@eslint/config-helpers": "^0.7.0", + "@eslint/core": "^1.2.1", + "@eslint/plugin-kit": "^0.7.3", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.14.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^9.1.2", + "eslint-visitor-keys": "^5.0.1", + "espree": "^11.2.0", + "esquery": "^1.7.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "11.1.5 || >11.1.6 <12", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "minimatch": "^10.2.5", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-n": { + "version": "18.4.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-18.4.0.tgz", + "integrity": "sha512-TEm6Nqn9+l7EWfJXOL6pmrEdpiM2ZTgo4fNMRDvBTM70jeQ7x3X3Akcx+sRCIRfpcSVwMypH3ZAA33PLyNKmYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.0", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "globrex": "^0.1.2", + "ignore": "^5.3.2", + "js-yaml": "^5.4.1", + "semver": "^7.6.3" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.57.1", + "ts-declaration-location": "^1.0.6", + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "ts-declaration-location": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "15.15.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.15.0.tgz", + "integrity": "sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-n/node_modules/js-yaml": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-5.4.2.tgz", + "integrity": "sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.mjs" + } + }, + "node_modules/eslint-scope": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz", + "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@types/esrecurse": "^4.3.1", + "@types/estree": "^1.0.8", + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.8" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/espree": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz", + "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.16.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^5.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "license": "MIT", + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.17.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "11.1.5", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.5.tgz", + "integrity": "sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.23" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "6.1.23", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", + "integrity": "sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.5.0", + "flatted": "^3.4.2", + "hookified": "^1.15.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.3.tgz", + "integrity": "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "17.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.12.0.tgz", + "integrity": "sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hashery": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.5.1.tgz", + "integrity": "sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.15.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/hookified": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", + "integrity": "sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jschardet": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jschardet/-/jschardet-4.0.0.tgz", + "integrity": "sha512-EsNiLV+xzeMBtkGL/HeWoUivNkGIr8JmaC5A5j7DBlKnhp4CcBTWKEOtNg6vlmf+mkn9yQ9Wals47u7+LoTr7w==", + "dev": true, + "license": "0BSD", + "bin": { + "jschardet": "build/cli.js" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.6.0.tgz", + "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/luxon": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", + "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/math-random": { + "version": "1.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mock-fs": { + "version": "5.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qified": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.10.1.tgz", + "integrity": "sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^2.1.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/qified/node_modules/hookified": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-2.2.0.tgz", + "integrity": "sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randomatic": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/randomatic/node_modules/is-number": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.10.0", + "license": "BSD-3-Clause", + "dependencies": { + "execa": "^5.1.1", + "fast-glob": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/simple-git": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-4.0.2.tgz", + "integrity": "sha512-l0sIsv9VrPwovKELFDBOj/lhmIcbMvxBk2B+hRhsMM4/VL3gKtuZvYnBNixVo+N/0HnqQx2cBdLvxnAbygHpqA==", + "license": "MIT", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "@simple-git/args-pathspec": "1.0.4", + "@simple-git/argv-parser": "2.0.1", + "debug": "^4.4.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/simple-git/node_modules/debug": { + "version": "4.4.1", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tapable": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", + "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf8": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-3.0.0.tgz", + "integrity": "sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.1.tgz", + "integrity": "sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/esm/bin/uuid" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/y18n": { + "version": "5.0.8", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "17.7.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.3.tgz", + "integrity": "sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json index 1db5853..ba06f11 100644 --- a/package.json +++ b/package.json @@ -5,35 +5,33 @@ "repository": "https://github.com/begin-again/dev-tools.git", "license": "MIT", "private": true, + "type": "module", + "bin": { + "grefplus": "./src/grefplus/cli.js" + }, "scripts": { - "test": "mocha -i --fgrep slow ./test/**/*.spec.js", - "test:slow": "mocha --fgrep slow ./test/**/*.spec.js", + "test": "node --test", "lint:fix": "eslint . --fix" }, "engines": { - "node": "^20.11.0", - "yarn": "^1.22.4" + "node": "^22.22.0" }, "dependencies": { - "dotenv": "^17.3.1", + "dotenv": "^17.4.2", "luxon": "^3.7.2", - "semver": "^7.7.3", + "semver": "^7.8.5", "shelljs": "^0.10.0", - "simple-git": "^3.36.0", + "simple-git": "^4.0.2", "uuid": "11.1.1", - "yargs": "^17.7.2" + "yargs": "^17.7.3" }, "devDependencies": { - "chai": "^4.5.0", - "eslint": "^8.57.0", - "eslint-plugin-node": "^11.1.0", - "mocha": "^10.8.2", + "@microsoft/eslint-formatter-sarif": "^3.1.0", + "eslint": "^10.11.0", + "eslint-plugin-n": "^18.4.0", + "globals": "^17.12.0", "mock-fs": "^5.5.0", - "nyc": "^17.1.0", - "proxyquire": "^2.1.3", - "randomatic": "^3.1.1", - "sinon": "^19.0.4", - "sinon-chai": "^3.7.0" + "randomatic": "^3.1.1" }, - "packageManager": "yarn@4.7.0" + "packageManager": "npm@10.9.9" } diff --git a/src/alias.sh b/src/alias.sh index aec3918..ab80598 100644 --- a/src/alias.sh +++ b/src/alias.sh @@ -11,7 +11,7 @@ alias ll='ls -ltrh' ## tools alias resource='source $HOME/.bashrc' alias clean='node $DEVROOT/dev-tools/src/clean/index.js' -alias grefp='node $DEVROOT/dev-tools/src/grefplus' +alias grefp='node $DEVROOT/dev-tools/src/grefplus/cli.js' alias branches='node $DEVROOT/dev-tools/src/branches' alias nt='node $DEVROOT/dev-tools/src/node-tools' alias yn='node $DEVROOT/dev-tools/src/yarn' diff --git a/src/common/Version.js b/src/common/Version.js new file mode 100644 index 0000000..cd9ea7e --- /dev/null +++ b/src/common/Version.js @@ -0,0 +1,78 @@ +// @ts-check + +import { + accessSync, + constants, + lstatSync +} from 'node:fs'; +import { join } from 'node:path'; + +/** + * Represents an installed Node.js version. + */ +class Version { + + /** + * @param {string} version + * @param {string} path - Root directory of the Node.js installation + * @param {object} [log] + */ + constructor(version, path, log) { + this._path = path; + this._version = version; + + const binPath = process.platform === 'win32' + ? join(this._path, 'node.exe') + : join(this._path, 'bin', 'node'); + + let logMsg = `engine/version: <${this._version}> `; + + try { + accessSync(binPath, constants.X_OK); + + this._bin = binPath; + this._link = lstatSync(this._bin).isSymbolicLink(); + + logMsg += 'is OK'; + } + catch(error) { + logMsg += 'is rejected'; + + if(error.code === 'ENOENT') { + this._error = + `unable to find executable for version ` + + `${this._version} in ${this._path}`; + } + else { + this._error = + `${error.code} : ${error.message}`.trim(); + } + } + + if(log) { + log.debug(logMsg); + } + } + + get error() { + return this._error; + } + + get path() { + return this._path; + } + + get version() { + return this._version; + } + + get bin() { + return this._bin; + } + + get isLink() { + return this._link; + } +} + +export default Version; \ No newline at end of file diff --git a/src/common/engine.js b/src/common/engine.js index 745feb9..256257d 100644 --- a/src/common/engine.js +++ b/src/common/engine.js @@ -1,352 +1,399 @@ /* eslint-disable no-process-env */ /* eslint-disable no-console */ + // @ts-check + /** - * Engine Check - * @module engines + * Utilities for discovering installed Node.js versions and selecting a + * version compatible with a repository's configured Node.js engine. + * + * Supports nvm-windows through NVM_HOME and nvm on Linux/macOS through + * NVM_DIR. + * + * @module engine */ -const semver = require('semver'); -const defaultVersion = '12.13.1'; -const detectedVersion = semver.clean(process.version); -const { join, resolve, basename } = require('node:path'); -const { - readdirSync, - accessSync, - lstatSync, - constants: FSC, -} = require('node:fs'); -const { getPackage } = require('./repos.js'); -const { folderExists } = require('./files'); - -const NumbersPadding = 2; - -class Version { - /** - * @param {String} version - version name - * @param {String} path - path to executables folder - * @param {Object} [log] - logger - * @param {Object} [env] - environment variables - */ - constructor(version, path, log, env) { - const { NVM_HOME } = (env || process.env); - this._path = path; - this._version = version; - - const binName = NVM_HOME ? 'node.exe' : 'node'; - const binPath = join(this._path, binName); - let logMsg = `engine/version: <${this._version}> `; - try { - // executable check doesn't work on windows - accessSync(binPath, FSC.X_OK); - this._bin = binPath; - this._link = lstatSync(this._bin).isSymbolicLink(); - logMsg += `is OK`; - } - catch (e) { - logMsg += `is rejected`; - if(e.code === 'ENOENT') { - this._error = `unable to find executable ${binName} for version ${this._version} in ${this._path}`; - } - else { - this._error = `${e.code} : ${e.message}`.trim(); - } - } - if(log) { - log.debug(logMsg); - } - } +import { readdirSync } from 'node:fs'; +import { basename, join, resolve } from 'node:path'; - /** - * @readonly - * @memberof Version - * @returns {String} - */ - get error() { - return this._error; - } +import semver from 'semver'; - /** - * @readonly - * @memberof Version - * @returns {String} - */ - get path() { - return this._path; - } +import { folderExists } from './files.js'; +import { getPackage } from './repos.js'; +import Version from './Version.js'; - /** - * @readonly - * @memberof Version - * @returns {String} - */ - get version() { - return this._version; - } +const DEFAULT_VERSION = '12.13.1'; +const NUMBERS_PADDING = 2; - /** - * @readonly - * @memberof Version - * @returns {String} - */ - get bin() { - return this._bin; - } +const detectedVersion = semver.clean(process.version); - /** - * @readonly - * @memberof Version - * @returns {Boolean} - */ - get isLink() { - return this._link; - } -} +/** @type {Version[]|null} */ +let versions = null; /** - * Throws if detected version not within require range + * Throws when the current Node.js version does not satisfy the required + * version range. * - * @param {String} [requiredVersionRange] - * @param {Object} [log] - logger.level - * @param {String} [addMsg] - included in log and error message - * @throws Error - * @example engineCheck('>=12.13.1', console.error, 'ERROR: '); + * @param {string} [requiredVersionRange] - Required Node.js semver range. + * @param {Function} [log] - Optional logging function. + * @param {string} [addMsg] - Additional text included in the error message. + * @returns {void} + * @throws {Error} When the current Node.js version is incompatible. + * @example + * engineCheck('>=22.0.0', console.error, 'ERROR:'); */ -const engineCheck = (requiredVersionRange = null, log = null, addMsg = '') => { - const _requiredVersion = requiredVersionRange || defaultVersion; - if(!semver.satisfies(detectedVersion, _requiredVersion)) { - const _msg = addMsg ? `( ${addMsg} ) ` : ''; - const msg = `${_msg}detected version ${detectedVersion} but required ${_requiredVersion}`; - if(log) { - log(msg); - } - throw new Error(`Incompatible NodeJS version: ${msg}`); +const engineCheck = ( + requiredVersionRange = DEFAULT_VERSION, + log = null, + addMsg = '' +) => { + if(semver.satisfies(detectedVersion, requiredVersionRange)) { + return; + } + + const prefix = addMsg + ? `( ${addMsg} ) ` + : ''; + + const msg = + `${prefix}detected version ${detectedVersion} ` + + `but required ${requiredVersionRange}`; + + if(log) { + log(msg); } + + throw new Error(`Incompatible NodeJS version: ${msg}`); }; /** - * converts a version string to number + * Converts a semantic version string into a number suitable for sorting. * - * @param {String} version - * @returns {Number} + * @param {string} version - Node.js version. + * @returns {number} Numeric representation of the version. + * @example + * versionStringToNumber('v22.22.0'); + * // 222200 */ const versionStringToNumber = (version) => { - const _version = version.startsWith('v') ? version.substring(1) : version; - let _expanded = ''; - _version.split('.').forEach((s, i) => { - // eslint-disable-next-line no-magic-numbers - _expanded += i === 0 ? s : s.padStart(NumbersPadding, '0'); - }); - return Number.parseInt(_expanded, 10); + const normalized = version.startsWith('v') + ? version.substring(1) + : version; + + const expanded = normalized + .split('.') + .map((part, index) => + index === 0 + ? part + : part.padStart(NUMBERS_PADDING, '0') + ) + .join(''); + + return Number.parseInt(expanded, 10); }; /** - * Locates first or last version string in versions + * Finds an installed Node.js version matching a full or partial version + * string. + * + * The supplied versions are expected to be sorted newest to oldest. * - * @param {String} v - version number (1.1.1) - * @param {Version[]} versions - objects - * @param {Boolean} oldest - select oldest version - * @returns {Version} + * @param {string} version - Full or partial Node.js version. + * @param {Version[]} installedVersions - Installed Node.js versions. + * @param {boolean} [oldest=false] - Select the oldest matching version. + * @returns {Version|undefined} Matching installed version. */ -const versionStringToObject = (v, versions, oldest = false) => { - const rx = new RegExp(`^v${v}.*?`); - const matchingVersions = versions.filter(({ version }) => rx.test(version)); - // versions array is sorted in version descending order - if(oldest) { - return matchingVersions.at(-1); - } - return matchingVersions[0]; +const versionStringToObject = ( + version, + installedVersions, + oldest = false +) => { + const normalized = version.startsWith('v') + ? version.substring(1) + : version; + + const matchingVersions = installedVersions.filter( + installed => { + const installedVersion = installed.version.startsWith('v') + ? installed.version.substring(1) + : installed.version; + + return installedVersion === normalized || + installedVersion.startsWith(`${normalized}.`); + } + ); + + return oldest + ? matchingVersions.at(-1) + : matchingVersions[0]; }; /** - * Determines which installed versions are compatible with specified range + * Returns installed Node.js versions satisfying a semantic version range. + * + * Versions containing validation errors are excluded. Results are sorted + * newest to oldest. * - * @param {String} requiredVersionRange - * @returns {Version[]} satisfying versions sorted descending + * @param {string} requiredVersionRange - Required semantic version range. + * @param {Version[]} [installedVersions] - Installed Node.js versions. + * @returns {Version[]} Matching versions sorted newest to oldest. */ -const satisfyingVersions = (requiredVersionRange) => { - const _installed = - module.exports.versions || module.exports.properNodeVersions(); - return _installed - .filter( - ({ version, error }) => - !error && semver.satisfies(version, requiredVersionRange) +const satisfyingVersions = ( + requiredVersionRange, + installedVersions = versions || properNodeVersions() +) => + installedVersions + .filter(({ version, error }) => + !error && semver.satisfies(version, requiredVersionRange) ) - .sort( + .toSorted( (a, b) => - module.exports.versionStringToNumber(b.version) - - module.exports.versionStringToNumber(a.version) + versionStringToNumber(b.version) - + versionStringToNumber(a.version) ); + +/** + * Determines the directory containing installed Node.js versions. + * + * nvm-windows stores versions directly beneath NVM_HOME: + * + * NVM_HOME/v22.22.0 + * + * nvm on Linux/macOS stores versions beneath NVM_DIR/versions/node: + * + * NVM_DIR/versions/node/v22.22.0 + * + * @param {NodeJS.ProcessEnv} env - Environment variables. + * @returns {string|null} Node.js version root, or null when nvm is unavailable. + */ +const getNvmRoot = (env) => { + if(process.platform === 'win32') { + return env.NVM_HOME + ? resolve(env.NVM_HOME) + : null; + } + + return env.NVM_DIR + ? resolve(env.NVM_DIR, 'versions', 'node') + : null; }; /** - * Obtains names of installed versions, sorted descending - * populating engines.versions to Version[] - * - NVM_HOME is folder to the version folders - * - NVM_BIN is folder of the node executable, The version name is part of the path. - * @param {Object} [log] - standard logger or console - * @param {{NVM_HOME?:string, NVM_BIN?:string}} [env] - defaults to process.env - * @returns {Version[]} + * Obtains all installed Node.js versions known to nvm. + * + * Versions are returned even when their Node.js executable is missing or + * invalid. Those installations contain an error on the resulting Version + * object and may be filtered with properNodeVersions(). + * + * Results are sorted newest to oldest. + * + * @param {object} [log] - Optional logger. + * @param {NodeJS.ProcessEnv} [env=process.env] - Environment variables. + * @returns {Version[]} Installed Node.js versions. */ -// @ts-ignore -const allInstalledNodeVersions = (log, env) => { - const _env = env || process.env; - const { NVM_BIN, NVM_HOME } = _env; - if(NVM_BIN || NVM_HOME) { - const nodeHome = resolve(NVM_BIN ? join(NVM_BIN, '..', '..') : NVM_HOME); - if(folderExists(nodeHome)) { - // creates an array of Version - return readdirSync(nodeHome, { withFileTypes:true }) - .filter(dirent => dirent.isDirectory()) - .map(dirent => dirent.name) - .sort((a, b) => module.exports.versionStringToNumber(b) - module.exports.versionStringToNumber(a)) - .map(version => { - let path = join(nodeHome, version); - if(NVM_BIN) { - path = join(path, 'bin'); - } - - return new Version(version, path, log); - }); - } +const allInstalledNodeVersions = ( + log, + env = process.env +) => { + const root = getNvmRoot(env); + + if(!root || !folderExists(root)) { return []; } - return []; + + return readdirSync(root, { withFileTypes: true }) + .filter(dirent => dirent.isDirectory()) + .map(dirent => dirent.name) + .filter(version => semver.valid(version)) + .sort( + (a, b) => + versionStringToNumber(b) - + versionStringToNumber(a) + ) + .map(version => + new Version( + version, + join(root, version), + log + ) + ); }; /** - * Filters errors from allInstalledNodeVersions - * - sets module versions property + * Obtains installed Node.js versions having valid executables. + * + * The discovered versions are retained for subsequent version-selection + * operations. * - * @param {Object} [log] - standard logger or console - * @param {object=} fakeNvmHome - * @param {string=} fakeNvmHome.NVM_HOME - * @param {string=} fakeNvmHome.NVM_BIN - * @returns {Version[]} + * @param {object} [log] - Optional logger. + * @param {NodeJS.ProcessEnv} [env=process.env] - Environment variables. + * @returns {Version[]} Valid installed Node.js versions. */ -const properNodeVersions = (log, fakeNvmHome = null) => { - module.exports.versions = module.exports - .allInstalledNodeVersions(log, fakeNvmHome) +const properNodeVersions = ( + log, + env = process.env +) => { + versions = allInstalledNodeVersions(log, env) .filter(({ error }) => !error); - return module.exports.versions; + + return versions; }; /** - * Obtains the latest installed node version which is compatible within a given range + * Obtains the newest installed Node.js version satisfying a semantic + * version range. * - * @param {String} requiredRange - * @returns {Version|undefined} version, path, bin + * @param {string} requiredRange - Required semantic version range. + * @param {Version[]} [installedVersions] - Installed Node.js versions. + * @returns {Version|undefined} Newest matching version. */ -const maxInstalledSatisfyingVersion = (requiredRange) => - module.exports.satisfyingVersions(requiredRange)[0]; +const maxInstalledSatisfyingVersion = ( + requiredRange, + installedVersions = versions || properNodeVersions() +) => + satisfyingVersions( + requiredRange, + installedVersions + )[0]; /** - * Obtains the oldest installed node version which is compatible within a given range + * Obtains the oldest installed Node.js version satisfying a semantic + * version range. * - * @param {String} requiredRange - * @returns {Version|undefined} version, path, bin + * @param {string} requiredRange - Required semantic version range. + * @param {Version[]} [installedVersions] - Installed Node.js versions. + * @returns {Version|undefined} Oldest matching version. */ -const minInstalledSatisfyingVersion = (requiredRange) => { - const version = module.exports.satisfyingVersions(requiredRange); - return version.at(-1); -}; +const minInstalledSatisfyingVersion = ( + requiredRange, + installedVersions = versions || properNodeVersions() +) => + satisfyingVersions( + requiredRange, + installedVersions + ).at(-1); /** - * Obtains node engine range + * Obtains the required Node.js engine range for a repository. * - * @param {String} repoPath - to repository - * @returns {Promise} engines | default engine - * @throws RangeError + * DEFAULT_VERSION is returned when package.json does not specify + * engines.node. + * + * @param {string} repoPath - Repository directory or package.json path. + * @returns {Promise} Required Node.js version range. + * @throws {RangeError} When package.json cannot be found. */ const repositoryEngines = async (repoPath) => { - const file = repoPath.endsWith('package.json') ? repoPath : resolve(join(repoPath, 'package.json')); + const file = repoPath.endsWith('package.json') + ? repoPath + : resolve(repoPath, 'package.json'); + const { error, engines } = await getPackage(file); + if(error) { - throw new RangeError(`package file not found in ${repoPath}`); - } - if(engines?.node) { - return engines.node; + throw new RangeError( + `package file not found in ${repoPath}` + ); } - return defaultVersion; + + return engines?.node || DEFAULT_VERSION; }; /** + * Determines which installed Node.js version should be used. + * + * When a version is explicitly supplied, that version must satisfy the + * repository's configured Node.js engine range. * - * @param {Object} param0 - * @param {String} param0.path - to repository - * @param {String=} param0.version - version number x.y.z - * @param {Boolean=} param0.oldest - choose oldest acceptable version - * @param {Boolean=} noPackage - path does not have package.json - * @returns {Promise} version object with path to executables - * @throws RangeError + * Otherwise, the newest satisfying version is selected unless oldest is + * true. + * + * @param {object} options - Version selection options. + * @param {string} options.path - Repository path. + * @param {string} [options.version] - Requested Node.js version. + * @param {boolean} [options.oldest=false] - Select the oldest match. + * @param {boolean} [noPackage=false] - Treat version as the required range. + * @returns {Promise} Selected installed Node.js version. + * @throws {RangeError} When no compatible installed version exists. */ -const versionToUseValidator = async ({ path, version, oldest }, noPackage) => { - const repoEngines = noPackage ? version : await module.exports.repositoryEngines(path); +const versionToUseValidator = async ( + { path, version, oldest }, + noPackage = false +) => { + const requiredRange = noPackage + ? version + : await repositoryEngines(path); + const repoName = basename(path); + const installedVersions = versions || properNodeVersions(); + + const matchingVersions = satisfyingVersions( + requiredRange, + installedVersions + ); if(version) { - const satisfies = module.exports.satisfyingVersions(repoEngines); - const _version = module.exports.versionStringToObject( + const requested = versionStringToObject( version, - satisfies, + matchingVersions, oldest ); - // _version is undefined if version is not in satisfies - const found = satisfies.find( - (v) => v.version === _version?.version - ); - if(!found) { + + if(!requested) { throw new RangeError( - `${repoName} requires NodeJS version(s) '${repoEngines}' but got '${version}'` + `${repoName} requires NodeJS version(s) ` + + `'${requiredRange}' but got '${version}'` ); } - return found; + return requested; } - if(oldest) { - const _min = module.exports.minInstalledSatisfyingVersion(repoEngines); - if(_min) { - return _min; - } - } + const selected = oldest + ? matchingVersions.at(-1) + : matchingVersions[0]; - const _max = module.exports.maxInstalledSatisfyingVersion(repoEngines); - if(_max) { - return _max; + if(selected) { + return selected; } throw new RangeError( - `${repoName} requires NodeJS version(s) '${repoEngines}' but no satisfying versions installed!` + `${repoName} requires NodeJS version(s) ` + + `'${requiredRange}' but no satisfying versions installed!` ); }; +/** + * Shared yargs options for commands accepting a Node.js version. + * + * @type {object} + */ const versionKeys = { version: { describe: - 'specify an already installed NodeJS version. Check \'nvm ls\' to see availability' - , type: 'string' - , alias: 'v', - } - , oldest: { - describe: 'choose oldest satisfying NodeJS version' - , type: 'boolean' - , default: false - , alias: 'o', + 'specify an already installed NodeJS version. ' + + 'Check \'nvm ls\' to see availability', + type: 'string', + alias: 'v' }, + oldest: { + describe: 'choose oldest satisfying NodeJS version', + type: 'boolean', + default: false, + alias: 'o' + } }; -module.exports = { - allInstalledNodeVersions - , engineCheck - , properNodeVersions - , maxInstalledSatisfyingVersion - , minInstalledSatisfyingVersion - , repositoryEngines - , satisfyingVersions - , versionKeys - , versionStringToObject - , versionStringToNumber - , versionToUseValidator - , Version -}; +export { + allInstalledNodeVersions, + engineCheck, + maxInstalledSatisfyingVersion, + minInstalledSatisfyingVersion, + properNodeVersions, + repositoryEngines, + satisfyingVersions, + versionKeys, + versionStringToNumber, + versionStringToObject, + versionToUseValidator +}; \ No newline at end of file diff --git a/src/common/files.js b/src/common/files.js index f84f148..56fc583 100644 --- a/src/common/files.js +++ b/src/common/files.js @@ -1,12 +1,15 @@ -const { statSync, lstatSync, writeFile } = require('fs'); -const { readFile } = require('fs').promises; -const { join, resolve, parse } = require('path'); +import { statSync, lstatSync, writeFile } from 'node:fs'; +import { readFile } from 'node:fs/promises'; +import { join, resolve, parse, dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); /** * Checks that folder exists and is in fact a folder * - * @param {String} folder - * @returns {Boolean} + * @param {string} folder + * @returns {boolean} */ const folderExists = (folder) => { try { @@ -23,9 +26,9 @@ const folderExists = (folder) => { /** * Checks that file exists and is in fact a file * - * @param {String} file - * @param {Boolean} [isLink] true if symbolicLink - * @returns {Boolean} + * @param {string} file + * @param {boolean} [isLink] true if symbolicLink + * @returns {boolean} */ const fileExists = (file, isLink = false) => { try { @@ -42,8 +45,8 @@ const fileExists = (file, isLink = false) => { /** * Convert base64 to utf8 * - * @param {String} encoded - * @returns {String} + * @param {string} encoded + * @returns {string} */ const decodeBase64 = (encoded) => Buffer.from(encoded, 'base64').toString('utf-8'); @@ -52,10 +55,10 @@ const decodeBase64 = (encoded) => Buffer.from(encoded, 'base64').toString('utf-8 * - path must exist * - file will be created if does not exist * - * @param {String|Buffer} content - * @param {String} dest - * @param {String} [encoding] - * @param {Boolean} [append] + * @param {string|Buffer} content + * @param {string} dest + * @param {string} [encoding] + * @param {boolean} [append] * @returns {Promise} */ const writeToFile = (content, dest, encoding = 'utf8', append = false) => { @@ -74,9 +77,9 @@ const writeToFile = (content, dest, encoding = 'utf8', append = false) => { * Searches from specified path upwards for a file * stops at root * - * @param {String} fileName - name of file - * @param {String} [startPath] - path to start from - * @returns {String|null} null if not found + * @param {string} fileName - name of file + * @param {string} [startPath] - path to start from + * @returns {string|null} null if not found */ const findFirstFile = (fileName, startPath = __dirname) => { @@ -115,11 +118,11 @@ const fileAsJSON = async (file) => { } }; -module.exports = { - decodeBase64 - , fileAsJSON - , fileExists - , folderExists - , writeToFile - , findFirstFile +export { + decodeBase64, + fileAsJSON, + fileExists, + findFirstFile, + folderExists, + writeToFile }; diff --git a/src/common/repos.js b/src/common/repos.js index ee2389f..61495d9 100644 --- a/src/common/repos.js +++ b/src/common/repos.js @@ -1,9 +1,10 @@ /* eslint-disable camelcase */ +import { readFile, readdir } from 'node:fs/promises'; +import { basename, join } from 'node:path'; -const { readFile, readdir } = require('node:fs/promises'); -const { basename, join } = require('node:path'); -const { fileExists, folderExists } = require('./files'); -require('dotenv').config(); +import 'dotenv/config'; + +import { fileExists, folderExists } from './files.js'; // eslint-disable-next-line no-process-env const { DEVROOT } = process.env; @@ -92,8 +93,8 @@ const getBinaryPaths = (builderName, repoPath, devRoot = DEVROOT) => { } }; -module.exports = { - allRepoPaths - , getBinaryPaths - , getPackage -}; +export { + allRepoPaths, + getBinaryPaths, + getPackage +}; \ No newline at end of file diff --git a/src/common/temp.js b/src/common/temp.js index 188c75a..dcef84c 100644 --- a/src/common/temp.js +++ b/src/common/temp.js @@ -1,80 +1,74 @@ -const { realpathSync, mkdirSync, rmSync } = require('node:fs'); -const { tmpdir } = require('os'); -const { basename, dirname, join } = require('node:path'); -const { v4: uuid } = require('uuid'); +import { + mkdirSync, + realpathSync, + rmSync +} from 'node:fs'; +import { tmpdir } from 'node:os'; +import { + basename, + dirname, + join +} from 'node:path'; +import { v4 as uuid } from 'uuid'; let baseFolder; let num = 1; -/** - * Abbreviates the path - * - * @param {} fullPath - */ const shortPath = (fullPath) => - fullPath ? `${basename(dirname(fullPath))}/${basename(fullPath)}` : `Empty`; + fullPath + ? `${basename(dirname(fullPath))}/${basename(fullPath)}` + : 'Empty'; - -/** - * Create the new folder - * - * @param {String} pathName - * @returns path to folder - * @throws on error - */ const createFolder = (pathName) => { try { mkdirSync(pathName, { recursive: true }); + return pathName; } - catch (error) { - throw new Error(`createFolder threw trying to create:\n ${shortPath(pathName)} \n ${error.message}`); + catch(error) { + throw new Error( + `createFolder threw trying to create:\n ${shortPath(pathName)} \n ${error.message}` + ); } }; -/** - * Creates temp folders inside of a common parent. - * - * @returns {String} full path to temp folder - * @throws base folder not defined yet - */ const createTempFolder = () => { - const base = module.exports.baseFolder; - if(base) { - const folderPath = join(base, `${num}`); - num += 1; - return createFolder(folderPath); + if(!baseFolder) { + throw new Error('base folder not defined yet'); } - throw new Error(`base folder not defined yet`); + + const folderPath = join(baseFolder, `${num}`); + + num += 1; + + return createFolder(folderPath); }; -/** - * created new base directory within temp folder space - * only if base not already set - */ const initBase = () => { - if(!module.exports.baseFolder) { + if(!baseFolder) { const temp = realpathSync(tmpdir()); - const name = uuid(); - const newBase = createFolder(join(temp, name)); - module.exports.baseFolder = newBase; + + baseFolder = createFolder(join(temp, uuid())); } - return module.exports.baseFolder; + + return baseFolder; }; -/** - * removes base folder - */ const destroy = () => { - if(module.exports.baseFolder) { - rmSync(module.exports.baseFolder, { recursive: true }); - delete module.exports.baseFolder; + if(baseFolder) { + rmSync(baseFolder, { + recursive: true, + force: true + }); + + baseFolder = undefined; + num = 1; } }; -module.exports = { - baseFolder - , createTempFolder - , destroy - , initBase -}; +export { + baseFolder, + createTempFolder, + destroy, + initBase +}; \ No newline at end of file diff --git a/src/grefplus/cli.js b/src/grefplus/cli.js new file mode 100644 index 0000000..c796362 --- /dev/null +++ b/src/grefplus/cli.js @@ -0,0 +1,8 @@ +import {main} from './index.js'; +try { + await main(); +} +catch (error) { + console.error(error); + process.exitCode = 1; +} \ No newline at end of file diff --git a/src/grefplus/cmdline.js b/src/grefplus/cmdline.js index ca41e33..8f2204a 100644 --- a/src/grefplus/cmdline.js +++ b/src/grefplus/cmdline.js @@ -1,52 +1,60 @@ -const { accessSync, constants, lstatSync } = require('fs'); -const yargs = require('yargs'); -const { DateTime } = require('luxon'); +import { + accessSync, + constants, + lstatSync +} from 'node:fs'; + +import { DateTime } from 'luxon'; +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; const options = { - dateOptions: 'yyyy-MM-dd hh:mm:ss a' - , allowedFormat: 'M/d/yy' - , offset: 3 - , timePad: 12 + dateOptions: 'yyyy-MM-dd hh:mm:ss a', + allowedFormat: 'M/d/yy', + offset: 3, + timePad: 12 }; const cmdKeys = { 'folder-names': { - alias: 'n' - , describe: 'space separated names of repository folders' - , type: 'string' - , array: true - } - , 'from-date': { - alias: 'f' - , describe: `Show refs later than and include this date, '${options.allowedFormat}'` - , type: 'string' - , requiresArg: true - } - , 'to-date': { - alias: 't' - , describe: `Show refs earlier than and including this date, , '${options.allowedFormat}'` - , type: 'string' - , requiresArg: true - } - , 'dev-root': { - alias: 'r' - , describe: 'root folder of development environment (/c/blah/blah). Default is DEVROOT' - , type: 'array' + alias: 'n', + describe: 'space separated names of repository folders', + type: 'string', + array: true + }, + 'from-date': { + alias: 'f', + describe: `Show refs later than and include this date, '${options.allowedFormat}'`, + type: 'string', + requiresArg: true + }, + 'to-date': { + alias: 't', + describe: `Show refs earlier than and including this date, '${options.allowedFormat}'`, + type: 'string', + requiresArg: true + }, + 'dev-root': { + alias: 'r', + describe: 'root folder of development environment (/c/blah/blah). Default is DEVROOT', + type: 'array', // eslint-disable-next-line no-process-env - , default: process.env.DEVROOT - } - , 'date': { - alias: 'd' - , describe: `shortcut to specify a single date, , '${options.allowedFormat}'. Default is today` - , type: 'string' - , requiresArgs: true + default: process.env.DEVROOT + }, + date: { + alias: 'd', + describe: `shortcut to specify a single date, '${options.allowedFormat}'. Default is today`, + type: 'string', + requiresArg: true } }; /** - * Validates from and to dates, + * Validates from and to dates * * @param {String} checkDate + * @param {String} msg + * @returns {Boolean} * @throws if date is not valid * @private */ @@ -69,52 +77,53 @@ const validateDate = (checkDate, msg) => { /** * Aborts build if dev root path does not exist * - * @param {String} devRoot + * @param {object} params + * @param {String[]} params.devRoot + * @returns {Boolean} * @throws if path not accessible * @private */ const validatePath = ({ devRoot }) => { - let problematicRoot = null; - - devRoot.forEach(root => { - try { - accessSync(root, constants.R_OK); - if(!lstatSync(root).isDirectory()) { - problematicRoot = root; - } - } - catch (error) { - problematicRoot = { root, error }; - } - }); + if(!devRoot) { + throw new Error( + 'Development root is required. Use --dev-root or set DEVROOT.' + ); + } - if(problematicRoot) { - throw new Error(`Unable to access specified dev root folder of '${problematicRoot.root}'. Due to ${problematicRoot.error.message}`); + try { + accessSync(devRoot); + } + catch(error) { + throw new Error( + `Unable to access specified dev root folder of '${devRoot}'. ` + + `Due to ${error.message}` + ); } - return true; + return true; }; /** * Determines if a date is in the future + * * @param {String} checkDate * @returns {Boolean} * @throws if checkDate is not valid date * @private */ const isFuture = (checkDate) => { - const _date = DateTime.fromFormat(checkDate, options.allowedFormat); + const date = DateTime.fromFormat(checkDate, options.allowedFormat); const endOfToday = DateTime.now().endOf('day'); - return _date > endOfToday; + return date > endOfToday; }; /** * Parse command line and configures options * - * @param {Boolean} test - used for testing only + * @param {object|Boolean} test - used for testing only */ const setOptions = (test) => { - const argv = test || yargs + const argv = test || yargs(hideBin(process.argv)) .options(cmdKeys) .version(false) .help(true) @@ -122,18 +131,18 @@ const setOptions = (test) => { .check((_argv) => { // super secret shortcut if(!_argv.date && !_argv.fromDate && !_argv.toDate && Number.isInteger(_argv._[0])) { - const _date = DateTime + const date = DateTime .fromFormat(_argv._[0], options.allowedFormat) .plus({ days: _argv._[0] }) - .format('MM/DD/YY'); - _argv.date = _date; + .toFormat('MM/dd/yy'); + _argv.date = date; } else { - if(Object.keys(_argv).includes('date') && !_argv.date) { - _argv.date = DateTime.now().toFormat('MM/DD/YY'); + if(Object.hasOwn(_argv, 'date') && !_argv.date) { + _argv.date = DateTime.now().toFormat('MM/dd/yy'); } if(_argv.date && (_argv.fromDate || _argv.toDate)) { - throw new Error('--date cannot be used with "--from-date" or "--to_date"'); + throw new Error('--date cannot be used with "--from-date" or "--to-date"'); } } return true; @@ -169,22 +178,27 @@ const setOptions = (test) => { return true; }) .check(validatePath) - .argv; + .parse(); if(argv.date) { const date = DateTime.fromFormat(argv.date, options.allowedFormat); - module.exports.options.fromDate = date.startOf('day'); - module.exports.options.toDate = date.endOf('day'); + options.fromDate = date.startOf('day'); + options.toDate = date.endOf('day'); } else { - module.exports.options.fromDate = argv.fromDate ? DateTime.fromFormat(argv.fromDate, options.allowedFormat).startOf('day') : null; - module.exports.options.toDate = argv.toDate ? DateTime.fromFormat(argv.toDate, options.allowedFormat).endOf('day') : null; + options.fromDate = argv.fromDate + ? DateTime.fromFormat(argv.fromDate, options.allowedFormat).startOf('day') + : null; + options.toDate = argv.toDate + ? DateTime.fromFormat(argv.toDate, options.allowedFormat).endOf('day') + : null; } - module.exports.options.devRoot = argv.devRoot; - module.exports.options.folderNames = argv.folderNames || []; + + options.devRoot = argv.devRoot; + options.folderNames = argv.folderNames || []; }; -module.exports = { - options - , setOptions +export { + options, + setOptions }; diff --git a/src/grefplus/index.js b/src/grefplus/index.js index 869ccb0..ab4ab95 100644 --- a/src/grefplus/index.js +++ b/src/grefplus/index.js @@ -1,35 +1,22 @@ -/* eslint no-console:off */ -require('./cmdline').setOptions(); -const { basename } = require('node:path'); -const { allRepoPaths } = require('../common/repos'); -const { promisify } = require('node:util'); -const _exec = promisify(require('node:child_process').exec); -const { DateTime } = require('luxon'); -const { options } = require('./cmdline'); -const DateLength = 6; +import { basename } from 'node:path'; -/** - * Creates command string - * @param {String} repo - repository base name - * @return {String} - * @NOTE git will walk up the parents looking for a repository - * @private - */ -const gitCommand = (repo) => { - return `git --no-pager -C ${repo} log --walk-reflogs --format="%gd %h %d %gs +++" --date=format:"%Y-%m-%d %H:%M:%S %p=="`; -}; +import { DateTime } from 'luxon'; +import { simpleGit } from 'simple-git'; + +import { allRepoPaths } from '../common/repos.js'; +import { options, setOptions } from './cmdline.js'; + +const DateLength = 6; /** - * determines if item falls within range + * Determines if item falls within range * * @param {object} item - * @param {DateTime | undefined} item.fromDate - * @param {DateTime | undefined} item.toDate + * @param {DateTime | undefined} item.date * @returns {boolean} * @private - * */ -const filterPeriod = (item) => { +export function filterPeriod(item) { let result; if(!options.fromDate && !options.toDate) { result = true; @@ -48,45 +35,70 @@ const filterPeriod = (item) => { /** * Obtains the git reflogs result - * @param {string} repo - full path to a repository - * @param {{repo:string, error:string}[]} errors - place to store skippable errors - * @return {Promise<{date: DateTime, body: string, repo: string}[]>} objects containing date, body, and the repository base name + * + * @param {string} repo - full path to a repository + * @param {{repo:string, error:string}[]} errors - place to store skippable errors + * @returns {Promise<{date: DateTime, body: string, repo: string}[]>} */ -async function processRepo(repo, errors) { +export async function processRepo(repo, errors, gitFactory = simpleGit) { try { - const cmd = gitCommand(repo); - const { stdout } = await _exec(cmd, { encoding:'utf8' }); + const git = gitFactory({ + baseDir: repo + }); + + const stdout = await git.raw([ + 'log', + '--walk-reflogs', + '--format=%gd %h %d %gs +++', + '--date=format:%Y-%m-%d %H:%M:%S %p==' + ]); + const lines = []; const repoName = basename(repo); + for(const item of stdout.trim().split(' +++')) { - const _item = item.trim(); - if(_item.length === 0) { + const current = item.trim(); + if(current.length === 0) { continue; } - const markerIndex = _item.indexOf('=='); - const date = DateTime.fromFormat(_item.substring(DateLength, markerIndex), options.dateOptions); + const markerIndex = current.indexOf('=='); + const date = DateTime.fromFormat( + current.substring(DateLength, markerIndex), + options.dateOptions + ); + if(!filterPeriod({ date })) { continue; } - const body = _item.substring(markerIndex + options.offset); - lines.push({ date, body, repo: repoName }); + const body = current.substring(markerIndex + options.offset); + + lines.push({ + date, + body, + repo: repoName + }); } + return lines; } catch (err) { - errors.push({ repo, error: err ? err.message : 'Unknown error' }); - // continue to next repo but be sure to return empty array + errors.push({ + repo, + error: err ? err.message : 'Unknown error' + }); + return []; } } /** - * writes errors to console if in debug mode - * @param {Array} errors - collection of error objects - * @param {Boolean} isDebug - command line flag - * @param {*} err - catch all error not otherwise specified + * Writes errors to console if in debug mode + * + * @param {Array} errors - collection of error objects + * @param {Boolean} isDebug - command line flag + * @param {*} err - catch all error not otherwise specified */ const logErrors = (errors, isDebug, err) => { if(isDebug > 0 && errors.length > 0) { @@ -95,6 +107,7 @@ const logErrors = (errors, isDebug, err) => { console.error(`${i + 1}. ${item.repo}: ${item.error.trim()}`); }); } + if(err) { console.error(`Misc error: ${err}`); } @@ -103,16 +116,13 @@ const logErrors = (errors, isDebug, err) => { /** * Entry point */ -async function main() { - if(options.devRoot.length === 0) { - console.log(`bash variable DEVROOT is required`); - process.exitCode = 1; - return; - } +export async function main() { + setOptions(); const errors = []; let maxRepoLength = 0; const repos = []; + for(const root of options.devRoot) { const paths = await allRepoPaths(root, options.folderNames); repos.push(...paths); @@ -121,18 +131,23 @@ async function main() { try { const result = []; const concurrency = 8; + for(let i = 0; i < repos.length; i += concurrency) { const batch = repos .slice(i, i + concurrency) .map(repo => processRepo(repo, errors)); + result.push(...await Promise.all(batch)); } + const sorted = result .flat() .sort((a, b) => a.date.valueOf() - b.date.valueOf()); + sorted.forEach(item => { maxRepoLength = Math.max(maxRepoLength, item.repo.length); }); + sorted.forEach(item => { console.log(`${item.date.toFormat(options.dateOptions)} ${item.repo.padEnd(maxRepoLength)} ${item.body}`); }); @@ -140,7 +155,4 @@ async function main() { catch (err) { logErrors(errors, options.debug, err); } - } - -main().catch(console.error); diff --git a/src/node-tools/clean.js b/src/node-tools/clean.js index 9096b28..2abab44 100644 --- a/src/node-tools/clean.js +++ b/src/node-tools/clean.js @@ -1,49 +1,63 @@ /** - * remove-links.js - * scans node versions locating node.exe files which are symbolic links and removes them - * will print removed links to stdout -*/ + * Removes symbolic links used as Node.js executables. + * + * @module clean + */ -const { basename } = require('path'); -const { unlinkSync } = require('fs'); +import { unlinkSync } from 'node:fs'; +import { basename } from 'node:path'; -const maxWidth = 9; +const MAX_WIDTH = 9; /** - * Remove node.exe symbolic links + * Removes Node.js executables that are symbolic links. + * + * When execute is false, reports the links that would be removed without + * modifying the filesystem. * - * @param {Object} param0 - * @param {Array} param0.installed - * @param {Boolean} param0.dryRun - * @param {Object} [log] logger + * @param {object} options - Clean options. + * @param {import('../common/version.js').default[]} options.installed - + * Installed Node.js versions. + * @param {boolean} options.execute - Remove links when true. + * @param {object} [log=console] - Logger. + * @returns {number} Exit code. Zero indicates success. */ -const clean = ({ installed, dryRun }, log = console) => { +const clean = ( + { installed, execute }, + log = console +) => { let exitCode = 0; - installed - .filter(({ isLink }) => isLink) - .forEach(({ version, bin }) => { - const linkName = basename(bin); - let msg = ` - ${version.padEnd(maxWidth, ' ')} - `; - if(dryRun) { - msg += `will delete ${linkName}`; - log.debug(msg); - } - else { - try { - unlinkSync(bin); - msg += `deleted symbolic link ${bin}`; - log.debug(msg); - } - // eslint-disable-next-line no-unused-vars - catch (e) { - msg += `Unable to delete ${bin}, due to ${e.message}`; - log.error(msg); - exitCode = 1; - } - } - }); + const links = installed.filter(({ isLink }) => isLink); + + for(const { version, bin } of links) { + const linkName = basename(bin); + + let msg = ` - ${version.padEnd(MAX_WIDTH, ' ')} - `; + + if(!execute) { + msg += `will delete ${linkName}`; + log.debug(msg); + + continue; + } + + try { + unlinkSync(bin); + + msg += `deleted symbolic link ${bin}`; + log.debug(msg); + } + catch(error) { + msg += + `Unable to delete ${bin}, due to ${error.message}`; + + log.error(msg); + exitCode = 1; + } + } + return exitCode; }; -module.exports = clean; +export default clean; \ No newline at end of file diff --git a/src/node-tools/fix.js b/src/node-tools/fix.js index 917662c..b1da2fc 100644 --- a/src/node-tools/fix.js +++ b/src/node-tools/fix.js @@ -1,74 +1,123 @@ -const { copyFileSync, readdirSync, symlinkSync } = require('node:fs'); -const { resolve, join } = require('node:path'); -const osType = require('node:os').type(); -const targetName = osType === 'Windows_NT' ? 'node.exe' : 'node'; +import { + copyFileSync, + readdirSync, + symlinkSync +} from 'node:fs'; +import { join } from 'node:path'; + +const isWindows = process.platform === 'win32'; /** - * Obtains the executable file found in path + * Obtains a potential Node.js executable from an installation. + * + * On Windows, nvm installations may contain a versioned executable that + * can be copied or linked to node.exe. * - * @param {String} path - to the node version folder + * @param {string} path - Node.js installation root. + * @returns {string|undefined} Executable filename. */ const execFileFound = (path) => { - const files = readdirSync(path) - .filter(file => file.endsWith('.exe')) - .sort((a, b) => b.localeCompare(a)); - return files[0]; + if(!isWindows) { + return undefined; + } + + return readdirSync(path) + .filter(file => + file.endsWith('.exe') && + file.toLowerCase() !== 'node.exe' + ) + .toSorted((a, b) => b.localeCompare(a))[0]; }; /** - * Attempts to correct unusable version installations + * Attempts to correct unusable Node.js version installations. * - * @param {Object} param0 - * @param {Array} param0.installed - installed versions - * @param {Boolean} param0.dryRun - show action only - * @param {String} param0.mode - create symbolic link or copy - * @param {Object} [log] logger + * @param {object} options + * @param {import('../common/Version.js').default[]} options.installed + * @param {boolean} options.execute - Apply changes when true. + * @param {'copy'|'link'} options.mode - Repair method. + * @param {object} [log] - Logger. + * @returns {number} Exit code. */ -const fix = ({ installed, execute, mode }, log = console) => { +const fix = ( + { installed, execute, mode }, + log = console +) => { let exitCode = 0; - const errors = installed - .filter(({ error }) => error); - - if(errors.length) { - errors.forEach(({ version, path }) => { - const execFile = execFileFound(path); - if(!execute) { - if(mode === 'copy') { - log.debug(`${version}: will copy '${execFile}' to '${targetName}'`); - } - else if(mode === 'link') { - log.debug(`${version}: will create symbolic link from '${targetName}' to '${execFile}'`); - } + + const errors = installed.filter(({ error }) => error); + + if(!errors.length) { + log.debug('No Errors to fix'); + + return exitCode; + } + + for(const { version, path } of errors) { + const execFile = execFileFound(path); + + if(!execFile) { + log.error( + `${version}: unable to find an executable to repair` + ); + + exitCode = 1; + + continue; + } + + const targetName = 'node.exe'; + + if(!execute) { + if(mode === 'copy') { + log.debug( + `${version}: will copy '${execFile}' ` + + `to '${targetName}'` + ); } else if(mode === 'link') { - try { - const src = resolve(path, execFile); - const target = resolve(path, targetName); - symlinkSync(src, target); - log.debug(`${version}: created symbolic link from '${targetName}' to '${execFile}'`); - } - catch (e) { - log.error(`${version}: was unable to link ''${targetName}' to '${execFile}'. Error code is ${e.code}`); - exitCode = 1; - } + log.debug( + `${version}: will create symbolic link from ` + + `'${targetName}' to '${execFile}'` + ); + } + + continue; + } + + const src = join(path, execFile); + const target = join(path, targetName); + + try { + if(mode === 'link') { + symlinkSync(src, target); + + log.debug( + `${version}: created symbolic link from ` + + `'${targetName}' to '${execFile}'` + ); } else if(mode === 'copy') { - try { - copyFileSync(join(path, execFile), join(path, targetName)); - log.debug(`${version}: copied '${execFile}' to '${targetName}'`); - } - catch (e) { - log.error(`${version}: was unable to copy '${execFile}' to '${targetName}'. Error code is ${e.code}`); - exitCode = 1; - } + copyFileSync(src, target); + + log.debug( + `${version}: copied '${execFile}' ` + + `to '${targetName}'` + ); } - }); - } - else { - log.debug('No Errors to fix'); + } + catch(error) { + log.error( + `${version}: was unable to ${mode} ` + + `'${execFile}' to '${targetName}'. ` + + `Error code is ${error.code}` + ); + + exitCode = 1; + } } + return exitCode; }; - -module.exports = fix; +export default fix; \ No newline at end of file diff --git a/src/node-tools/index.js b/src/node-tools/index.js index c790575..d6be259 100644 --- a/src/node-tools/index.js +++ b/src/node-tools/index.js @@ -1,102 +1,115 @@ -const osType = require('os').type(); -const yargs = require('yargs'); -const { allInstalledNodeVersions, versionKeys } = require('../common/engine.js'); -const report = require('./report'); -const fix = require('./fix.js'); -const clean = require('./clean.js'); -const remove = require('./remove.js'); +import yargs from 'yargs'; +import { hideBin } from 'yargs/helpers'; -process.on('uncaughtException', (e) => { - process.stdout.write(`${e.message}\n`); - process.exitCode = 1; -}); +import { + allInstalledNodeVersions, + versionKeys +} from '../common/engine.js'; + +import clean from './clean.js'; +import fix from './fix.js'; +import remove from './remove.js'; +import report from './report.js'; /** - * Tool only runs on windows for now. + * Adds the installed Node.js versions to the parsed arguments. * + * @param {object} argv - Parsed command arguments. * @returns {boolean} */ -const validateWindows = () => { - if(osType !== 'Windows_NT') { - throw new Error('This tools only works on MS Windows'); - } +const addInstalledVersions = (argv) => { + argv.installed = allInstalledNodeVersions(); + return true; }; -yargs +/** + * Normalizes the fix mode. + * + * @param {object} argv - Parsed command arguments. + * @returns {boolean} + */ +const normalizeFixMode = (argv) => { + argv.mode = [ 'l', 'link' ].includes(argv.mode) + ? 'link' + : 'copy'; + + return true; +}; + +process.on('uncaughtException', function(error) { + process.stdout.write(`${error.message}\n`); + process.exitCode = 1; +}); + +yargs(hideBin(process.argv)) .command({ - command: [ '$0', 'report' ] - , desc: 'Report on found executables' - , builder: _yargs => { - return _yargs - .check((argv) => { - argv.installed = allInstalledNodeVersions(); - return true; - }); - } - , handler: report + command: [ '$0', 'report' ], + desc: 'Report on found Node.js installations', + builder: _yargs => + _yargs.check(addInstalledVersions), + handler: report }) .command({ - command: 'fix' - , description: 'fix errors found by report' - , builder: _yargs => { - return _yargs - .option('execute', { alias: 'x', describe: 'do the removal instead of just showing', type: 'boolean', default: false }) - .option('mode', { alias: 'm', describe: 'fix with a symbolic link', type: 'string', choices: [ 'l', 'link', 'c', 'copy' ], default: 'copy' }) - .check(validateWindows) - .check((argv) => { - switch (argv.mode) { - case 'l': - case 'link': - argv.mode = 'link'; - break; - case 'c': - case 'copy': - default: - argv.mode = 'copy'; - break; - } - return true; + command: 'fix', + desc: 'Attempt to fix unusable Node.js installations', + builder: _yargs => + _yargs + .option('execute', { + alias: 'x', + describe: 'perform the fix instead of just showing it', + type: 'boolean', + default: false + }) + .option('mode', { + alias: 'm', + describe: 'fix using a symbolic link or copy', + type: 'string', + choices: [ + 'l', + 'link', + 'c', + 'copy' + ], + default: 'copy' }) - .check((argv) => { - argv.installed = allInstalledNodeVersions(); - return true; - }); - } - , handler: fix + .check(normalizeFixMode) + .check(addInstalledVersions), + handler: fix }) .command({ - command: 'clean' - , desc: 'remove symlinks created by an earlier version of dev-tools' - , builder: _yargs => { - return _yargs - .option('dry-run', { alias: 'x', describe: 'show what will be fixed', type: 'boolean', default: false }) - .check(validateWindows) - .check((argv) => { - argv.installed = allInstalledNodeVersions(); - return true; - }); - } - , handler: clean + command: 'clean', + desc: 'remove Node.js executable symbolic links', + builder: _yargs => + _yargs + .option('execute', { + alias: 'x', + describe: 'perform the removal instead of just showing it', + type: 'boolean', + default: false + }) + .check(addInstalledVersions), + handler: clean }) .command({ - command: 'remove' - , desc: 'uninstall a node version if installed' - , builder: _yargs => { - return _yargs - .option('execute', { alias: 'x', describe: 'actually perform the removal', type: 'boolean', default: false }) - .option('version', { ...versionKeys.version, required: true }) - .check(validateWindows) - .check((argv) => { - argv.installed = allInstalledNodeVersions(); - return true; - }); - } - , handler: remove - }); - -// Main entry -yargs.help(true) + command: 'remove', + desc: 'uninstall an installed Node.js version', + builder: _yargs => + _yargs + .option('execute', { + alias: 'x', + describe: 'perform the removal instead of just showing it', + type: 'boolean', + default: false + }) + .option('version', { + ...versionKeys.version, + required: true + }) + .check(addInstalledVersions), + handler: remove + }) + .help() .version(false) - .strict(true) - .parse(); + .strict() + .parse(); \ No newline at end of file diff --git a/src/node-tools/remove.js b/src/node-tools/remove.js index c34368b..445cd3f 100644 --- a/src/node-tools/remove.js +++ b/src/node-tools/remove.js @@ -1,61 +1,68 @@ +// @ts-check /** * remove.js - * Removes node versions -*/ - -const fsPromises = require('fs').promises; -const semver = require('semver'); -/** - * compatibility check for rm & rmdir - * @returns {Function} + * Removes installed Node.js versions. */ -const rmCompatibility = () => { - if(fsPromises.rm) { - return fsPromises.rm; - } - return fsPromises.rmdir; -}; -const remover = rmCompatibility(); +import { rm } from 'node:fs/promises'; + +import semver from 'semver'; /** - * Removes node versions matching specified range + * Removes Node.js versions matching the specified range. * - * @param {Object} param0 - * @param {array} param0.installed - * @param {string} param0.version - version number or range - * @param {boolean} param0.execute - true to remove files + * @param {object} options + * @param {import('../common/Version.js').default[]} options.installed + * @param {string} options.version - Version number or semver range + * @param {boolean} options.execute - True to remove files * @param {object} [log] logger * @returns {Promise} exit code */ -const remove = async ({ installed, version, execute }, log = console) => { - const messagePrefix = execute ? 'Removed' : 'Would remove'; +const remove = async ( + { installed, version, execute }, + log = console +) => { + const messagePrefix = execute + ? 'Removed' + : 'Would remove'; + const validRange = semver.validRange(version); - let exitCode = 0; - const versionsToRemove = installed.filter(v => semver.satisfies(v.version.slice(1), validRange)); - if(versionsToRemove.length > 0) { + if(!validRange) { + log.debug(`Invalid version range: ${version}`); + + return 1; + } + + const versionsToRemove = installed.filter( + installedVersion => + semver.satisfies(installedVersion.version, validRange) + ); + + if(!versionsToRemove.length) { + log.debug( + `No matches found for ${version} in range ${validRange}` + ); + + return 1; + } + + for(const installedVersion of versionsToRemove) { if(execute) { - await Promise.all( - versionsToRemove.map(async v => { - await remover(v.path, { recursive: true }); - log.debug(`${messagePrefix} ${v.version} at ${v.path}`); - }) - ); - } - else { - versionsToRemove.forEach(v => { - log.debug(`${messagePrefix} ${v.version} at ${v.path}`); + await rm(installedVersion.path, { + recursive: true, + force: true }); } - } - else { - log.debug(`No matches found for ${version} in range ${validRange}`); - exitCode = 1; + + log.debug( + `${messagePrefix} ${installedVersion.version} ` + + `at ${installedVersion.path}` + ); } - return exitCode; + return 0; }; -module.exports = remove; +export default remove; \ No newline at end of file diff --git a/src/node-tools/report.js b/src/node-tools/report.js index 0fa341b..88c6659 100644 --- a/src/node-tools/report.js +++ b/src/node-tools/report.js @@ -1,47 +1,39 @@ +const MAX_WIDTH = 9; /** - * report.js - * Locates node versions and reports the node binary files present, including symbolic links -*/ - -const osType = require('os').type(); -const binName = osType === 'Windows_NT' ? 'node.exe' : 'node'; -// eslint-disable-next-line no-process-env -const { NVM_HOME } = process.env; - -/** - * Scans versions and reports status + * Reports the status of installed Node.js versions. * - * @param {Object} param0 - * @param {Array} param0.installed - * @param {Object} [log] logger + * @param {object} options + * @param {import('../common/Version.js').default[]} options.installed - + * Installed Node.js versions. + * @param {object} [log=console] - Logger. + * @returns {number} Exit code. Zero indicates no installation errors. */ -const report = ({ installed }, log = console) => { - let errorCount = 0; +const report = ( + { installed }, + log = console +) => { + let exitCode = 0; + + for(const { version, error, isLink } of installed) { + let msg = ` - ${version.padEnd(MAX_WIDTH, ' ')} - `; - installed.forEach(({ version, error, isLink }) => { - const maxWidth = 9; - let msg = ` - ${version.padEnd(maxWidth, ' ')} - `; if(error) { - errorCount += 1; - msg += `Problem: '${binName}' not found or executable`; + msg += `Problem: ${error}`; + exitCode = 1; } else { - msg += `OK ${isLink ? '(link)' : ''}`; + msg += isLink + ? 'OK (link)' + : 'OK '; } - log.debug(`${msg}`); - }); - - if(errorCount) { - const checkPath = NVM_HOME ? 'll $NVM_HOME/' : 'll $NVM_BIN/../../'; - log.debug(` - ${errorCount} errors - take a look at running '${checkPath}' for each problem version - might be as simple as running 'nt fix'. - `); + log.debug(msg); } + log.debug(''); + + return exitCode; }; -module.exports = report; +export default report; \ No newline at end of file diff --git a/src/yarn/index.js b/src/yarn/index.js deleted file mode 100644 index c1a9ce2..0000000 --- a/src/yarn/index.js +++ /dev/null @@ -1,89 +0,0 @@ - -const { spawn } = require('node:child_process'); -require('../common/engine').properNodeVersions(); -const { - versionStringToObject - , versionToUseValidator - , versions -} = require('../common/engine'); -const yargs = require('yargs'); - -/** - * - * @param {String} command - * @param {String} pathToActOn - * @param {String} pathToNodeBinary - * @param {Array} yarnArgs - */ -const spawner = (command, pathToActOn, pathToNodeBinary, ...yarnArgs) => { - const opts = { - cwd: pathToActOn - // eslint-disable-next-line no-process-env - , env: { ...process.env, PATH: `${pathToNodeBinary};${process.env.PATH}` } - , encoding:'utf8' - , shell: true - , stdio: [ process.stdin, process.stdout, process.stderr ] - }; - const child = spawn(command, yarnArgs, opts); - child.on('close', code => { - process.exitCode = code; - }); -}; - -let versionToUse; - - -yargs - .command([ '$0' ], 'run yarn without changing node version', - _yargs => { - return _yargs - .usage('Usage: yn -c -p [path] -v [version] -- [yarn options]') - .options('command', { - describe: 'yarn command to run.' - , type: 'string' - , default: 'install' - , alias: 'c' - }) - .option('path', { - describe: 'path to act on' - , type: 'string' - , default: process.cwd() - , alias: 'p' - }) - .option('version', { - describe: 'specify an already installed NodeJS version. Check \'nvm ls\' to see availability' - , type: 'string' - , alias: 'v' - }) - .option('oldest', { - describe: 'choose oldest satisfying NodeJS version' - , type: 'boolean' - , default: false - , alias: 'o' - }) - .check(({ version }) => { - if(version) { - const _version = versionStringToObject(version, versions); - if(!_version) { - throw new RangeError(`The specified version '${version}' is not installed`); - } - } - return true; - }) - .check(async ({ version, path, oldest }) => { - versionToUse = await versionToUseValidator({ path, version, oldest }); - return Boolean(versionToUse); - }); - }, - (argv) => { - const _len = argv._.length ? `: ${argv._}` : ``; - // eslint-disable-next-line no-console - console.log(`launching yarn '${argv.command}' with version '${versionToUse.version}' in path '${argv.path}' ${_len}`); - return spawner('yarn', argv.path, versionToUse.path, argv.command, ...argv._); - }); - -yargs.help(true) - .version(false) - .strict(true) - .wrap(yargs.terminalWidth()) - .parse(); diff --git a/test/clean.spec.js b/test/clean.spec.js deleted file mode 100644 index eb3826f..0000000 --- a/test/clean.spec.js +++ /dev/null @@ -1,127 +0,0 @@ -/* eslint-disable no-magic-numbers */ -const chai = require('chai'); -const { expect } = chai; -const sinon = require('sinon'); -chai.use(require('sinon-chai')); - -const fs = require('node:fs'); -const mockFS = require('mock-fs'); -const logger = console; -const { DateTime } = require('luxon'); - -const { removeTarget, folderList, removeSonarTemp } = require('../src/clean/clean.js'); - - -const fake = { - '.sonarlinttmp_1': {} - , 'xyz':'' - , '123': {} - , '456': '' -}; - -describe('Cleaner Module', () => { - describe('folderList()', function() { - it('should be an array of folders', async function() { - mockFS(fake); - - const result = await folderList(/.*/, '.'); - - expect(result).an('array').with.lengthOf(2); - mockFS.restore(); - }); - it('should be an empty array', async function() { - mockFS(fake); - - const result = await folderList(/bogus/, '.'); - - expect(result).an('array').with.lengthOf(0); - }); - }); - describe('removeTarget()', function() { - beforeEach(() => { - logger.warn = sinon.spy(); - logger.info = sinon.spy(); - logger.debug = sinon.spy(); - }); - it('should remove 1 folder and log', async function() { - mockFS({ - 'folder1': {} - , 'file1':'' - , 'folder2': {} - , 'file2': '' - }); - let list = fs.readdirSync('.'); - expect(list).includes('folder1'); - expect(list).includes('folder2'); - expect(list).includes('file1'); - expect(list).includes('file2'); - - await removeTarget('Fake', /^folder2$/m, '.'); - list = fs.readdirSync('.'); - - expect(list).includes('folder1'); - expect(list).not.includes('folder2'); - expect(list).includes('file1'); - expect(list).includes('file2'); - - expect(logger.warn).calledOnceWith('attempting to delete 1 folders - please be patient'); - expect(logger.info).callCount(2); - mockFS.restore(); - - }); - it('should log warning when no matching folders found', async function() { - mockFS({}); - - await removeTarget('Fake', /^xyz$/m, '.'); - - expect(logger.warn).to.calledOnceWith(`no suitable folders found`); - mockFS.restore(); - }); - }); - describe('removeSonarTemp', function() { - afterEach(mockFS.restore); - const logStub = { debug: sinon.stub(), info: sinon.stub(), error: sinon.stub() }; - const rootPath = '.'; - const now = DateTime.now(); - - it('should remove no folders', async function() { - mockFS({ - 'sonarlinttmp_1': mockFS.directory({ - // @ts-ignore - ctime: now.minus({ day: 1 }).startOf('day') - }) - , 'sonarlinttmp_2': mockFS.directory({ - // @ts-ignore - ctime: now.minus({ day: 2 }).startOf('day') - }) - }); - - const result = await removeSonarTemp({ root: rootPath, age: 3 }, logStub); - - const folders = fs.readdirSync(rootPath, { withFileTypes: true }).filter(d => d.isDirectory()); - - - expect(result).equal(0); - expect(folders).to.have.lengthOf(2); - - }); - it('should remove 1 folders', async function() { - mockFS({ - 'sonarlinttmp_1': mockFS.directory({ - // @ts-ignore - ctime: now.minus({ day: 1 }).startOf('day') - }) - , 'xodus-local-only': mockFS.directory({ - // @ts-ignore - ctime: now.minus({ day: 2 }).startOf('day') - }) - }); - - const result = await removeSonarTemp({ root: rootPath, age: 2 }, logStub); - - const folders = fs.readdirSync(rootPath, { withFileTypes: true }).filter(d => d.isDirectory()); - - expect(result).equal(folders.length); - }); - }); -}); diff --git a/test/engine.spec.js b/test/engine.spec.js deleted file mode 100644 index c8bd259..0000000 --- a/test/engine.spec.js +++ /dev/null @@ -1,712 +0,0 @@ -const chai = require('chai'); -const { expect } = chai; -const sinon = require('sinon'); -chai.use(require('sinon-chai')); -const mockFS = require('mock-fs'); -const { sep } = require('node:path'); -const { platform } = require('node:os'); -const isWindows = platform() === 'win32'; -const proxyquire = require('proxyquire').noCallThru(); - -const removeVersions = (engine) => { - if(engine.versions) { - delete engine.versions; - } -}; - -const engine = require('../src/common/engine'); - -describe('Engine Module', function() { - let logSpy; - beforeEach(function() { - logSpy = sinon.stub(); - }); - afterEach(sinon.restore); - describe('engineCheck()', function() { - it('should not throw when compatible', function() { - const satisfyFake = sinon.fake.returns(true); - const cleanFake = sinon.fake.returns('6.5.1'); - const { engineCheck } = proxyquire('../src/common/engine', { - 'semver': { satisfies: satisfyFake, clean: cleanFake } - }); - - engineCheck('^6.5.0', null); - expect(logSpy).not.called; - expect(cleanFake).calledOnce; - expect(satisfyFake).calledOnce; - }); - it('should throw on incompatible engines', function() { - const expected = 'Incompatible NodeJS version: detected version 6.5.0 but required ~6.1.0'; - const satisfyFake = sinon.fake.returns(false); - const cleanFake = sinon.fake.returns('6.5.0'); - const { engineCheck } = proxyquire('../src/common/engine', { - 'semver': { satisfies: satisfyFake, clean: cleanFake } - }); - - const wrapper = () => engineCheck('~6.1.0', null); - - expect(wrapper).to.throw(expected); - expect(logSpy).not.called; - expect(cleanFake).calledOnce; - expect(satisfyFake).calledOnce; - }); - it('should write to log', function() { - const expected = 'Incompatible NodeJS version: detected version 6.5.0 but required ~6.1.0'; - const satisfyFake = sinon.fake.returns(false); - const cleanFake = sinon.fake.returns('6.5.0'); - const { engineCheck } = proxyquire('../src/common/engine', { - 'semver': { satisfies: satisfyFake, clean: cleanFake } - }); - - const wrapper = () => engineCheck('~6.1.0', logSpy); - - expect(wrapper).to.throw(expected); - expect(logSpy).calledOnce; - expect(cleanFake).calledOnce; - expect(satisfyFake).calledOnce; - }); - it('should write to log with additional message', function() { - const expectedMsg = '( target ) detected version 6.5.0 but required ~6.1.0'; - const expected = `Incompatible NodeJS version: ${expectedMsg}`; - const satisfyFake = sinon.fake.returns(false); - const cleanFake = sinon.fake.returns('6.5.0'); - const { engineCheck } = proxyquire('../src/common/engine', { - 'semver': { satisfies: satisfyFake, clean: cleanFake } - }); - - const wrapper = () => engineCheck('~6.1.0', logSpy, 'target'); - - expect(wrapper).to.throw(expected); - expect(logSpy).calledOnceWith(expectedMsg); - expect(cleanFake).calledOnce; - expect(satisfyFake).calledOnce; - }); - }); - describe('satisfyingVersions()', function() { - beforeEach(removeVersions.bind(null, engine)); - it('should be empty array when nothing satisfies', function() { - const stub = sinon.stub(engine, 'properNodeVersions'); - engine.versions = [ { version: 'v10.12.13' } ]; - - const result = engine.satisfyingVersions('12.11.0'); - - expect(result).to.be.an('array').lengthOf(0); - - expect(stub).not.called; - stub.reset(); - }); - it('should be empty array when nothing satisfies due to an error', function() { - const stub = sinon.stub(engine, 'properNodeVersions'); - engine.versions = [ { version: 'v10.12.13', error: 'for shame' } ]; - const result = engine.satisfyingVersions('12.11.0'); - - expect(result).to.be.an('array').lengthOf(0); - - expect(stub).not.called; - stub.reset(); - }); - it('should be empty array when nothing satisfies due to an error', function() { - const installedNodeVersionsStub = sinon.stub(engine, 'properNodeVersions'); - engine.versions = [ { version: 'v10.12.13', error: 'for shame' } ]; - const result = engine.satisfyingVersions('12.11.0'); - - expect(result).to.be.an('array').lengthOf(0); - - expect(installedNodeVersionsStub).not.called; - installedNodeVersionsStub.reset(); - }); - it('should find 2 matches sorted desc', function() { - const stub = sinon.stub(engine, 'properNodeVersions'); - engine.versions = [ - { version: 'v10.12.13' } - , { version: 'v12.12.13' } - , { version: 'v12.19.0' } - ]; - const result = engine.satisfyingVersions('^12.0.0'); - - expect(result).to.be.an('array').lengthOf(2); - expect(result[0].version).to.equal('v12.19.0'); - expect(result[1].version).to.equal('v12.12.13'); - - expect(stub).not.called; - stub.reset(); - }); - it('should find 2 matches sorted desc via default', function() { - engine.versions = [ - { version: 'v10.12.13' } - , { version: 'v12.12.13' } - , { version: 'v12.19.0' } - ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - - const result = engine.satisfyingVersions('^12.0.0'); - - expect(result).to.be.an('array').lengthOf(2); - expect(result[0].version).to.equal('v12.19.0'); - expect(result[1].version).to.equal('v12.12.13'); - - expect(stub).not.called; - stub.reset(); - }); - it('should find 2 matches sorted desc via default when engines.versions not defined', function() { - const versions = [ - { version: 'v10.12.13' } - , { version: 'v12.12.13' } - , { version: 'v12.19.0' } - ]; - const stub = sinon.stub(engine, 'properNodeVersions').returns(versions); - expect(engine.versions).to.be.undefined; - - const result = engine.satisfyingVersions('^12.0.0'); - - expect(stub).calledOnce; - expect(result).to.be.an('array').lengthOf(2); - expect(result[0].version).to.equal('v12.19.0'); - expect(result[1].version).to.equal('v12.12.13'); - - stub.reset(); - }); - it('should work with major versions', function() { - const versions = [ - { version: 'v10.12.13' } - , { version: 'v12.12.13' } - , { version: 'v12.19.0' } - ]; - const stub = sinon.stub(engine, 'properNodeVersions').returns(versions); - expect(engine.versions).to.be.undefined; - - const result = engine.satisfyingVersions('^12'); - - expect(stub).calledOnce; - expect(result).to.be.an('array').lengthOf(2); - expect(result[0].version).to.equal('v12.19.0'); - expect(result[1].version).to.equal('v12.12.13'); - - }); - }); - describe('node version managers', function() { - const env = {}; - beforeEach(function() { - delete env.NVM_HOME; - delete env.NVM_BIN; - if(engine.versions) { - delete engine.versions; - } - mockFS({ - afile: 'hello' - , nvm: { - 'v8.11.1':{ - 'node64.exe': '' - , node56: {} - } - , 'v0.0.1':{ - 'node64.exe': '' - , 'node.exe': '' - , node56: {} - } - , 'v2.10.22':{ - 'node.exe': '' - , node56: {} - } - , 'v10.23.0':{ - 'node64.exe': '' - , node56: {} - , node: {} - } - , 'v99.99.99':'' - } - , '.nvm': { - versions: { - node: { - 'v10.03.0':{ - bin: { - node64: '' - , node: '' - , node56: {} - } - } - , 'v0.0.1':{ - bin: { - node64: '' - , node: mockFS.file({ - content: '' - , mode: 0o666 - }) - , node56: {} - } - } - , 'v2.10.11':{ - bin: { - node64: '' - , node: mockFS.file({ - content: '' - , mode: 0o755 - }) - , node56: {} - } - } - , 'v12.0.0':{ - bin: { - node: '' - , node64: '' - , node56: {} - } - } - , 'v10.14.0':{ - bin: { - node64: '' - , node56: {} - } - } - , 'v99.99.99':'' - } - } - } - }); - }); - afterEach(mockFS.restore); - - describe('allInstalledNodeVersions()', function() { - it('should be empty if not env', function() { - const result = engine.allInstalledNodeVersions(null, {}); - - expect(result).to.be.an('array').lengthOf(0); - }); - it('should be empty if nvm home is not a folder', function() { - env.NVM_HOME = 'afile'; - const result = engine.allInstalledNodeVersions(null, env); - - expect(result).to.be.an('array').lengthOf(0); - }); - it('should find 4 versions in nvm', function() { - env.NVM_HOME = 'nvm'; - const result = engine.allInstalledNodeVersions(null, env); - - expect(result).to.be.an('array'); - for(const version of result) { - expect(version).to.have.property('version'); - expect(version).to.have.property('path'); - } - const [ v1, v2, v3, v4, v5 ] = result; - expect(v1.version).to.equal('v10.23.0'); - expect(v2.version).to.equal('v8.11.1'); - expect(v3.version).to.equal('v2.10.22'); - expect(v4.version).to.equal('v0.0.1'); - expect(v5).to.be.undefined; - - }); - }); - describe('properNodeVersions()', function() { - it('should be empty when no env vars present', function() { - expect(engine.versions).to.be.undefined; - const result = engine.properNodeVersions(null, env); - - expect(result).to.be.an('array').lengthOf(0); - expect(engine.versions).to.be.an('array').lengthOf(0); - }); - describe('NVM for Windows', function() { - it('should have length of 2', function() { - if(!isWindows) { - return this.skip(); - } - env.NVM_HOME = 'nvm'; - expect(engine.versions).to.be.undefined; - - const result = engine.properNodeVersions(null, env); - - expect(result).to.be.an('array').lengthOf(2); - expect(result[0].version).to.equal('v2.10.22'); - expect(result[1].version).to.equal('v0.0.1'); - expect(engine.versions).lengthOf(2); - }); - it('should have path to binary on windows', function() { - if(!isWindows) { - return this.skip(); - } - env.NVM_HOME = 'nvm'; - const { bin, path } = engine.properNodeVersions(null, env)[0]; - - expect(bin).to.equal(`${path}${sep}node.exe`); - }); - it('should have path to binary when not named \'node\'', function() { - if(!isWindows) { - return this.skip(); - } - env.NVM_HOME = 'nvm'; - const { bin, path } = engine.properNodeVersions(null, env)[1]; - - expect(bin).to.equal(`${path}${sep}node.exe`); - }); - }); - }); - }); - describe('maxInstalledSatisfyingVersion()', function() { - beforeEach(removeVersions.bind(null, engine)); - it('should be undefined when not satisfied', function() { - engine.versions = [ { version: 'v12.0.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - expect(stub.wrappedMethod).not.to.be.undefined; - - const result = engine.maxInstalledSatisfyingVersion('^8.11.1'); - - expect(result).to.be.undefined; - expect(stub).not.called; - stub.reset(); - }); - it('should be versions', function() { - engine.versions = [ { version: 'v12.0.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - expect(stub.wrappedMethod).not.to.be.undefined; - - const { version } = engine.maxInstalledSatisfyingVersion('^12.0.0'); - - expect(version).to.equal(engine.versions[0].version); - expect(stub).not.called; - stub.reset(); - }); - it('should be versions largest matching version', function() { - engine.versions = [ { version: 'v12.19.0' }, { version: 'v12.0.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - - const { version } = engine.maxInstalledSatisfyingVersion('^12.0.0'); - - expect(version).to.equal(engine.versions[0].version); - expect(stub.wrappedMethod).not.to.be.undefined; - stub.reset(); - }); - }); - describe('minInstalledSatisfyingVersion()', function() { - beforeEach(removeVersions.bind(null, engine)); - it('should be undefined when not satisfied', function() { - engine.versions = [ { version: 'v12.0.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - expect(stub.wrappedMethod).not.to.be.undefined; - - const result = engine.minInstalledSatisfyingVersion('^8.11.1'); - - expect(result).to.be.undefined; - expect(stub).not.called; - stub.reset(); - }); - it('should be versions', function() { - engine.versions = [ { version: 'v12.0.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - expect(stub.wrappedMethod).not.to.be.undefined; - - const { version } = engine.minInstalledSatisfyingVersion('^12.0.0'); - - expect(version).to.equal(engine.versions[0].version); - expect(stub).not.called; - stub.reset(); - }); - it('should be versions oldest matching version', function() { - engine.versions = [ { version: 'v12.19.0' }, { version: 'v8.0.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - - const { version } = engine.minInstalledSatisfyingVersion('^12.0.0 || ^8.0.0'); - - expect(version).to.equal(engine.versions[1].version); - expect(stub.wrappedMethod).not.to.be.undefined; - stub.reset(); - }); - it('should allow matching on major versions', function() { - engine.versions = [ { version: 'v12.19.0' }, { version: 'v8.0.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - - const { version } = engine.minInstalledSatisfyingVersion('^12'); - - expect(version).to.equal(engine.versions[0].version); - expect(stub.wrappedMethod).not.to.be.undefined; - stub.reset(); - }); - it('should pick 16.12.0 -- issue 116', function() { - engine.versions = [ { version: 'v16.13.0' }, { version: 'v16.12.0' } ]; - const stub = sinon.stub(engine, 'properNodeVersions'); - - const { version } = engine.minInstalledSatisfyingVersion('^16'); - - expect(version).to.equal(engine.versions[1].version); - expect(stub.wrappedMethod).not.to.be.undefined; - stub.reset(); - }); - }); - describe('repositoryEngines()', function() { - afterEach(mockFS.restore); - it('should reject with RangeError when package not found', async function() { - const getPackage = sinon.stub().resolves({ error: new Error('missing') }); - const { repositoryEngines } = proxyquire('../src/common/engine', { - './repos.js': { getPackage } - }); - - try { - await repositoryEngines('missing'); - expect.fail('expected repositoryEngines() to reject'); - } - catch (error) { - expect(error).to.be.instanceOf(RangeError); - expect(error.message).to.equal('package file not found in missing'); - } - - expect(getPackage).to.have.been.calledOnce; - }); - - it('should return node engine when engines.node exists', async function() { - const getPackage = sinon.stub().resolves({ - engines: { node: '8.11.1' } - }); - const { repositoryEngines } = proxyquire('../src/common/engine', { - './repos.js': { getPackage } - }); - - const result = await repositoryEngines('myRepo'); - - expect(result).to.equal('8.11.1'); - expect(getPackage).to.have.been.calledOnce; - }); - - it('should return default when there is not a node property', async function() { - const getPackage = sinon.stub().resolves({ - engines: { yarn: '^1.22.4' } - }); - const { repositoryEngines } = proxyquire('../src/common/engine', { - './repos.js': { getPackage } - }); - - const result = await repositoryEngines('myRepo'); - - expect(result).to.equal('12.13.1'); - expect(getPackage).to.have.been.calledOnce; - }); - - it('should return default when engines is missing', async function() { - const getPackage = sinon.stub().resolves({}); - const { repositoryEngines } = proxyquire('../src/common/engine', { - './repos.js': { getPackage } - }); - - const result = await repositoryEngines('myRepo'); - - expect(result).to.equal('12.13.1'); - expect(getPackage).to.have.been.calledOnce; - }); - - it('should use package.json path as-is', async function() { - const getPackage = sinon.stub().resolves({ - engines: { node: '^18.0.0' } - }); - const { repositoryEngines } = proxyquire('../src/common/engine', { - './repos.js': { getPackage } - }); - const packagePath = `myRepo${sep}package.json`; - - const result = await repositoryEngines(packagePath); - - expect(result).to.equal('^18.0.0'); - expect(getPackage).to.have.been.calledOnceWithExactly(packagePath); - }); - }); - describe('versionToUseValidator()', function() { - let satisfyingVersions; let maxInstalledSatisfyingVersion; let versionStringToObject; - let minInstalledSatisfyingVersion; - beforeEach(function() { - sinon.stub(engine, 'properNodeVersions'); - }); - describe('user specified version', function() { - beforeEach(function() { - versionStringToObject = sinon.stub(engine, 'versionStringToObject'); - satisfyingVersions = sinon.stub(engine, 'satisfyingVersions'); - }); - it('should throw when specified version is not compatible with target repository', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^8.11.1 || ^10.13.0 || ^12.13.0'); - - const satVersions = []; - satisfyingVersions.callsFake(() => satVersions); - versionStringToObject.callsFake(() => ({ version: '' })); - const expectedMessage = 'requires NodeJS version(s) \'^8.11.1 || ^10.13.0 || ^12.13.0\' but got \'14.1.1\''; - const path = ''; - const version = '14.1.1'; - - try { - await engine.versionToUseValidator({ path, version }); - expect.fail('expected to throw'); - } - catch (error) { - expect(error).to.be.instanceOf(RangeError); - expect(error.message).to.include(expectedMessage); - } - }); - it('should be v12.13.1', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^8.11.1 || ^10.13.0 || ^12.13.0'); - - const satVersions = [ { version: 'v12.13.1' }, { version: 'v12.19.1' }, { version: 'v8.11.1' } ]; - satisfyingVersions.callsFake(() => satVersions); - versionStringToObject.callsFake(() => ({ version: 'v12.13.1' })); - const expectedVersion = 'v12.13.1'; - const path = ''; - const version = '12.13.1'; - - const result = await engine.versionToUseValidator({ path, version }); - - expect(result.version).to.equal(expectedVersion); - }); - it('should pick 16.13.0 -- issue 116', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^12.13.0 || ^14.15.0 || ^16.13.0'); - const satVersions = [ { version: 'v16.13.0' }, { version: 'v16.12.0' }, { version: 'v14.18.1' } ]; - satisfyingVersions.callsFake(() => satVersions); - versionStringToObject.callsFake(() => ({ version: 'v16.13.0' })); - const path = ''; - const version = '16.13.0'; - - const result = await engine.versionToUseValidator({ path, version }); - - expect(result.version).to.equal('v16.13.0'); - }); - it('should pick oldest when oldest is true', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^12.13.0 || ^14.15.0 || ^16.13.0'); - const satVersions = [ { version: 'v16.13.0' }, { version: 'v16.12.0' }, { version: 'v14.18.1' } ]; - satisfyingVersions.callsFake(() => satVersions); - versionStringToObject.callsFake(() => ({ version: 'v14.18.1' })); - const path = ''; - const version = '14.18.1'; - const oldest = true; - - const result = await engine.versionToUseValidator({ path, version, oldest }); - - expect(result.version).to.equal('v14.18.1'); - }); - }); - describe('default', function() { - beforeEach(function() { - maxInstalledSatisfyingVersion = sinon.stub(engine, 'maxInstalledSatisfyingVersion'); - minInstalledSatisfyingVersion = sinon.stub(engine, 'minInstalledSatisfyingVersion'); - }); - it('should throw when version not specified and no installed versions satisfy', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^8.11.1 || ^10.13.0 || ^12.13.0'); - maxInstalledSatisfyingVersion.callsFake(() => undefined); - const expectedMessage = 'repo requires NodeJS version(s) \'^8.11.1 || ^10.13.0 || ^12.13.0\' but no satisfying versions installed!'; - const path = 'projects/repo'; - - try { - await engine.versionToUseValidator({ path }); - expect.fail('expected to throw'); - } - catch (error) { - expect(error).to.be.instanceOf(RangeError); - expect(error.message).to.equal(expectedMessage); - } - }); - it('should be 12.11.1 when oldest not specified', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^8.11.1 || ^10.13.0 || ^12.13.0'); - maxInstalledSatisfyingVersion.callsFake(() => ({ version: 'v12.11.1' })); - const path = 'projects/repo'; - - const result = await engine.versionToUseValidator({ path }); - - expect(result.version).to.equal('v12.11.1'); - }); - it('should be 12.11.1 when oldest is true', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^8.11.1 || ^10.13.0 || ^12.13.0'); - minInstalledSatisfyingVersion.callsFake(() => ({ version: 'v12.11.1' })); - const path = 'projects/repo'; - const oldest = true; - - const result = await engine.versionToUseValidator({ path, oldest }); - - expect(result.version).to.equal('v12.11.1'); - }); - it('should use max when oldest is false and min is not needed', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^8.11.1 || ^10.13.0 || ^12.13.0'); - maxInstalledSatisfyingVersion.callsFake(() => ({ version: 'v12.19.1' })); - const path = 'projects/repo'; - const oldest = false; - - const result = await engine.versionToUseValidator({ path, oldest }); - - expect(result.version).to.equal('v12.19.1'); - expect(minInstalledSatisfyingVersion).not.called; - }); - it('should throw when oldest is true and no satisfying versions installed', async function() { - sinon.stub(engine, 'repositoryEngines').resolves('^8.11.1 || ^10.13.0 || ^12.13.0'); - minInstalledSatisfyingVersion.callsFake(() => undefined); - maxInstalledSatisfyingVersion.callsFake(() => undefined); - const path = 'projects/repo'; - const oldest = true; - - try { - await engine.versionToUseValidator({ path, oldest }); - expect.fail('expected to throw'); - } - catch (error) { - expect(error).to.be.instanceOf(RangeError); - expect(error.message).to.include('but no satisfying versions installed!'); - } - }); - }); - }); - describe('versionStringToObject()', function() { - // versions array is sorted in version descending order - const versions = [ - { version: 'v2.3.0' } - , { version: 'v2.2.1' } - , { version: 'v2.2.0' } - , { version: 'v2.0.0' } - , { version: 'v1.1.1' } - ]; - describe('default', function() { - it('should find full versions', function() { - const versionExpected = 'v2.3.0'; - - const { version } = engine.versionStringToObject('2.3.0', versions); - - expect(version).to.equal(versionExpected); - }); - it('should find major versions', function() { - const versionExpected = 'v2.3.0'; - - const { version } = engine.versionStringToObject('2', versions); - - expect(version).to.equal(versionExpected); - }); - it('should find major.minor versions', function() { - const versionExpected = 'v2.2.1'; - - const { version } = engine.versionStringToObject('2.2', versions); - - expect(version).to.equal(versionExpected); - }); - it('should be undefined when not found', function() { - const result = engine.versionStringToObject('1.2.0', versions); - - expect(result).to.be.undefined; - }); - }); - describe('oldest is true', function() { - it('should find full versions', function() { - const versionExpected = 'v2.3.0'; - - const { version } = engine.versionStringToObject('2.3.0', versions, true); - - expect(version).to.equal(versionExpected); - }); - it('should find major versions', function() { - const versionExpected = 'v2.0.0'; - - const { version } = engine.versionStringToObject('2', versions, true); - - expect(version).to.equal(versionExpected); - }); - it('should find major.minor versions', function() { - const versionExpected = 'v2.2.0'; - - const { version } = engine.versionStringToObject('2.2', versions, true); - - expect(version).to.equal(versionExpected); - }); - it('should be undefined when not found', function() { - const result = engine.versionStringToObject('1.2.0', versions, true); - - expect(result).to.be.undefined; - }); - }); - }); -}); diff --git a/test/engine.test.js b/test/engine.test.js new file mode 100644 index 0000000..5b07880 --- /dev/null +++ b/test/engine.test.js @@ -0,0 +1,729 @@ +import assert from 'node:assert/strict'; +import { + chmodSync, + mkdirSync, + writeFileSync +} from 'node:fs'; +import { join } from 'node:path'; +import { + afterEach, + beforeEach, + describe, + it, + mock +} from 'node:test'; + +import { + allInstalledNodeVersions, + engineCheck, + maxInstalledSatisfyingVersion, + minInstalledSatisfyingVersion, + properNodeVersions, + satisfyingVersions, + versionStringToNumber, + versionStringToObject +} from '../src/common/engine.js'; + +import * as temp from '../src/common/temp.js'; + +describe('Engine Module', function() { + + describe('engineCheck()', function() { + + it('should not throw when compatible', function() { + assert.doesNotThrow(function() { + engineCheck(process.version); + }); + }); + + it('should throw on incompatible engines', function() { + assert.throws( + function() { + engineCheck('<0.0.1'); + }, + { + name: 'Error', + message: /Incompatible NodeJS version/ + } + ); + }); + + it('should write to log', function() { + const log = mock.fn(); + + assert.throws( + function() { + engineCheck('<0.0.1', log); + }, + /Incompatible NodeJS version/ + ); + + assert.equal(log.mock.callCount(), 1); + }); + + it('should write to log with additional message', function() { + const log = mock.fn(); + + assert.throws( + function() { + engineCheck('<0.0.1', log, 'target'); + }, + /Incompatible NodeJS version/ + ); + + assert.equal(log.mock.callCount(), 1); + assert.match( + log.mock.calls[0].arguments[0], + /^\( target \) detected version/ + ); + }); + }); + + describe('satisfyingVersions()', function() { + + it('should be empty when nothing satisfies', function() { + const versions = [ + { version: 'v10.12.13' } + ]; + + const result = satisfyingVersions( + '12.11.0', + versions + ); + + assert.deepEqual(result, []); + }); + + it('should exclude versions with errors', function() { + const versions = [ + { + version: 'v12.11.0', + error: 'for shame' + } + ]; + + const result = satisfyingVersions( + '12.11.0', + versions + ); + + assert.deepEqual(result, []); + }); + + it('should find matches sorted descending', function() { + const versions = [ + { version: 'v10.12.13' }, + { version: 'v12.12.13' }, + { version: 'v12.19.0' } + ]; + + const result = satisfyingVersions( + '^12.0.0', + versions + ); + + assert.deepEqual( + result.map(({ version }) => version), + [ + 'v12.19.0', + 'v12.12.13' + ] + ); + }); + + it('should work with major versions', function() { + const versions = [ + { version: 'v10.12.13' }, + { version: 'v12.12.13' }, + { version: 'v12.19.0' } + ]; + + const result = satisfyingVersions( + '^12', + versions + ); + + assert.deepEqual( + result.map(({ version }) => version), + [ + 'v12.19.0', + 'v12.12.13' + ] + ); + }); + }); + + describe('maxInstalledSatisfyingVersion()', function() { + + it('should be undefined when not satisfied', function() { + const versions = [ + { version: 'v12.0.0' } + ]; + + const result = maxInstalledSatisfyingVersion( + '^8.11.1', + versions + ); + + assert.equal(result, undefined); + }); + + it('should select largest matching version', function() { + const versions = [ + { version: 'v12.0.0' }, + { version: 'v12.19.0' } + ]; + + const result = maxInstalledSatisfyingVersion( + '^12.0.0', + versions + ); + + assert.equal(result.version, 'v12.19.0'); + }); + }); + + describe('minInstalledSatisfyingVersion()', function() { + + it('should be undefined when not satisfied', function() { + const versions = [ + { version: 'v12.0.0' } + ]; + + const result = minInstalledSatisfyingVersion( + '^8.11.1', + versions + ); + + assert.equal(result, undefined); + }); + + it('should select oldest matching version', function() { + const versions = [ + { version: 'v12.19.0' }, + { version: 'v8.0.0' } + ]; + + const result = minInstalledSatisfyingVersion( + '^12.0.0 || ^8.0.0', + versions + ); + + assert.equal(result.version, 'v8.0.0'); + }); + + it('should allow matching on major versions', function() { + const versions = [ + { version: 'v12.19.0' }, + { version: 'v8.0.0' } + ]; + + const result = minInstalledSatisfyingVersion( + '^12', + versions + ); + + assert.equal(result.version, 'v12.19.0'); + }); + + it('should pick 16.12.0 -- issue 116', function() { + const versions = [ + { version: 'v16.13.0' }, + { version: 'v16.12.0' } + ]; + + const result = minInstalledSatisfyingVersion( + '^16', + versions + ); + + assert.equal(result.version, 'v16.12.0'); + }); + }); + + describe('versionStringToNumber()', function() { + + it('should convert version to sortable number', function() { + assert.equal( + versionStringToNumber('v12.19.0'), + 121900 + ); + }); + + it('should accept version without v prefix', function() { + assert.equal( + versionStringToNumber('12.19.0'), + 121900 + ); + }); + }); + + describe('versionStringToObject()', function() { + const versions = [ + { version: 'v2.3.0' }, + { version: 'v2.2.1' }, + { version: 'v2.2.0' }, + { version: 'v2.0.0' }, + { version: 'v1.1.1' } + ]; + + describe('default', function() { + + it('should find full versions', function() { + const result = versionStringToObject( + '2.3.0', + versions + ); + + assert.equal(result.version, 'v2.3.0'); + }); + + it('should find major versions', function() { + const result = versionStringToObject( + '2', + versions + ); + + assert.equal(result.version, 'v2.3.0'); + }); + + it('should find major.minor versions', function() { + const result = versionStringToObject( + '2.2', + versions + ); + + assert.equal(result.version, 'v2.2.1'); + }); + + it('should be undefined when not found', function() { + const result = versionStringToObject( + '1.2.0', + versions + ); + + assert.equal(result, undefined); + }); + }); + + describe('oldest is true', function() { + + it('should find full versions', function() { + const result = versionStringToObject( + '2.3.0', + versions, + true + ); + + assert.equal(result.version, 'v2.3.0'); + }); + + it('should find major versions', function() { + const result = versionStringToObject( + '2', + versions, + true + ); + + assert.equal(result.version, 'v2.0.0'); + }); + + it('should find major.minor versions', function() { + const result = versionStringToObject( + '2.2', + versions, + true + ); + + assert.equal(result.version, 'v2.2.0'); + }); + + it('should be undefined when not found', function() { + const result = versionStringToObject( + '1.2.0', + versions, + true + ); + + assert.equal(result, undefined); + }); + }); + }); + + describe('installed Node versions', function() { + let root; + + beforeEach(function() { + temp.initBase(); + root = temp.createTempFolder(); + }); + + afterEach(function() { + temp.destroy(); + }); + + describe('allInstalledNodeVersions()', function() { + + it('should be empty when nvm environment is not defined', function() { + const result = allInstalledNodeVersions(null, {}); + + assert.deepEqual(result, []); + }); + + it( + 'should be empty when nvm root is not a folder', + function() { + const env = process.platform === 'win32' + ? { + NVM_HOME: join(root, 'missing') + } + : { + NVM_DIR: join(root, 'missing') + }; + + const result = allInstalledNodeVersions( + null, + env + ); + + assert.deepEqual(result, []); + } + ); + + it( + 'should find installed versions with nvm-windows', + { + skip: process.platform !== 'win32' + }, + function() { + const nvmHome = join(root, 'nvm'); + + createWindowsVersion( + nvmHome, + 'v0.0.1' + ); + + createWindowsVersion( + nvmHome, + 'v2.10.22' + ); + + createWindowsVersion( + nvmHome, + 'v8.11.1' + ); + + createWindowsVersion( + nvmHome, + 'v10.23.0' + ); + + mkdirSync( + join(nvmHome, 'not-a-version'), + { + recursive: true + } + ); + + const result = allInstalledNodeVersions( + null, + { + NVM_HOME: nvmHome + } + ); + + assert.deepEqual( + result.map(({ version }) => version), + [ + 'v10.23.0', + 'v8.11.1', + 'v2.10.22', + 'v0.0.1' + ] + ); + + assert.equal( + result[0].path, + join(nvmHome, 'v10.23.0') + ); + + assert.equal( + result[0].bin, + join( + nvmHome, + 'v10.23.0', + 'node.exe' + ) + ); + } + ); + + it( + 'should find installed versions with Linux nvm', + { + skip: process.platform === 'win32' + }, + function() { + const nvmDir = join(root, '.nvm'); + + createLinuxVersion( + nvmDir, + 'v0.0.1' + ); + + createLinuxVersion( + nvmDir, + 'v2.10.11' + ); + + createLinuxVersion( + nvmDir, + 'v10.3.0' + ); + + createLinuxVersion( + nvmDir, + 'v12.0.0' + ); + + mkdirSync( + join( + nvmDir, + 'versions', + 'node', + 'not-a-version' + ), + { + recursive: true + } + ); + + const result = allInstalledNodeVersions( + null, + { + NVM_DIR: nvmDir + } + ); + + assert.deepEqual( + result.map(({ version }) => version), + [ + 'v12.0.0', + 'v10.3.0', + 'v2.10.11', + 'v0.0.1' + ] + ); + + assert.equal( + result[0].path, + join( + nvmDir, + 'versions', + 'node', + 'v12.0.0' + ) + ); + + assert.equal( + result[0].bin, + join( + nvmDir, + 'versions', + 'node', + 'v12.0.0', + 'bin', + 'node' + ) + ); + } + ); + }); + + describe('properNodeVersions()', function() { + + it('should be empty when nvm environment is not defined', function() { + const result = properNodeVersions(null, {}); + + assert.deepEqual(result, []); + }); + + it( + 'should return valid nvm-windows versions', + { + skip: process.platform !== 'win32' + }, + function() { + const nvmHome = join(root, 'nvm'); + + createWindowsVersion( + nvmHome, + 'v0.0.1', + true + ); + + createWindowsVersion( + nvmHome, + 'v2.10.22', + true + ); + + createWindowsVersion( + nvmHome, + 'v8.11.1', + false + ); + + createWindowsVersion( + nvmHome, + 'v10.23.0', + false + ); + + const result = properNodeVersions( + null, + { + NVM_HOME: nvmHome + } + ); + + assert.deepEqual( + result.map(({ version }) => version), + [ + 'v2.10.22', + 'v0.0.1' + ] + ); + + for(const version of result) { + assert.equal( + version.bin, + join( + version.path, + 'node.exe' + ) + ); + } + } + ); + + it( + 'should return valid Linux nvm versions', + { + skip: process.platform === 'win32' + }, + function() { + const nvmDir = join(root, '.nvm'); + + createLinuxVersion( + nvmDir, + 'v0.0.1', + false + ); + + createLinuxVersion( + nvmDir, + 'v2.10.11', + true + ); + + createLinuxVersion( + nvmDir, + 'v10.3.0', + true + ); + + createLinuxVersion( + nvmDir, + 'v12.0.0', + false + ); + + const result = properNodeVersions( + null, + { + NVM_DIR: nvmDir + } + ); + + assert.deepEqual( + result.map(({ version }) => version), + [ + 'v10.3.0', + 'v2.10.11' + ] + ); + + for(const version of result) { + assert.equal( + version.bin, + join( + version.path, + 'bin', + 'node' + ) + ); + } + } + ); + }); + }); +}); + +const createWindowsVersion = ( + nvmHome, + version, + withNode = true +) => { + const versionPath = join( + nvmHome, + version + ); + + mkdirSync(versionPath, { + recursive: true + }); + + if(withNode) { + writeFileSync( + join(versionPath, 'node.exe'), + '' + ); + } + + return versionPath; +}; + +const createLinuxVersion = ( + nvmDir, + version, + withNode = true +) => { + const versionPath = join( + nvmDir, + 'versions', + 'node', + version + ); + + const binPath = join( + versionPath, + 'bin' + ); + + mkdirSync(binPath, { + recursive: true + }); + + if(withNode) { + const nodePath = join( + binPath, + 'node' + ); + + writeFileSync(nodePath, ''); + chmodSync(nodePath, 0o755); + } + + return versionPath; +}; \ No newline at end of file diff --git a/test/files.spec.js b/test/files.spec.js deleted file mode 100644 index 9ec117a..0000000 --- a/test/files.spec.js +++ /dev/null @@ -1,48 +0,0 @@ -const chai = require('chai'); -const { expect } = chai; -const mockFS = require('mock-fs'); - -const files = require('../src/common/files.js'); -const testFolder = { - a: { - b: { - xx: '' - , c:{ - x:'' - , d: { - found: '' - , someFolder: {} - } - } - } - } -}; - -describe('files module', () => { - describe('findFirstFile()', () => { - beforeEach(() => { - mockFS(testFolder); - }); - afterEach(mockFS.restore); - it('should return null if supplied startPath does not exist as a folder', () => { - const result = files.findFirstFile('missing', 'a/b/c/d/someFolder'); - - expect(result).to.be.null; - }); - it('should stop at root returning null', () => { - const result = files.findFirstFile('missing', 'a/b'); - - expect(result).to.be.null; - }); - it('should return a path if found', () => { - const result = files.findFirstFile('found', 'a/b/c/d'); - - expect(result).is.a('String').with.length.greaterThan(0); - }); - it('should trap errors returning null', () => { - const result = files.findFirstFile(/wtf/); - - expect(result).to.be.null; - }); - }); -}); diff --git a/test/files.test.js b/test/files.test.js new file mode 100644 index 0000000..d597a89 --- /dev/null +++ b/test/files.test.js @@ -0,0 +1,58 @@ +import assert from 'node:assert/strict'; +import { afterEach, beforeEach, describe, it } from 'node:test'; + +import mockFS from 'mock-fs'; + +import * as files from '../src/common/files.js'; + +const testFolder = { + a: { + b: { + xx: '', + c: { + x: '', + d: { + found: '', + someFolder: {} + } + } + } + } +}; + +describe('files module', function () { + describe('findFirstFile()', function () { + beforeEach(function () { + mockFS(testFolder); + }); + + afterEach(function () { + mockFS.restore(); + }); + + it('should return null if supplied startPath does not exist as a folder', function () { + const result = files.findFirstFile('missing', 'a/b/c/d/someFolder'); + + assert.strictEqual(result, null); + }); + + it('should stop at root returning null', function () { + const result = files.findFirstFile('missing', 'a/b'); + + assert.strictEqual(result, null); + }); + + it('should return a path if found', function () { + const result = files.findFirstFile('found', 'a/b/c/d'); + + assert.strictEqual(typeof result, 'string'); + assert.ok(result.length > 0); + }); + + it('should trap errors returning null', function () { + const result = files.findFirstFile(/wtf/); + + assert.strictEqual(result, null); + }); + }); +}); \ No newline at end of file diff --git a/test/grefplus/cmdline.test.js b/test/grefplus/cmdline.test.js new file mode 100644 index 0000000..2031d4a --- /dev/null +++ b/test/grefplus/cmdline.test.js @@ -0,0 +1,127 @@ +import assert from 'node:assert/strict'; +import { + describe, + it, +} from 'node:test'; + +import { DateTime } from 'luxon'; + +import { + options, + setOptions +} from '../../src/grefplus/cmdline.js'; + +describe('grefplus cmdline', function () { + it('should configure a single date as the entire day', function () { + setOptions({ + date: '9/20/26', + devRoot: [], + folderNames: [] + }); + + assert.ok(DateTime.isDateTime(options.fromDate)); + assert.ok(DateTime.isDateTime(options.toDate)); + + assert.strictEqual( + options.fromDate.toFormat('M/d/yy HH:mm:ss.SSS'), + '9/20/26 00:00:00.000' + ); + + assert.strictEqual( + options.toDate.toFormat('M/d/yy HH:mm:ss.SSS'), + '9/20/26 23:59:59.999' + ); + }); + + it('should configure from-date without to-date', function () { + setOptions({ + fromDate: '9/20/26', + devRoot: [], + folderNames: [] + }); + + assert.strictEqual( + options.fromDate.toFormat('M/d/yy HH:mm:ss.SSS'), + '9/20/26 00:00:00.000' + ); + assert.strictEqual(options.toDate, null); + }); + + it('should configure to-date without from-date', function () { + setOptions({ + toDate: '9/20/26', + devRoot: [], + folderNames: [] + }); + + assert.strictEqual(options.fromDate, null); + assert.strictEqual( + options.toDate.toFormat('M/d/yy HH:mm:ss.SSS'), + '9/20/26 23:59:59.999' + ); + }); + + it('should configure a date range', function () { + setOptions({ + fromDate: '9/18/26', + toDate: '9/20/26', + devRoot: [], + folderNames: [] + }); + + assert.strictEqual( + options.fromDate.toFormat('M/d/yy'), + '9/18/26' + ); + assert.strictEqual( + options.toDate.toFormat('M/d/yy'), + '9/20/26' + ); + }); + + it('should configure dev roots', function () { + setOptions({ + devRoot: [ '/c/dev', '/d/dev' ], + folderNames: [] + }); + + assert.deepStrictEqual(options.devRoot, [ + '/c/dev', + '/d/dev' + ]); + }); + + it('should configure repository folder names', function () { + setOptions({ + devRoot: [], + folderNames: [ 'repo-one', 'repo-two' ] + }); + + assert.deepStrictEqual(options.folderNames, [ + 'repo-one', + 'repo-two' + ]); + }); + + it('should default folder names to an empty array', function () { + setOptions({ + devRoot: [] + }); + + assert.deepStrictEqual(options.folderNames, []); + }); + + it('should clear previous date options', function () { + setOptions({ + date: '9/20/26', + devRoot: [] + }); + + setOptions({ + devRoot: [] + }); + + assert.strictEqual(options.fromDate, null); + assert.strictEqual(options.toDate, null); + }); +}); \ No newline at end of file diff --git a/test/grefplus/index.test.js b/test/grefplus/index.test.js new file mode 100644 index 0000000..ffdfd25 --- /dev/null +++ b/test/grefplus/index.test.js @@ -0,0 +1,254 @@ +import assert from 'node:assert/strict'; +import { + beforeEach, + describe, + it, + mock +} from 'node:test'; + +import { DateTime } from 'luxon'; + +import { + filterPeriod, + processRepo +} from '../../src/grefplus/index.js'; +import { options } from '../../src/grefplus/cmdline.js'; + +describe('grefplus', function () { + describe('filterPeriod()', function () { + beforeEach(function () { + options.fromDate = null; + options.toDate = null; + }); + + it('should include item when no date range is specified', function () { + const date = DateTime.fromISO('2026-09-20T12:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, true); + }); + + it('should include item after from-date', function () { + options.fromDate = DateTime.fromISO('2026-09-20T00:00:00'); + const date = DateTime.fromISO('2026-09-21T12:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, true); + }); + + it('should include item equal to from-date', function () { + options.fromDate = DateTime.fromISO('2026-09-20T00:00:00'); + const date = DateTime.fromISO('2026-09-20T00:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, true); + }); + + it('should exclude item before from-date', function () { + options.fromDate = DateTime.fromISO('2026-09-20T00:00:00'); + const date = DateTime.fromISO('2026-09-19T23:59:59'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, false); + }); + + it('should include item before to-date', function () { + options.toDate = DateTime.fromISO('2026-09-20T23:59:59'); + const date = DateTime.fromISO('2026-09-20T12:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, true); + }); + + it('should include item equal to to-date', function () { + options.toDate = DateTime.fromISO('2026-09-20T23:59:59'); + const date = DateTime.fromISO('2026-09-20T23:59:59'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, true); + }); + + it('should exclude item after to-date', function () { + options.toDate = DateTime.fromISO('2026-09-20T23:59:59'); + const date = DateTime.fromISO('2026-09-21T00:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, false); + }); + + it('should include item within date range', function () { + options.fromDate = DateTime.fromISO('2026-09-20T00:00:00'); + options.toDate = DateTime.fromISO('2026-09-22T23:59:59'); + const date = DateTime.fromISO('2026-09-21T12:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, true); + }); + + it('should exclude item before date range', function () { + options.fromDate = DateTime.fromISO('2026-09-20T00:00:00'); + options.toDate = DateTime.fromISO('2026-09-22T23:59:59'); + const date = DateTime.fromISO('2026-09-19T12:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, false); + }); + + it('should exclude item after date range', function () { + options.fromDate = DateTime.fromISO('2026-09-20T00:00:00'); + options.toDate = DateTime.fromISO('2026-09-22T23:59:59'); + const date = DateTime.fromISO('2026-09-23T12:00:00'); + + const result = filterPeriod({ date }); + + assert.strictEqual(result, false); + }); + }); + describe('processRepo()', function () { + beforeEach(function () { + options.fromDate = null; + options.toDate = null; + }); + + it('should parse reflog entries', async function (t) { + const stdout = [ + 'HEAD@{2026-09-20 10:30:00 AM==} abc1234 commit: first +++', + 'HEAD@{2026-09-21 02:15:00 PM==} def5678 commit: second +++' + ].join('\n'); + + const raw = t.mock.fn(async function () { + return stdout; + }); + + const gitFactory = t.mock.fn(function () { + return { raw }; + }); + + const errors = []; + + const result = await processRepo( + '/development/my-repo', + errors, + gitFactory + ); + + assert.strictEqual(result.length, 2); + assert.strictEqual(result[0].repo, 'my-repo'); + assert.strictEqual(result[0].body, ' abc1234 commit: first'); + assert.strictEqual(result[1].body, ' def5678 commit: second'); + assert.ok(DateTime.isDateTime(result[0].date)); + assert.strictEqual( + result[0].date.toFormat('yyyy-MM-dd hh:mm:ss a'), + '2026-09-20 10:30:00 AM' + ); + assert.deepStrictEqual(errors, []); + }); + + it('should create git instance for repository', async function (t) { + const raw = t.mock.fn(async function () { + return ''; + }); + + const gitFactory = t.mock.fn(function () { + return { raw }; + }); + + await processRepo('/development/my-repo', [], gitFactory); + + assert.strictEqual(gitFactory.mock.callCount(), 1); + assert.deepStrictEqual( + gitFactory.mock.calls[0].arguments[0], + { + baseDir: '/development/my-repo' + } + ); + }); + + it('should request reflog from git', async function (t) { + const raw = t.mock.fn(async function () { + return ''; + }); + + const gitFactory = function () { + return { raw }; + }; + + await processRepo('/development/my-repo', [], gitFactory); + + assert.strictEqual(raw.mock.callCount(), 1); + assert.deepStrictEqual( + raw.mock.calls[0].arguments[0], + [ + 'log', + '--walk-reflogs', + '--format=%gd %h %d %gs +++', + '--date=format:%Y-%m-%d %H:%M:%S %p==' + ] + ); + }); + + it('should filter entries before from-date', async function () { + options.fromDate = DateTime.fromISO('2026-09-21T00:00:00'); + + const stdout = [ + 'HEAD@{2026-09-20 10:30:00 AM==} abc1234 commit: old +++', + 'HEAD@{2026-09-21 02:15:00 PM==} def5678 commit: included +++' + ].join('\n'); + + const gitFactory = function () { + return { + raw: async function () { + return stdout; + } + }; + }; + + const result = await processRepo( + '/development/my-repo', + [], + gitFactory + ); + + assert.strictEqual(result.length, 1); + assert.strictEqual( + result[0].body, + ' def5678 commit: included' + ); + }); + + it('should return empty array and record git errors', async function () { + const gitFactory = function () { + return { + raw: async function () { + throw new Error('git failed'); + } + }; + }; + + const errors = []; + + const result = await processRepo( + '/development/my-repo', + errors, + gitFactory + ); + + assert.deepStrictEqual(result, []); + assert.deepStrictEqual(errors, [ + { + repo: '/development/my-repo', + error: 'git failed' + } + ]); + }); + }); +}); \ No newline at end of file diff --git a/test/node-tools.spec.js b/test/node-tools.spec.js deleted file mode 100644 index ab146b5..0000000 --- a/test/node-tools.spec.js +++ /dev/null @@ -1,193 +0,0 @@ -/* eslint-disable no-magic-numbers */ -const chai = require('chai'); -const { expect } = chai; - -const mockFS = require('mock-fs'); -const fs = require('fs'); -const { Version } = require('../src/common/engine.js'); -const sinon = require('sinon'); -chai.use(require('sinon-chai')); -const { platform } = require('os'); -const isWindows = platform() === 'win32'; - -const clean = require('../src/node-tools/clean.js'); -const report = require('../src/node-tools/report.js'); -const fix = require('../src/node-tools/fix.js'); -const remove = require('../src/node-tools/remove.js'); - -let version10; let version12; let version14; let logger = {}; - - -describe('node-tools', function() { - afterEach(mockFS.restore); - beforeEach(function() { - mockFS({ - a: { - 'v10.0.0': { - 'node64.exe':'content' - , 'node.exe': mockFS.symlink({ path: 'node64.exe' }) - } - , 'v12.0.0': { - 'node64.exe': 'content' - , 'node.exe': 'content' - } - , 'v14.0.0': { - 'node64.exe': 'content64' - } - } - }); - version10 = new Version('v10.0.0', 'a/v10.0.0'); - version12 = new Version('v12.0.0', 'a/v12.0.0'); - version14 = new Version('v14.0.0', 'a/v14.0.0'); - logger = { - debug: sinon.spy() - , error: sinon.spy() - }; - }); - describe('clean', function() { - it('should remove only the symbolic links', (done) => { - const installed = [ - version10 - , version12 - ]; - - expect(fs.readdirSync('a/v10.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - - clean({ installed }, logger); - done(); - - expect(fs.readdirSync('a/v10.0.0')).not.contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - - }); - it('should report only on dryRun', (done) => { - const dryRun = true; - const installed = [ - version10 - , version12 - ]; - - expect(fs.readdirSync('a/v10.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - - clean({ installed, dryRun }, logger); - done(); - - expect(fs.readdirSync('a/v10.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - }); - }); - describe('report', function() { - it('should report findings', (done) => { - const ExpectedCallCount = 4; - const installed = [ - version10 - , version12 - , version14 - ]; - - report({ installed }, logger); - done(); - - expect(logger.debug.firstCall.firstArg).equals(' - v10.0.0 - OK (link)'); - expect(logger.debug.secondCall.firstArg).equals(' - v12.0.0 - OK '); - expect(logger.debug.thirdCall.firstArg).equals(' - v14.0.0 - Problem: \'node.exe\' not found or executable'); - expect(logger.debug.callCount).equals(ExpectedCallCount); - }); - }); - describe('fix', function() { - it('should create a symbolic link', function() { - if(!isWindows) { - return this.skip(); - } - const installed = [ - version10 - , version12 - , version14 - ]; - const execute = true; - - expect(fs.readdirSync('a/v10.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v14.0.0')).not.contains('node.exe'); - - fix({ installed, execute, mode: 'link' }, logger); - - expect(fs.readdirSync('a/v10.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v14.0.0')).contains('node.exe'); - expect(fs.lstatSync('a/v14.0.0/node.exe').isSymbolicLink()).is.true; - }); - it('should create copy of node64.exe', function() { - if(!isWindows) { - return this.skip(); - } - const installed = [ - version10 - , version12 - , version14 - ]; - const execute = true; - - expect(fs.readdirSync('a/v10.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v14.0.0')).not.contains('node.exe'); - - fix({ installed, execute, mode: 'copy' }, logger); - - const content = fs.readFileSync('a/v14.0.0/node.exe').toString(); - - expect(fs.readdirSync('a/v10.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v12.0.0')).contains('node.exe'); - expect(fs.readdirSync('a/v14.0.0')).contains('node.exe'); - expect(fs.lstatSync('a/v14.0.0/node.exe').isSymbolicLink()).is.false; - expect(content).equals('content64'); - }); - }); - describe('remove', function() { - it('should not remove when execute is false', async function() { - const installed = [ version10, version12 ]; - const version = '10.0.0'; - - await remove({ installed, execute: false, version }, logger); - - expect(fs.readdirSync('a')).contains('v10.0.0'); - expect(fs.readdirSync('a')).contains('v12.0.0'); - expect(logger.debug.callCount).equals(1); - }); - it('should report but not remove matched range when execute is false', async function() { - const installed = [ version10, version12 ]; - const version = '10.0.0'; - - await remove({ installed, execute: false, version }, logger); - - expect(fs.readdirSync('a')).contains('v10.0.0'); - expect(fs.readdirSync('a')).contains('v12.0.0'); - expect(logger.debug.callCount).equals(1); - expect(logger.debug.firstCall.firstArg).matches(/^Would remove/); - }); - it('should remove only matched range when execute is true', async function() { - const installed = [ version10, version12 ]; - const version = '10.0.0'; - - await remove({ installed, execute: true, version }, logger); - - expect(fs.readdirSync('a')).not.contains('v10.0.0'); - expect(fs.readdirSync('a')).contains('v12.0.0'); - expect(logger.debug.callCount).equals(1); - expect(logger.debug.firstCall.firstArg).matches(/^Removed/); - }); - it('should report message when no installed versions match range', async function() { - const installed = [ version10, version12 ]; - const version = '5.0.0'; - - await remove({ installed, execute: false, version }, logger); - - expect(fs.readdirSync('a')).contains('v10.0.0'); - expect(fs.readdirSync('a')).contains('v12.0.0'); - expect(logger.debug.callCount).equals(1); - expect(logger.debug.firstCall.firstArg).matches(/^No matches found for/); - }); - }); -}); diff --git a/test/node-tools/nt.test.js b/test/node-tools/nt.test.js new file mode 100644 index 0000000..8b0c454 --- /dev/null +++ b/test/node-tools/nt.test.js @@ -0,0 +1,692 @@ +/* eslint-disable no-magic-numbers */ + +import assert from 'node:assert/strict'; +import { + chmodSync, + existsSync, + lstatSync, + mkdirSync, + readFileSync, + symlinkSync, + writeFileSync, + unlinkSync +} from 'node:fs'; +import { join } from 'node:path'; +import { + afterEach, + beforeEach, + describe, + it, + mock +} from 'node:test'; + +import Version from '../../src/common/Version.js'; +import * as temp from '../../src/common/temp.js'; + +import clean from '../../src/node-tools/clean.js'; +import fix from '../../src/node-tools/fix.js'; +import remove from '../../src/node-tools/remove.js'; +import report from '../../src/node-tools/report.js'; + +const isWindows = process.platform === 'win32'; + +let root; +let version10; +let version12; +let version14; +let logger; + +describe('node-tools', function() { + + beforeEach(function() { + temp.initBase(); + root = temp.createTempFolder(); + + const path10 = createVersionFolder('v10.0.0'); + const path12 = createVersionFolder('v12.0.0'); + const path14 = createVersionFolder('v14.0.0'); + + if(isWindows) { + writeFileSync( + join(path10, 'node64.exe'), + 'content' + ); + + symlinkSync( + join(path10, 'node64.exe'), + join(path10, 'node.exe') + ); + + writeFileSync( + join(path12, 'node64.exe'), + 'content' + ); + + writeFileSync( + join(path12, 'node.exe'), + 'content' + ); + + writeFileSync( + join(path14, 'node64.exe'), + 'content64' + ); + } + else { + createLinuxExecutable(path10); + createLinuxExecutable(path12); + + // Version 14 deliberately has no node executable. + mkdirSync( + join(path14, 'bin'), + { recursive: true } + ); + } + + version10 = new Version( + 'v10.0.0', + path10 + ); + + version12 = new Version( + 'v12.0.0', + path12 + ); + + version14 = new Version( + 'v14.0.0', + path14 + ); + + logger = { + debug: mock.fn(), + error: mock.fn() + }; + }); + + afterEach(function() { + temp.destroy(); + }); + + describe('clean', function() { + + it( + 'should remove only symbolic links', + { + skip: !isWindows + }, + function() { + const installed = [ + version10, + version12 + ]; + + assert.equal( + existsSync(version10.bin), + true + ); + + assert.equal( + existsSync(version12.bin), + true + ); + + clean( + { + installed, + execute: true + }, + logger + ); + + assert.equal( + existsSync(version10.bin), + false + ); + + assert.equal( + existsSync(version12.bin), + true + ); + } + ); + + it('should report only when execute is false', + { + skip: !isWindows + }, + function() { + const installed = [ + version10, + version12 + ]; + + clean( + { + installed, + execute: false + }, + logger + ); + + assert.equal( + existsSync(version10.bin), + true + ); + + assert.equal( + existsSync(version12.bin), + true + ); + + assert.equal( + logger.debug.mock.callCount(), + 1 + ); + + assert.match( + logger.debug.mock.calls[0].arguments[0], + /will delete node\.exe/ + ); + } + ); + + it('should not remove a Linux node symbolic link when execute is false', + { + skip: isWindows + }, + function() { + const target = join( + version10.path, + 'bin', + 'node-real' + ); + + const link = join( + version10.path, + 'bin', + 'node' + ); + + unlinkSync(link); + writeFileSync(target, 'content'); + chmodSync(target, 0o755); + symlinkSync(target, link); + + const linkedVersion = new Version( + 'v10.0.0', + version10.path + ); + + clean( + { + installed: [ linkedVersion ], + execute: false + }, + logger + ); + + assert.equal(existsSync(link), true); + assert.equal(existsSync(target), true); + + assert.match( + logger.debug.mock.calls[0].arguments[0], + /will delete node/ + ); + } + ); + + it('should remove a Linux node symbolic link', + { + skip: isWindows + }, + function() { + const target = join( + version10.path, + 'bin', + 'node-real' + ); + + const link = join( + version10.path, + 'bin', + 'node' + ); + + // Replace the regular node executable created by beforeEach. + unlinkSync(link); + writeFileSync(target, 'content'); + chmodSync(target, 0o755); + symlinkSync(target, link); + + // Version needs to inspect the new symbolic link. + const linkedVersion = new Version( + 'v10.0.0', + version10.path + ); + + assert.equal(linkedVersion.isLink, true); + assert.equal(existsSync(link), true); + + clean( + { + installed: [ linkedVersion ], + execute: true + }, + logger + ); + + assert.equal(existsSync(link), false); + assert.equal(existsSync(target), true); + + assert.match( + logger.debug.mock.calls[0].arguments[0], + /deleted symbolic link/ + ); + } + ); + }); + + describe('report', function() { + + it('should report Windows findings', + { + skip: !isWindows + }, + function() { + const installed = [ + version10, + version12, + version14 + ]; + + report( + { installed }, + logger + ); + + assert.equal( + logger.debug.mock.callCount(), + 4 + ); + + assert.equal( + logger.debug.mock.calls[0].arguments[0], + ' - v10.0.0 - OK (link)' + ); + + assert.equal( + logger.debug.mock.calls[1].arguments[0], + ' - v12.0.0 - OK ' + ); + + assert.match( + logger.debug.mock.calls[2].arguments[0], + /^ - v14\.0\.0\s+- Problem: unable to find executable for version v14\.0\.0 in / + ); + + assert.equal( + logger.debug.mock.calls[3].arguments[0], + '' + ); + } + ); + + it('should report Linux findings', + { + skip: isWindows + }, + function() { + const installed = [ + version10, + version12, + version14 + ]; + + report( + { installed }, + logger + ); + + assert.equal( + logger.debug.mock.callCount(), + 4 + ); + + assert.equal( + logger.debug.mock.calls[0].arguments[0], + ' - v10.0.0 - OK ' + ); + + assert.equal( + logger.debug.mock.calls[1].arguments[0], + ' - v12.0.0 - OK ' + ); + + assert.match( + logger.debug.mock.calls[2].arguments[0], + /^ - v14\.0\.0\s+- Problem: unable to find executable for version v14\.0\.0 in / + ); + + assert.equal( + logger.debug.mock.calls[3].arguments[0], + '' + ); + } + ); + }); + + describe('fix', function() { + + it('should create a symbolic link', + { + skip: !isWindows + }, + function() { + const installed = [ + version10, + version12, + version14 + ]; + + fix( + { + installed, + execute: true, + mode: 'link' + }, + logger + ); + + const nodePath = join( + version14.path, + 'node.exe' + ); + + assert.equal( + existsSync(nodePath), + true + ); + + assert.equal( + lstatSync(nodePath).isSymbolicLink(), + true + ); + } + ); + + it('should create copy of node64.exe', + { + skip: !isWindows + }, + function() { + const installed = [ + version10, + version12, + version14 + ]; + + fix( + { + installed, + execute: true, + mode: 'copy' + }, + logger + ); + + const nodePath = join( + version14.path, + 'node.exe' + ); + + assert.equal( + existsSync(nodePath), + true + ); + + assert.equal( + lstatSync(nodePath).isSymbolicLink(), + false + ); + + assert.equal( + readFileSync(nodePath, 'utf8'), + 'content64' + ); + } + ); + + it('should report that a broken Linux installation cannot be repaired', + { + skip: isWindows + }, + function() { + const result = fix( + { + installed: [ version14 ], + execute: true, + mode: 'copy' + }, + logger + ); + + assert.equal(result, 1); + + assert.equal( + existsSync( + join( + version14.path, + 'bin', + 'node' + ) + ), + false + ); + + assert.equal( + logger.error.mock.callCount(), + 1 + ); + + assert.match( + logger.error.mock.calls[0].arguments[0], + /unable to find an executable to repair/ + ); + } + ); + + it('should report an unsupported Linux repair during dry-run', + { + skip: isWindows + }, + function() { + const result = fix( + { + installed: [ version14 ], + execute: false, + mode: 'link' + }, + logger + ); + + assert.equal(result, 1); + assert.equal(logger.error.mock.callCount(), 1); + assert.equal(logger.debug.mock.callCount(), 0); + } + ); + }); + + describe('remove', function() { + + it('should not remove when execute is false', async function() { + const installed = [ + version10, + version12 + ]; + + await remove( + { + installed, + execute: false, + version: '10.0.0' + }, + logger + ); + + assert.equal( + existsSync(version10.path), + true + ); + + assert.equal( + existsSync(version12.path), + true + ); + + assert.equal( + logger.debug.mock.callCount(), + 1 + ); + }); + + it( + 'should report but not remove matched range when execute is false', + async function() { + const installed = [ + version10, + version12 + ]; + + await remove( + { + installed, + execute: false, + version: '10.0.0' + }, + logger + ); + + assert.equal( + existsSync(version10.path), + true + ); + + assert.equal( + existsSync(version12.path), + true + ); + + assert.equal( + logger.debug.mock.callCount(), + 1 + ); + + assert.match( + logger.debug.mock.calls[0].arguments[0], + /^Would remove/ + ); + } + ); + + it( + 'should remove only matched range when execute is true', + async function() { + const installed = [ + version10, + version12 + ]; + + await remove( + { + installed, + execute: true, + version: '10.0.0' + }, + logger + ); + + assert.equal( + existsSync(version10.path), + false + ); + + assert.equal( + existsSync(version12.path), + true + ); + + assert.equal( + logger.debug.mock.callCount(), + 1 + ); + + assert.match( + logger.debug.mock.calls[0].arguments[0], + /^Removed/ + ); + } + ); + + it( + 'should report when no installed versions match range', + async function() { + const installed = [ + version10, + version12 + ]; + + await remove( + { + installed, + execute: false, + version: '5.0.0' + }, + logger + ); + + assert.equal( + existsSync(version10.path), + true + ); + + assert.equal( + existsSync(version12.path), + true + ); + + assert.equal( + logger.debug.mock.callCount(), + 1 + ); + + assert.match( + logger.debug.mock.calls[0].arguments[0], + /^No matches found for/ + ); + } + ); + }); +}); + +const createVersionFolder = (version) => { + const path = join(root, version); + + mkdirSync(path, { + recursive: true + }); + + return path; +}; + +const createLinuxExecutable = (path) => { + const binPath = join(path, 'bin'); + const nodePath = join(binPath, 'node'); + + mkdirSync(binPath, { + recursive: true + }); + + writeFileSync(nodePath, 'content'); + chmodSync(nodePath, 0o755); +}; diff --git a/test/repos.spec.js b/test/repos.spec.js deleted file mode 100644 index ef69492..0000000 --- a/test/repos.spec.js +++ /dev/null @@ -1,130 +0,0 @@ -/* eslint-disable no-magic-numbers */ -const chai = require('chai'); -const { expect } = chai; -chai.use(require('sinon-chai')); - -const mockFS = require('mock-fs'); -const { join, sep } = require('node:path'); -const { allRepoPaths - , getBinaryPaths - , getPackage -} = require('../src/common/repos'); - -const fakePackage = { - 'name': 'faker' - , 'version': '0.0.0' - , 'parentPath': 'wwwroot' - , 'repositories': [ - { - 'name': 'root' - } - , { - 'name': 'tems' - } - ] -}; - -const fake = { - root: { - folder1: { - '.git':{} - , a: { - '.git': {} - } - , afile: '' - } - , folder2: { - '.git': {} - } - , folder3: { - '.git': '' - } - , '.git': '' - , 'deploy-builder': { - 'package.json': JSON.stringify(fakePackage) - } - , 'tems': {} - } -}; - -// @TODO: mock out fileExists and folderExists -describe('Repositories Modules', function () { - describe('allRepPaths', function () { - before(() => { - mockFS(fake); - }); - after(mockFS.restore); - it('should find git repos', async function() { - const result = await allRepoPaths('./root'); - - expect(result).an('array').of.length(2); - expect(result).contains(`root${sep}folder1`); - expect(result).contains(`root${sep}folder2`); - }); - it('should find only named git repos', async function() { - const result = await allRepoPaths('./root', [ 'folder1' ]); - - expect(result).an('array').of.length(1); - expect(result).contains(`root${sep}folder1`); - }); - it('should not find any git repos when named is not a git repo', async function() { - const result = await allRepoPaths('./root', [ 'folder3' ]); - - expect(result).an('array').of.length(0); - }); - it('should not find any git repos when root does not contain repos in immediate sub folders', async function() { - const result = await allRepoPaths('.'); - - expect(result).an('array').of.length(0); - }); - }); - describe('getPackage()', function () { - it('should return empty object on failure', async function () { - mockFS({ repo: { } }); - - const { name, error } = await getPackage(join('repo', 'package.json')); - - expect(name).to.be.undefined; - expect(error).to.be.true; - - mockFS.restore(); - }); - it('should return parsed JSON on success', async function () { - const repo = { - 'package.json': JSON.stringify({ name: 'hello' }) - }; - mockFS({ repo }); - - const file = join('repo', 'package.json'); - const { name, error } = await getPackage(file); - - expect(name).equals('hello'); - expect(error).to.be.undefined; - - mockFS.restore(); - }); - }); - describe('getBinaryPaths()', function () { - it('should be empty object on join fails', function () { - const { buildRoot, gulpFile } = getBinaryPaths(); - - expect(buildRoot).to.be.undefined; - expect(gulpFile).to.be.undefined; - }); - it('buildRoot should be within tooling', function () { - const { buildRoot, gulpFile } = getBinaryPaths('myBuilder', 'myRepo', 'myRoot'); - - expect(buildRoot).matches(/^myRoot/); - expect(buildRoot).matches(/myBuilder$/); - expect(gulpFile).to.match(/myBuilder/); - expect(gulpFile).to.match(/gulp\.js$/); - }); - it('buildRoot should be in calling repo', function () { - const { buildRoot, gulpFile } = getBinaryPaths('', 'myRepo', 'myRoot'); - - expect(buildRoot).matches(/^myRepo/); - expect(gulpFile).to.match(/^myRepo/); - expect(gulpFile).to.match(/gulp\.js$/); - }); - }); -}); diff --git a/test/repos.test.js b/test/repos.test.js new file mode 100644 index 0000000..3c4b6b8 --- /dev/null +++ b/test/repos.test.js @@ -0,0 +1,142 @@ +import assert from 'node:assert/strict'; +import { after, describe, it, before } from 'node:test'; +import { join, sep } from 'node:path'; + +import mockFS from 'mock-fs'; + +import { + allRepoPaths, + getBinaryPaths, + getPackage +} from '../src/common/repos.js'; + +const fakePackage = { + name: 'faker', + version: '0.0.0', + parentPath: 'wwwroot', + repositories: [ + { + name: 'root' + }, + { + name: 'tems' + } + ] +}; + +const fake = { + root: { + folder1: { + '.git': {}, + a: { + '.git': {} + }, + afile: '' + }, + folder2: { + '.git': {} + }, + folder3: { + '.git': '' + }, + '.git': '', + 'deploy-builder': { + 'package.json': JSON.stringify(fakePackage) + }, + tems: {} + } +}; + +// @TODO: mock out fileExists and folderExists +describe('Repositories Modules', function () { + describe('allRepoPaths()', function () { + before(function () { + mockFS(fake); + }); + + after(function () { + mockFS.restore(); + }); + + it('should find git repos', async function () { + const result = await allRepoPaths('./root'); + + assert.strictEqual(result.length, 2); + assert.ok(result.includes(`root${sep}folder1`)); + assert.ok(result.includes(`root${sep}folder2`)); + }); + + it('should find only named git repos', async function () { + const result = await allRepoPaths('./root', [ 'folder1' ]); + + assert.strictEqual(result.length, 1); + assert.ok(result.includes(`root${sep}folder1`)); + }); + + it('should not find any git repos when named is not a git repo', async function () { + const result = await allRepoPaths('./root', [ 'folder3' ]); + + assert.strictEqual(result.length, 0); + }); + + it('should not find any git repos when root does not contain repos in immediate sub folders', async function () { + const result = await allRepoPaths('.'); + + assert.strictEqual(result.length, 0); + }); + }); + + describe('getPackage()', function () { + it('should return empty object on failure', async function () { + mockFS({ repo: {} }); + + const { name, error } = await getPackage(join('repo', 'package.json')); + + assert.strictEqual(name, undefined); + assert.strictEqual(error, true); + + mockFS.restore(); + }); + + it('should return parsed JSON on success', async function () { + const repo = { + 'package.json': JSON.stringify({ name: 'hello' }) + }; + mockFS({ repo }); + + const file = join('repo', 'package.json'); + const { name, error } = await getPackage(file); + + assert.strictEqual(name, 'hello'); + assert.strictEqual(error, undefined); + + mockFS.restore(); + }); + }); + + describe('getBinaryPaths()', function () { + it('should return an empty object when required paths are missing', function () { + const { buildRoot, gulpFile } = getBinaryPaths(); + + assert.strictEqual(buildRoot, undefined); + assert.strictEqual(gulpFile, undefined); + }); + + it('buildRoot should be within tooling', function () { + const { buildRoot, gulpFile } = getBinaryPaths('myBuilder', 'myRepo', 'myRoot'); + + assert.match(buildRoot, /^myRoot/); + assert.match(buildRoot, /myBuilder$/); + assert.match(gulpFile, /myBuilder/); + assert.match(gulpFile, /gulp\.js$/); + }); + + it('buildRoot should be in calling repo', function () { + const { buildRoot, gulpFile } = getBinaryPaths('', 'myRepo', 'myRoot'); + + assert.match(buildRoot, /^myRepo/); + assert.match(gulpFile, /^myRepo/); + assert.match(gulpFile, /gulp\.js$/); + }); + }); +}); \ No newline at end of file diff --git a/test/temp.spec.js b/test/temp.spec.js deleted file mode 100644 index f6bdb20..0000000 --- a/test/temp.spec.js +++ /dev/null @@ -1,71 +0,0 @@ -const chai = require('chai'); -const { expect } = chai; - -const mockFS = require('mock-fs'); -const { dirname } = require('node:path'); -const fs = require('node:fs'); - -const options = {}; -const TF = require('../src/common/temp'); - -const oldBase = TF.baseFolder; -describe('Temp Folder utility', () => { - beforeEach(() => { - mockFS({}); - delete TF.baseFolder; - options.tempFolder = ''; - }); - afterEach(mockFS.restore); - after(() => { - TF.baseFolder = oldBase; - }); - describe('initBase()', () => { - it('should not throw', () => { - expect(TF.baseFolder).to.be.undefined; - expect(TF.initBase).not.to.throw(); - expect(TF.baseFolder).not.to.be.undefined; - }); - it('should set base to system temp', () => { - expect(TF.baseFolder).to.be.undefined; - - const result = TF.initBase(); - - expect(fs.statSync(result).isDirectory()).to.be.true; - - const subs = fs.readdirSync(result); - expect(subs.length).to.equal(0); - - expect(TF.baseFolder).not.to.be.undefined; - }); - it('should not set base more than once', () => { - expect(TF.baseFolder).to.be.undefined; - - const first = TF.initBase(); - const second = TF.initBase(); - - expect(second).to.equal(first); - }); - }); - describe('createTempFolder()', () => { - it('should create new folder within base path', () => { - expect(TF.baseFolder).to.be.undefined; - - const base = TF.initBase(); - const result = TF.createTempFolder(); - - expect(fs.statSync(result).isDirectory()).to.be.true; - expect(dirname(result)).to.equal(base); - - }); - it('should throw error', () => { - expect(TF.createTempFolder).to.throw('base folder not defined'); - }); - }); - describe('destroy()', () => { - it('should remove system base', () => { - TF.initBase(); - TF.destroy(); - expect(TF.baseFolder).to.be.undefined; - }); - }); -}); diff --git a/test/temp.test.js b/test/temp.test.js new file mode 100644 index 0000000..047eba5 --- /dev/null +++ b/test/temp.test.js @@ -0,0 +1,106 @@ +import assert from 'node:assert/strict'; +import { + afterEach, + beforeEach, + describe, + it +} from 'node:test'; +import { + existsSync, + readdirSync, + statSync +} from 'node:fs'; +import { dirname } from 'node:path'; + +import * as temp from '../src/common/temp.js'; + +describe('Temp Folder utility', function() { + + beforeEach(function() { + temp.destroy(); + }); + + afterEach(function() { + temp.destroy(); + }); + + describe('initBase()', function() { + + it('should not throw', function() { + assert.equal(temp.baseFolder, undefined); + + assert.doesNotThrow(function() { + temp.initBase(); + }); + + assert.notEqual(temp.baseFolder, undefined); + }); + + it('should set base to system temp', function() { + assert.equal(temp.baseFolder, undefined); + + const result = temp.initBase(); + + assert.equal(statSync(result).isDirectory(), true); + assert.deepEqual(readdirSync(result), []); + assert.equal(temp.baseFolder, result); + }); + + it('should not set base more than once', function() { + const first = temp.initBase(); + const second = temp.initBase(); + + assert.equal(second, first); + }); + }); + + describe('createTempFolder()', function() { + + it('should create new folder within base path', function() { + const base = temp.initBase(); + + const result = temp.createTempFolder(); + + assert.equal(statSync(result).isDirectory(), true); + assert.equal(dirname(result), base); + }); + + it('should create unique folders', function() { + temp.initBase(); + + const first = temp.createTempFolder(); + const second = temp.createTempFolder(); + + assert.notEqual(second, first); + assert.equal(existsSync(first), true); + assert.equal(existsSync(second), true); + }); + + it('should throw when base folder is not defined', function() { + assert.throws( + function() { + temp.createTempFolder(); + }, + /base folder not defined/ + ); + }); + }); + + describe('destroy()', function() { + + it('should remove system base', function() { + const base = temp.initBase(); + + temp.destroy(); + + assert.equal(temp.baseFolder, undefined); + assert.equal(existsSync(base), false); + }); + + it('should do nothing when base is not defined', function() { + assert.doesNotThrow(function() { + temp.destroy(); + }); + }); + }); +}); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 456c05f..0000000 --- a/yarn.lock +++ /dev/null @@ -1,3651 +0,0 @@ -# This file is generated by running "yarn install" inside your project. -# Manual changes might be lost - proceed with caution! - -__metadata: - version: 8 - cacheKey: 10 - -"@ampproject/remapping@npm:^2.2.0": - version: 2.3.0 - resolution: "@ampproject/remapping@npm:2.3.0" - dependencies: - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/f3451525379c68a73eb0a1e65247fbf28c0cccd126d93af21c75fceff77773d43c0d4a2d51978fb131aff25b5f2cb41a9fe48cc296e61ae65e679c4f6918b0ab - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/code-frame@npm:7.25.7" - dependencies: - "@babel/highlight": "npm:^7.25.7" - picocolors: "npm:^1.0.0" - checksum: 10/000fb8299fb35b6217d4f6c6580dcc1fa2f6c0f82d0a54b8a029966f633a8b19b490a7a906b56a94e9d8bee91c3bc44c74c44c33fb0abaa588202f6280186291 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.25.7": - version: 7.25.8 - resolution: "@babel/compat-data@npm:7.25.8" - checksum: 10/269fcb0d89e02e36c8a11e0c1b960a6b4204e88f59f20c374d28f8e318f4cd5ded42dfedc4b54162065e6a10f71c0de651f5ed3f9b45d3a4b52240196df85726 - languageName: node - linkType: hard - -"@babel/core@npm:^7.23.9": - version: 7.25.8 - resolution: "@babel/core@npm:7.25.8" - dependencies: - "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.25.7" - "@babel/generator": "npm:^7.25.7" - "@babel/helper-compilation-targets": "npm:^7.25.7" - "@babel/helper-module-transforms": "npm:^7.25.7" - "@babel/helpers": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.8" - "@babel/template": "npm:^7.25.7" - "@babel/traverse": "npm:^7.25.7" - "@babel/types": "npm:^7.25.8" - convert-source-map: "npm:^2.0.0" - debug: "npm:^4.1.0" - gensync: "npm:^1.0.0-beta.2" - json5: "npm:^2.2.3" - semver: "npm:^6.3.1" - checksum: 10/31eb1a8ca1a3cc0026060720eb290e68205d95c5c00fbd831e69ddc0810f5920b8eb2749db1889ac0a0312b6eddbf321d18a996a88858f3b75c9582bef9ec1e4 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/generator@npm:7.25.7" - dependencies: - "@babel/types": "npm:^7.25.7" - "@jridgewell/gen-mapping": "npm:^0.3.5" - "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^3.0.2" - checksum: 10/01542829621388077fa8a7464970c1db0f748f1482968dddf5332926afe4003f953cbe08e3bbbb0a335b11eba0126c9a81779bd1c5baed681a9ccec4ae63b217 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-compilation-targets@npm:7.25.7" - dependencies: - "@babel/compat-data": "npm:^7.25.7" - "@babel/helper-validator-option": "npm:^7.25.7" - browserslist: "npm:^4.24.0" - lru-cache: "npm:^5.1.1" - semver: "npm:^6.3.1" - checksum: 10/bbf9be8480da3f9a89e36e9ea2e1c76601014c1074ccada7c2edb1adeb3b62bc402cc4abaf8d16760734b25eceb187a9510ce44f6a7a6f696ccc74f69283625b - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-module-imports@npm:7.25.7" - dependencies: - "@babel/traverse": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10/94556712c27058ea35a1a39e21a3a9f067cd699405b64333d7d92b2b3d2f24d6f0ffa51aedba0b908e320acb1854e70d296259622e636fb021eeae9a6d996f01 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-module-transforms@npm:7.25.7" - dependencies: - "@babel/helper-module-imports": "npm:^7.25.7" - "@babel/helper-simple-access": "npm:^7.25.7" - "@babel/helper-validator-identifier": "npm:^7.25.7" - "@babel/traverse": "npm:^7.25.7" - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10/480309b1272ceaa985de1393f0e4c41aede0d5921ca644cec5aeaf43c8e4192b6dd56a58ef6d7e9acd02a43184ab45d3b241fc8c3a0a00f9dbb30235fd8a1181 - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-simple-access@npm:7.25.7" - dependencies: - "@babel/traverse": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10/42da1c358f2516337a4f2927c77ebb952907543b9f85d7cb1e2b5b5f6d808cdc081ee66a73e2ecdf48c315d9b0c2a81a857d5e1923ea210b8e81aba5e6cd2b53 - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-string-parser@npm:7.25.7" - checksum: 10/2b8de9fa86c3f3090a349f1ce6e8ee2618a95355cbdafc6f228d82fa4808c84bf3d1d25290c6616d0a18b26b6cfeb6ec2aeebf01404bc8c60051d0094209f0e6 - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-validator-identifier@npm:7.25.7" - checksum: 10/ec6934cc47fc35baaeb968414a372b064f14f7b130cf6489a014c9486b0fd2549b3c6c682cc1fc35080075e8e38d96aeb40342d63d09fc1a62510c8ce25cde1e - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helper-validator-option@npm:7.25.7" - checksum: 10/3c46cbdd666d176f90a0b7e952a0c6e92184b66633336eca79aca243d1f86085ec339a6e45c3d44efa9e03f1829b470a350ddafa70926af6bbf1ac611284f8d3 - languageName: node - linkType: hard - -"@babel/helpers@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/helpers@npm:7.25.7" - dependencies: - "@babel/template": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10/2632909f83aa99e8b0da4e10e5ab7fc4f0274e6497bb0f17071e004e037d25e4a595583620261dc21410a526fb32b4f7063c3e15e60ed7890a6f9b8ad52312c5 - languageName: node - linkType: hard - -"@babel/highlight@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/highlight@npm:7.25.7" - dependencies: - "@babel/helper-validator-identifier": "npm:^7.25.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 10/823be2523d246dbf80aab3cc81c2a36c6111b16ac2949ef06789da54387824c2bfaa88c6627cdeb4ba7151d047a5d6765e49ebd0b478aba09759250111e65e08 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.7, @babel/parser@npm:^7.25.8": - version: 7.25.8 - resolution: "@babel/parser@npm:7.25.8" - dependencies: - "@babel/types": "npm:^7.25.8" - bin: - parser: ./bin/babel-parser.js - checksum: 10/0396eb71e379903cedb43862f84ebb1bec809c41e82b4894d2e6e83b8e8bc636ba6eff45382e615baefdb2399ede76ca82247ecc3a9877ac16eb3140074a3276 - languageName: node - linkType: hard - -"@babel/template@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/template@npm:7.25.7" - dependencies: - "@babel/code-frame": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - checksum: 10/49e1e88d2eac17d31ae28d6cf13d6d29c1f49384c4f056a6751c065d6565c351e62c01ce6b11fef5edb5f3a77c87e114ea7326ca384fa618b4834e10cf9b20f3 - languageName: node - linkType: hard - -"@babel/traverse@npm:^7.25.7": - version: 7.25.7 - resolution: "@babel/traverse@npm:7.25.7" - dependencies: - "@babel/code-frame": "npm:^7.25.7" - "@babel/generator": "npm:^7.25.7" - "@babel/parser": "npm:^7.25.7" - "@babel/template": "npm:^7.25.7" - "@babel/types": "npm:^7.25.7" - debug: "npm:^4.3.1" - globals: "npm:^11.1.0" - checksum: 10/5b2d332fcd6bc78e6500c997e79f7e2a54dfb357e06f0908cb7f0cdd9bb54e7fd3c5673f45993849d433d01ea6076a6d04b825958f0cfa01288ad55ffa5c286f - languageName: node - linkType: hard - -"@babel/types@npm:^7.25.7, @babel/types@npm:^7.25.8": - version: 7.25.8 - resolution: "@babel/types@npm:7.25.8" - dependencies: - "@babel/helper-string-parser": "npm:^7.25.7" - "@babel/helper-validator-identifier": "npm:^7.25.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10/973108dbb189916bb87360f2beff43ae97f1b08f1c071bc6499d363cce48b3c71674bf3b59dfd617f8c5062d1c76dc2a64232bc07b6ccef831fd0c06162d44d9 - languageName: node - linkType: hard - -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" - dependencies: - eslint-visitor-keys: "npm:^3.3.0" - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/8d70bcdcd8cd279049183aca747d6c2ed7092a5cf0cf5916faac1ef37ffa74f0c245c2a3a3d3b9979d9dfdd4ca59257b4c5621db699d637b847a2c5e02f491c2 - languageName: node - linkType: hard - -"@eslint-community/regexpp@npm:^4.6.1": - version: 4.11.1 - resolution: "@eslint-community/regexpp@npm:4.11.1" - checksum: 10/934b6d3588c7f16b18d41efec4fdb89616c440b7e3256b8cb92cfd31ae12908600f2b986d6c1e61a84cbc10256b1dd3448cd1eec79904bd67ac365d0f1aba2e2 - languageName: node - linkType: hard - -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" - dependencies: - ajv: "npm:^6.12.4" - debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" - ignore: "npm:^5.2.0" - import-fresh: "npm:^3.2.1" - js-yaml: "npm:^4.1.0" - minimatch: "npm:^3.1.2" - strip-json-comments: "npm:^3.1.1" - checksum: 10/7a3b14f4b40fc1a22624c3f84d9f467a3d9ea1ca6e9a372116cb92507e485260359465b58e25bcb6c9981b155416b98c9973ad9b796053fd7b3f776a6946bce8 - languageName: node - linkType: hard - -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10/7562b21be10c2adbfa4aa5bb2eccec2cb9ac649a3569560742202c8d1cb6c931ce634937a2f0f551e078403a1c1285d6c2c0aa345dafc986149665cd69fe8b59 - languageName: node - linkType: hard - -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" - dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.3" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10/524df31e61a85392a2433bf5d03164e03da26c03d009f27852e7dcfdafbc4a23f17f021dacf88e0a7a9fe04ca032017945d19b57a16e2676d9114c22a53a9d11 - languageName: node - linkType: hard - -"@humanwhocodes/module-importer@npm:^1.0.1": - version: 1.0.1 - resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 10/e993950e346331e5a32eefb27948ecdee2a2c4ab3f072b8f566cd213ef485dd50a3ca497050608db91006f5479e43f91a439aef68d2a313bd3ded06909c7c5b3 - languageName: node - linkType: hard - -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10/05bb99ed06c16408a45a833f03a732f59bf6184795d4efadd33238ff8699190a8c871ad1121241bb6501589a9598dc83bf25b99dcbcf41e155cdf36e35e937a3 - languageName: node - linkType: hard - -"@isaacs/cliui@npm:^8.0.2": - version: 8.0.2 - resolution: "@isaacs/cliui@npm:8.0.2" - dependencies: - string-width: "npm:^5.1.2" - string-width-cjs: "npm:string-width@^4.2.0" - strip-ansi: "npm:^7.0.1" - strip-ansi-cjs: "npm:strip-ansi@^6.0.1" - wrap-ansi: "npm:^8.1.0" - wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" - checksum: 10/e9ed5fd27c3aec1095e3a16e0c0cf148d1fee55a38665c35f7b3f86a9b5d00d042ddaabc98e8a1cb7463b9378c15f22a94eb35e99469c201453eb8375191f243 - languageName: node - linkType: hard - -"@istanbuljs/load-nyc-config@npm:^1.0.0": - version: 1.1.0 - resolution: "@istanbuljs/load-nyc-config@npm:1.1.0" - dependencies: - camelcase: "npm:^5.3.1" - find-up: "npm:^4.1.0" - get-package-type: "npm:^0.1.0" - js-yaml: "npm:^3.13.1" - resolve-from: "npm:^5.0.0" - checksum: 10/b000a5acd8d4fe6e34e25c399c8bdbb5d3a202b4e10416e17bfc25e12bab90bb56d33db6089ae30569b52686f4b35ff28ef26e88e21e69821d2b85884bd055b8 - languageName: node - linkType: hard - -"@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": - version: 0.1.3 - resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 10/a9b1e49acdf5efc2f5b2359f2df7f90c5c725f2656f16099e8b2cd3a000619ecca9fc48cf693ba789cf0fd989f6e0df6a22bc05574be4223ecdbb7997d04384b - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": - version: 0.3.5 - resolution: "@jridgewell/gen-mapping@npm:0.3.5" - dependencies: - "@jridgewell/set-array": "npm:^1.2.1" - "@jridgewell/sourcemap-codec": "npm:^1.4.10" - "@jridgewell/trace-mapping": "npm:^0.3.24" - checksum: 10/81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2 - languageName: node - linkType: hard - -"@jridgewell/resolve-uri@npm:^3.1.0": - version: 3.1.2 - resolution: "@jridgewell/resolve-uri@npm:3.1.2" - checksum: 10/97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d - languageName: node - linkType: hard - -"@jridgewell/set-array@npm:^1.2.1": - version: 1.2.1 - resolution: "@jridgewell/set-array@npm:1.2.1" - checksum: 10/832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": - version: 1.5.0 - resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" - checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": - version: 0.3.25 - resolution: "@jridgewell/trace-mapping@npm:0.3.25" - dependencies: - "@jridgewell/resolve-uri": "npm:^3.1.0" - "@jridgewell/sourcemap-codec": "npm:^1.4.14" - checksum: 10/dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc - languageName: node - linkType: hard - -"@kwsites/file-exists@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/file-exists@npm:1.1.1" - dependencies: - debug: "npm:^4.1.1" - checksum: 10/4ff945de7293285133aeae759caddc71e73c4a44a12fac710fdd4f574cce2671a3f89d8165fdb03d383cfc97f3f96f677d8de3c95133da3d0e12a123a23109fe - languageName: node - linkType: hard - -"@kwsites/promise-deferred@npm:^1.1.1": - version: 1.1.1 - resolution: "@kwsites/promise-deferred@npm:1.1.1" - checksum: 10/07455477a0123d9a38afb503739eeff2c5424afa8d3dbdcc7f9502f13604488a4b1d9742fc7288832a52a6422cf1e1c0a1d51f69a39052f14d27c9a0420b6629 - languageName: node - linkType: hard - -"@nodelib/fs.scandir@npm:2.1.5": - version: 2.1.5 - resolution: "@nodelib/fs.scandir@npm:2.1.5" - dependencies: - "@nodelib/fs.stat": "npm:2.0.5" - run-parallel: "npm:^1.1.9" - checksum: 10/6ab2a9b8a1d67b067922c36f259e3b3dfd6b97b219c540877a4944549a4d49ea5ceba5663905ab5289682f1f3c15ff441d02f0447f620a42e1cb5e1937174d4b - languageName: node - linkType: hard - -"@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": - version: 2.0.5 - resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 10/012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 - languageName: node - linkType: hard - -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": - version: 1.2.8 - resolution: "@nodelib/fs.walk@npm:1.2.8" - dependencies: - "@nodelib/fs.scandir": "npm:2.1.5" - fastq: "npm:^1.6.0" - checksum: 10/40033e33e96e97d77fba5a238e4bba4487b8284678906a9f616b5579ddaf868a18874c0054a75402c9fbaaa033a25ceae093af58c9c30278e35c23c9479e79b0 - languageName: node - linkType: hard - -"@npmcli/agent@npm:^2.0.0": - version: 2.2.2 - resolution: "@npmcli/agent@npm:2.2.2" - dependencies: - agent-base: "npm:^7.1.0" - http-proxy-agent: "npm:^7.0.0" - https-proxy-agent: "npm:^7.0.1" - lru-cache: "npm:^10.0.1" - socks-proxy-agent: "npm:^8.0.3" - checksum: 10/96fc0036b101bae5032dc2a4cd832efb815ce9b33f9ee2f29909ee49d96a0026b3565f73c507a69eb8603f5cb32e0ae45a70cab1e2655990a4e06ae99f7f572a - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.0": - version: 3.1.1 - resolution: "@npmcli/fs@npm:3.1.1" - dependencies: - semver: "npm:^7.3.5" - checksum: 10/1e0e04087049b24b38bc0b30d87a9388ee3ca1d3fdfc347c2f77d84fcfe6a51f250bc57ba2c1f614d7e4285c6c62bf8c769bc19aa0949ea39e5b043ee023b0bd - languageName: node - linkType: hard - -"@pkgjs/parseargs@npm:^0.11.0": - version: 0.11.0 - resolution: "@pkgjs/parseargs@npm:0.11.0" - checksum: 10/115e8ceeec6bc69dff2048b35c0ab4f8bbee12d8bb6c1f4af758604586d802b6e669dcb02dda61d078de42c2b4ddce41b3d9e726d7daa6b4b850f4adbf7333ff - languageName: node - linkType: hard - -"@simple-git/args-pathspec@npm:^1.0.3": - version: 1.0.3 - resolution: "@simple-git/args-pathspec@npm:1.0.3" - checksum: 10/74bcc00123cd0da800fc5a6417f83f2f4fce66eb38749efc2ca3b6e4c431c6edaabe80c5834714c155f6ba07582069b182420eda27a601353fb5a3b48917d7e0 - languageName: node - linkType: hard - -"@simple-git/argv-parser@npm:^1.1.0": - version: 1.1.1 - resolution: "@simple-git/argv-parser@npm:1.1.1" - dependencies: - "@simple-git/args-pathspec": "npm:^1.0.3" - checksum: 10/89f49ee1e9a936318d443a21b04fa8adcd7a3fa4d2d9ebc947d6d4f347d65db5fbcfec37f3d75711f2724d7886506f3003144735e244e1eea6badef58696d99f - languageName: node - linkType: hard - -"@sinonjs/commons@npm:^3.0.1": - version: 3.0.1 - resolution: "@sinonjs/commons@npm:3.0.1" - dependencies: - type-detect: "npm:4.0.8" - checksum: 10/a0af217ba7044426c78df52c23cedede6daf377586f3ac58857c565769358ab1f44ebf95ba04bbe38814fba6e316ca6f02870a009328294fc2c555d0f85a7117 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^13.0.1": - version: 13.0.2 - resolution: "@sinonjs/fake-timers@npm:13.0.2" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - checksum: 10/77cca5c548e2529931908c48ac375f162ee901bc52110197b4c470b2535c6c571f9ecd4fa12157f4d2ae174c5391f03940fb563a681a691fb44204a0ef3ded35 - languageName: node - linkType: hard - -"@sinonjs/fake-timers@npm:^13.0.5": - version: 13.0.5 - resolution: "@sinonjs/fake-timers@npm:13.0.5" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - checksum: 10/11ee417968fc4dce1896ab332ac13f353866075a9d2a88ed1f6258f17cc4f7d93e66031b51fcddb8c203aa4d53fd980b0ae18aba06269f4682164878a992ec3f - languageName: node - linkType: hard - -"@sinonjs/samsam@npm:^8.0.1": - version: 8.0.2 - resolution: "@sinonjs/samsam@npm:8.0.2" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - lodash.get: "npm:^4.4.2" - type-detect: "npm:^4.1.0" - checksum: 10/58ca9752e8e835a09ed275f8edf8da2720fe95c0c02f6bcb90ad7f86fdceb393f35f744194b705dd94216228646ec0aedbb814e245eb869b940dcf1266b7a533 - languageName: node - linkType: hard - -"@sinonjs/text-encoding@npm:^0.7.3": - version: 0.7.3 - resolution: "@sinonjs/text-encoding@npm:0.7.3" - checksum: 10/f0cc89bae36e7ce159187dece7800b78831288f1913e9ae8cf8a878da5388232d2049740f6f4a43ec4b43b8ad1beb55f919f45eb9a577adb4a2a6eacb27b25fc - languageName: node - linkType: hard - -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10/c6fe89a505e513a7592e1438280db1c075764793a2397877ff1351721fe8792a966a5359769e30242b3cd023f2efb9e63ca2ca88019d73b564488cc20e3eab12 - languageName: node - linkType: hard - -"abbrev@npm:^2.0.0": - version: 2.0.0 - resolution: "abbrev@npm:2.0.0" - checksum: 10/ca0a54e35bea4ece0ecb68a47b312e1a9a6f772408d5bcb9051230aaa94b0460671c5b5c9cb3240eb5b7bc94c52476550eb221f65a0bbd0145bdc9f3113a6707 - languageName: node - linkType: hard - -"acorn-jsx@npm:^5.3.2": - version: 5.3.2 - resolution: "acorn-jsx@npm:5.3.2" - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 10/d4371eaef7995530b5b5ca4183ff6f062ca17901a6d3f673c9ac011b01ede37e7a1f7f61f8f5cfe709e88054757bb8f3277dc4061087cdf4f2a1f90ccbcdb977 - languageName: node - linkType: hard - -"acorn@npm:^8.9.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" - bin: - acorn: bin/acorn - checksum: 10/d08c2d122bba32d0861e0aa840b2ee25946c286d5dc5990abca991baf8cdbfbe199b05aacb221b979411a2fea36f83e26b5ac4f6b4e0ce49038c62316c1848f0 - languageName: node - linkType: hard - -"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0, agent-base@npm:^7.1.1": - version: 7.1.1 - resolution: "agent-base@npm:7.1.1" - dependencies: - debug: "npm:^4.3.4" - checksum: 10/c478fec8f79953f118704d007a38f2a185458853f5c45579b9669372bd0e12602e88dc2ad0233077831504f7cd6fcc8251c383375bba5eaaf563b102938bda26 - languageName: node - linkType: hard - -"aggregate-error@npm:^3.0.0": - version: 3.1.0 - resolution: "aggregate-error@npm:3.1.0" - dependencies: - clean-stack: "npm:^2.0.0" - indent-string: "npm:^4.0.0" - checksum: 10/1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 - languageName: node - linkType: hard - -"ajv@npm:^6.12.4": - version: 6.12.6 - resolution: "ajv@npm:6.12.6" - dependencies: - fast-deep-equal: "npm:^3.1.1" - fast-json-stable-stringify: "npm:^2.0.0" - json-schema-traverse: "npm:^0.4.1" - uri-js: "npm:^4.2.2" - checksum: 10/48d6ad21138d12eb4d16d878d630079a2bda25a04e745c07846a4ad768319533031e28872a9b3c5790fa1ec41aabdf2abed30a56e5a03ebc2cf92184b8ee306c - languageName: node - linkType: hard - -"ansi-colors@npm:^4.1.3": - version: 4.1.3 - resolution: "ansi-colors@npm:4.1.3" - checksum: 10/43d6e2fc7b1c6e4dc373de708ee76311ec2e0433e7e8bd3194e7ff123ea6a747428fc61afdcf5969da5be3a5f0fd054602bec56fc0ebe249ce2fcde6e649e3c2 - languageName: node - linkType: hard - -"ansi-regex@npm:^5.0.1": - version: 5.0.1 - resolution: "ansi-regex@npm:5.0.1" - checksum: 10/2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b - languageName: node - linkType: hard - -"ansi-regex@npm:^6.0.1": - version: 6.1.0 - resolution: "ansi-regex@npm:6.1.0" - checksum: 10/495834a53b0856c02acd40446f7130cb0f8284f4a39afdab20d5dc42b2e198b1196119fe887beed8f9055c4ff2055e3b2f6d4641d0be018cdfb64fedf6fc1aac - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: 10/d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - -"ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": - version: 4.3.0 - resolution: "ansi-styles@npm:4.3.0" - dependencies: - color-convert: "npm:^2.0.1" - checksum: 10/b4494dfbfc7e4591b4711a396bd27e540f8153914123dccb4cdbbcb514015ada63a3809f362b9d8d4f6b17a706f1d7bea3c6f974b15fa5ae76b5b502070889ff - languageName: node - linkType: hard - -"ansi-styles@npm:^6.1.0": - version: 6.2.1 - resolution: "ansi-styles@npm:6.2.1" - checksum: 10/70fdf883b704d17a5dfc9cde206e698c16bcd74e7f196ab821511651aee4f9f76c9514bdfa6ca3a27b5e49138b89cb222a28caf3afe4567570139577f991df32 - languageName: node - linkType: hard - -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: "npm:^3.0.0" - picomatch: "npm:^2.0.4" - checksum: 10/3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 - languageName: node - linkType: hard - -"append-transform@npm:^2.0.0": - version: 2.0.0 - resolution: "append-transform@npm:2.0.0" - dependencies: - default-require-extensions: "npm:^3.0.0" - checksum: 10/f26f393bf7a428fd1bb18f2758a819830a582243310c5170edb3f98fdc5a535333d02b952f7c2d9b14522bd8ead5b132a0b15000eca18fa9f49172963ebbc231 - languageName: node - linkType: hard - -"archy@npm:^1.0.0": - version: 1.0.0 - resolution: "archy@npm:1.0.0" - checksum: 10/d7928049a57988b86df3f4de75ca16a4252ccee591d085c627e649fc54c5ae5daa833f17aa656bd825bd00bc0a2756ae03d2b983050bdbda1046b6d832bf7303 - languageName: node - linkType: hard - -"argparse@npm:^1.0.7": - version: 1.0.10 - resolution: "argparse@npm:1.0.10" - dependencies: - sprintf-js: "npm:~1.0.2" - checksum: 10/c6a621343a553ff3779390bb5ee9c2263d6643ebcd7843227bdde6cc7adbed796eb5540ca98db19e3fd7b4714e1faa51551f8849b268bb62df27ddb15cbcd91e - languageName: node - linkType: hard - -"argparse@npm:^2.0.1": - version: 2.0.1 - resolution: "argparse@npm:2.0.1" - checksum: 10/18640244e641a417ec75a9bd38b0b2b6b95af5199aa241b131d4b2fb206f334d7ecc600bd194861610a5579084978bfcbb02baa399dbe442d56d0ae5e60dbaef - languageName: node - linkType: hard - -"assertion-error@npm:^1.1.0": - version: 1.1.0 - resolution: "assertion-error@npm:1.1.0" - checksum: 10/fd9429d3a3d4fd61782eb3962ae76b6d08aa7383123fca0596020013b3ebd6647891a85b05ce821c47d1471ed1271f00b0545cf6a4326cf2fc91efcc3b0fbecf - languageName: node - linkType: hard - -"balanced-match@npm:^1.0.0": - version: 1.0.2 - resolution: "balanced-match@npm:1.0.2" - checksum: 10/9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 - languageName: node - linkType: hard - -"binary-extensions@npm:^2.0.0": - version: 2.3.0 - resolution: "binary-extensions@npm:2.3.0" - checksum: 10/bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 - languageName: node - linkType: hard - -"brace-expansion@npm:^1.1.7": - version: 1.1.11 - resolution: "brace-expansion@npm:1.1.11" - dependencies: - balanced-match: "npm:^1.0.0" - concat-map: "npm:0.0.1" - checksum: 10/faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 - languageName: node - linkType: hard - -"brace-expansion@npm:^2.0.1": - version: 2.0.1 - resolution: "brace-expansion@npm:2.0.1" - dependencies: - balanced-match: "npm:^1.0.0" - checksum: 10/a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 - languageName: node - linkType: hard - -"braces@npm:^3.0.3, braces@npm:~3.0.2": - version: 3.0.3 - resolution: "braces@npm:3.0.3" - dependencies: - fill-range: "npm:^7.1.1" - checksum: 10/fad11a0d4697a27162840b02b1fad249c1683cbc510cd5bf1a471f2f8085c046d41094308c577a50a03a579dd99d5a6b3724c4b5e8b14df2c4443844cfcda2c6 - languageName: node - linkType: hard - -"browser-stdout@npm:^1.3.1": - version: 1.3.1 - resolution: "browser-stdout@npm:1.3.1" - checksum: 10/ac70a84e346bb7afc5045ec6f22f6a681b15a4057447d4cc1c48a25c6dedb302a49a46dd4ddfb5cdd9c96e0c905a8539be1b98ae7bc440512152967009ec7015 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": - version: 4.24.0 - resolution: "browserslist@npm:4.24.0" - dependencies: - caniuse-lite: "npm:^1.0.30001663" - electron-to-chromium: "npm:^1.5.28" - node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.0" - bin: - browserslist: cli.js - checksum: 10/26c1b8ba257a0b51b102080ba9d42945af2abaa8c4cf6da21cd47b3f123fc1e81640203b293214356c2c17d9d265bb3a5ed428b6d302f383576dd6ce8fd5036c - languageName: node - linkType: hard - -"cacache@npm:^18.0.0": - version: 18.0.4 - resolution: "cacache@npm:18.0.4" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10/ca2f7b2d3003f84d362da9580b5561058ccaecd46cba661cbcff0375c90734b610520d46b472a339fd032d91597ad6ed12dde8af81571197f3c9772b5d35b104 - languageName: node - linkType: hard - -"caching-transform@npm:^4.0.0": - version: 4.0.0 - resolution: "caching-transform@npm:4.0.0" - dependencies: - hasha: "npm:^5.0.0" - make-dir: "npm:^3.0.0" - package-hash: "npm:^4.0.0" - write-file-atomic: "npm:^3.0.0" - checksum: 10/7e7ca628511ab18c86eea1231834d2591de29a13ae771a7d9ab85be8c6e53e45c5a5b0d0d95d4a3274fc4f26c16956a98162e40c191c131204b5d5aa949660b5 - languageName: node - linkType: hard - -"callsites@npm:^3.0.0": - version: 3.1.0 - resolution: "callsites@npm:3.1.0" - checksum: 10/072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 - languageName: node - linkType: hard - -"camelcase@npm:^5.0.0, camelcase@npm:^5.3.1": - version: 5.3.1 - resolution: "camelcase@npm:5.3.1" - checksum: 10/e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b - languageName: node - linkType: hard - -"camelcase@npm:^6.0.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 10/8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d - languageName: node - linkType: hard - -"caniuse-lite@npm:^1.0.30001663": - version: 1.0.30001668 - resolution: "caniuse-lite@npm:1.0.30001668" - checksum: 10/4a14acbc999a855e6a91a3ae4ca670f202ceabb4b0e75f8eaef153fafe33ae5ea0de7ac99c078d6b724c8f60b14b1ea24d7c544398e5fd077c418e3f029559ff - languageName: node - linkType: hard - -"chai@npm:^4.5.0": - version: 4.5.0 - resolution: "chai@npm:4.5.0" - dependencies: - assertion-error: "npm:^1.1.0" - check-error: "npm:^1.0.3" - deep-eql: "npm:^4.1.3" - get-func-name: "npm:^2.0.2" - loupe: "npm:^2.3.6" - pathval: "npm:^1.1.1" - type-detect: "npm:^4.1.0" - checksum: 10/cde341aee15b0a51559c7cfc20788dcfb4d586a498cfb93b937bb568fd45c777b73b1461274be6092b6bf868adb4e3a63f3fec13c89f7d8fb194f84c6fa42d5f - languageName: node - linkType: hard - -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: 10/3d1d103433166f6bfe82ac75724951b33769675252d8417317363ef9d54699b7c3b2d46671b772b893a8e50c3ece70c4b933c73c01e81bc60ea4df9b55afa303 - languageName: node - linkType: hard - -"chalk@npm:^4.0.0, chalk@npm:^4.1.0": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10/cb3f3e594913d63b1814d7ca7c9bafbf895f75fbf93b92991980610dfd7b48500af4e3a5d4e3a8f337990a96b168d7eb84ee55efdce965e2ee8efc20f8c8f139 - languageName: node - linkType: hard - -"check-error@npm:^1.0.3": - version: 1.0.3 - resolution: "check-error@npm:1.0.3" - dependencies: - get-func-name: "npm:^2.0.2" - checksum: 10/e2131025cf059b21080f4813e55b3c480419256914601750b0fee3bd9b2b8315b531e551ef12560419b8b6d92a3636511322752b1ce905703239e7cc451b6399 - languageName: node - linkType: hard - -"chokidar@npm:^3.5.3": - version: 3.6.0 - resolution: "chokidar@npm:3.6.0" - dependencies: - anymatch: "npm:~3.1.2" - braces: "npm:~3.0.2" - fsevents: "npm:~2.3.2" - glob-parent: "npm:~5.1.2" - is-binary-path: "npm:~2.1.0" - is-glob: "npm:~4.0.1" - normalize-path: "npm:~3.0.0" - readdirp: "npm:~3.6.0" - dependenciesMeta: - fsevents: - optional: true - checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df - languageName: node - linkType: hard - -"chownr@npm:^2.0.0": - version: 2.0.0 - resolution: "chownr@npm:2.0.0" - checksum: 10/c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f - languageName: node - linkType: hard - -"clean-stack@npm:^2.0.0": - version: 2.2.0 - resolution: "clean-stack@npm:2.2.0" - checksum: 10/2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 - languageName: node - linkType: hard - -"cliui@npm:^6.0.0": - version: 6.0.0 - resolution: "cliui@npm:6.0.0" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" - wrap-ansi: "npm:^6.2.0" - checksum: 10/44afbcc29df0899e87595590792a871cd8c4bc7d6ce92832d9ae268d141a77022adafca1aeaeccff618b62a613b8354e57fe22a275c199ec04baf00d381ef6ab - languageName: node - linkType: hard - -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" - wrap-ansi: "npm:^7.0.0" - checksum: 10/db858c49af9d59a32d603987e6fddaca2ce716cd4602ba5a2bb3a5af1351eebe82aba8dff3ef3e1b331f7fa9d40ca66e67bdf8e7c327ce0ea959747ead65c0ef - languageName: node - linkType: hard - -"cliui@npm:^8.0.1": - version: 8.0.1 - resolution: "cliui@npm:8.0.1" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.1" - wrap-ansi: "npm:^7.0.0" - checksum: 10/eaa5561aeb3135c2cddf7a3b3f562fc4238ff3b3fc666869ef2adf264be0f372136702f16add9299087fb1907c2e4ec5dbfe83bd24bce815c70a80c6c1a2e950 - languageName: node - linkType: hard - -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 10/ffa319025045f2973919d155f25e7c00d08836b6b33ea2d205418c59bd63a665d713c52d9737a9e0fe467fb194b40fbef1d849bae80d674568ee220a31ef3d10 - languageName: node - linkType: hard - -"color-convert@npm:^2.0.1": - version: 2.0.1 - resolution: "color-convert@npm:2.0.1" - dependencies: - color-name: "npm:~1.1.4" - checksum: 10/fa00c91b4332b294de06b443923246bccebe9fab1b253f7fe1772d37b06a2269b4039a85e309abe1fe11b267b11c08d1d0473fda3badd6167f57313af2887a64 - languageName: node - linkType: hard - -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 10/09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - -"color-name@npm:~1.1.4": - version: 1.1.4 - resolution: "color-name@npm:1.1.4" - checksum: 10/b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 - languageName: node - linkType: hard - -"commondir@npm:^1.0.1": - version: 1.0.1 - resolution: "commondir@npm:1.0.1" - checksum: 10/4620bc4936a4ef12ce7dfcd272bb23a99f2ad68889a4e4ad766c9f8ad21af982511934d6f7050d4a8bde90011b1c15d56e61a1b4576d9913efbf697a20172d6c - languageName: node - linkType: hard - -"concat-map@npm:0.0.1": - version: 0.0.1 - resolution: "concat-map@npm:0.0.1" - checksum: 10/9680699c8e2b3af0ae22592cb764acaf973f292a7b71b8a06720233011853a58e256c89216a10cbe889727532fd77f8bcd49a760cedfde271b8e006c20e079f2 - languageName: node - linkType: hard - -"convert-source-map@npm:^1.7.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: 10/dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 - languageName: node - linkType: hard - -"convert-source-map@npm:^2.0.0": - version: 2.0.0 - resolution: "convert-source-map@npm:2.0.0" - checksum: 10/c987be3ec061348cdb3c2bfb924bec86dea1eacad10550a85ca23edb0fe3556c3a61c7399114f3331ccb3499d7fd0285ab24566e5745929412983494c3926e15 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.6 - resolution: "cross-spawn@npm:7.0.6" - dependencies: - path-key: "npm:^3.1.0" - shebang-command: "npm:^2.0.0" - which: "npm:^2.0.1" - checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5": - version: 4.3.7 - resolution: "debug@npm:4.3.7" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a - languageName: node - linkType: hard - -"debug@npm:^4.4.0": - version: 4.4.1 - resolution: "debug@npm:4.4.1" - dependencies: - ms: "npm:^2.1.3" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10/8e2709b2144f03c7950f8804d01ccb3786373df01e406a0f66928e47001cf2d336cbed9ee137261d4f90d68d8679468c755e3548ed83ddacdc82b194d2468afe - languageName: node - linkType: hard - -"decamelize@npm:^1.2.0": - version: 1.2.0 - resolution: "decamelize@npm:1.2.0" - checksum: 10/ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"decamelize@npm:^4.0.0": - version: 4.0.0 - resolution: "decamelize@npm:4.0.0" - checksum: 10/b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 - languageName: node - linkType: hard - -"deep-eql@npm:^4.1.3": - version: 4.1.4 - resolution: "deep-eql@npm:4.1.4" - dependencies: - type-detect: "npm:^4.0.0" - checksum: 10/f04f4d581f044a824a6322fe4f68fbee4d6780e93fc710cd9852cbc82bfc7010df00f0e05894b848abbe14dc3a25acac44f424e181ae64d12f2ab9d0a875a5ef - languageName: node - linkType: hard - -"deep-is@npm:^0.1.3": - version: 0.1.4 - resolution: "deep-is@npm:0.1.4" - checksum: 10/ec12d074aef5ae5e81fa470b9317c313142c9e8e2afe3f8efa124db309720db96d1d222b82b84c834e5f87e7a614b44a4684b6683583118b87c833b3be40d4d8 - languageName: node - linkType: hard - -"default-require-extensions@npm:^3.0.0": - version: 3.0.1 - resolution: "default-require-extensions@npm:3.0.1" - dependencies: - strip-bom: "npm:^4.0.0" - checksum: 10/45882fc971dd157faf6716ced04c15cf252c0a2d6f5c5844b66ca49f46ed03396a26cd940771aa569927aee22923a961bab789e74b25aabc94d90742c9dd1217 - languageName: node - linkType: hard - -"diff@npm:^5.2.0": - version: 5.2.0 - resolution: "diff@npm:5.2.0" - checksum: 10/01b7b440f83a997350a988e9d2f558366c0f90f15be19f4aa7f1bb3109a4e153dfc3b9fbf78e14ea725717017407eeaa2271e3896374a0181e8f52445740846d - languageName: node - linkType: hard - -"diff@npm:^7.0.0": - version: 7.0.0 - resolution: "diff@npm:7.0.0" - checksum: 10/e9b8e48d054c9c0c093c65ce8e2637af94b35f2427001607b14e5e0589e534ea3413a7f91ebe6d7c5a1494ace49cb7c7c3972f442ddd96a4767ff091999a082e - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10/b4b28f1df5c563f7d876e7461254a4597b8cabe915abe94d7c5d1633fed263fcf9a85e8d3836591fc2d040108e822b0d32758e5ec1fe31c590dc7e08086e3e48 - languageName: node - linkType: hard - -"dotenv@npm:^17.3.1": - version: 17.3.1 - resolution: "dotenv@npm:17.3.1" - checksum: 10/4dde6571dff22c2323a3e33ac25e1e7d51c4b6d60dc884f59e3efe85c8fd3cc8800d6b3925d05c46b19dca08cba821a0a24e22f75a1b9b768c859b98bb927b04 - languageName: node - linkType: hard - -"eastasianwidth@npm:^0.2.0": - version: 0.2.0 - resolution: "eastasianwidth@npm:0.2.0" - checksum: 10/9b1d3e1baefeaf7d70799db8774149cef33b97183a6addceeba0cf6b85ba23ee2686f302f14482006df32df75d32b17c509c143a3689627929e4a8efaf483952 - languageName: node - linkType: hard - -"electron-to-chromium@npm:^1.5.28": - version: 1.5.38 - resolution: "electron-to-chromium@npm:1.5.38" - checksum: 10/862f57480d42e4218a7be7ce71847fb5cf00423bc0b8b9168a978edadfd77fdcef2eb09e9c37821a4dd73b034a72d7cd1dbf2f096297abcd7e8664cc571602d4 - languageName: node - linkType: hard - -"emoji-regex@npm:^8.0.0": - version: 8.0.0 - resolution: "emoji-regex@npm:8.0.0" - checksum: 10/c72d67a6821be15ec11997877c437491c313d924306b8da5d87d2a2bcc2cec9903cb5b04ee1a088460501d8e5b44f10df82fdc93c444101a7610b80c8b6938e1 - languageName: node - linkType: hard - -"emoji-regex@npm:^9.2.2": - version: 9.2.2 - resolution: "emoji-regex@npm:9.2.2" - checksum: 10/915acf859cea7131dac1b2b5c9c8e35c4849e325a1d114c30adb8cd615970f6dca0e27f64f3a4949d7d6ed86ecd79a1c5c63f02e697513cddd7b5835c90948b8 - languageName: node - linkType: hard - -"encoding@npm:^0.1.13": - version: 0.1.13 - resolution: "encoding@npm:0.1.13" - dependencies: - iconv-lite: "npm:^0.6.2" - checksum: 10/bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"env-paths@npm:^2.2.0": - version: 2.2.1 - resolution: "env-paths@npm:2.2.1" - checksum: 10/65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e - languageName: node - linkType: hard - -"err-code@npm:^2.0.2": - version: 2.0.3 - resolution: "err-code@npm:2.0.3" - checksum: 10/1d20d825cdcce8d811bfbe86340f4755c02655a7feb2f13f8c880566d9d72a3f6c92c192a6867632e490d6da67b678271f46e01044996a6443e870331100dfdd - languageName: node - linkType: hard - -"es6-error@npm:^4.0.1": - version: 4.1.1 - resolution: "es6-error@npm:4.1.1" - checksum: 10/48483c25701dc5a6376f39bbe2eaf5da0b505607ec5a98cd3ade472c1939242156660636e2e508b33211e48e88b132d245341595c067bd4a95ac79fa7134da06 - languageName: node - linkType: hard - -"escalade@npm:^3.1.1, escalade@npm:^3.2.0": - version: 3.2.0 - resolution: "escalade@npm:3.2.0" - checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: 10/6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 - languageName: node - linkType: hard - -"escape-string-regexp@npm:^4.0.0": - version: 4.0.0 - resolution: "escape-string-regexp@npm:4.0.0" - checksum: 10/98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 - languageName: node - linkType: hard - -"eslint-plugin-es@npm:^3.0.0": - version: 3.0.1 - resolution: "eslint-plugin-es@npm:3.0.1" - dependencies: - eslint-utils: "npm:^2.0.0" - regexpp: "npm:^3.0.0" - peerDependencies: - eslint: ">=4.19.1" - checksum: 10/9814e6305183edfdff7d99cbc0f95f0aed1446045cbd1d4f28e7be0903d0013880f0aaf04486a27de96bfb2f5a746bea97cbb238f9b0035cb378d48d179a0a1b - languageName: node - linkType: hard - -"eslint-plugin-node@npm:^11.1.0": - version: 11.1.0 - resolution: "eslint-plugin-node@npm:11.1.0" - dependencies: - eslint-plugin-es: "npm:^3.0.0" - eslint-utils: "npm:^2.0.0" - ignore: "npm:^5.1.1" - minimatch: "npm:^3.0.4" - resolve: "npm:^1.10.1" - semver: "npm:^6.1.0" - peerDependencies: - eslint: ">=5.16.0" - checksum: 10/bda540f390a84d835989f21f56743f3aa8f41fd9b53359d635c116632c86af92d70d8e6449ddd18860e6241f9cef04fc90c37eb192a9047c3c3a46de6145c30c - languageName: node - linkType: hard - -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" - dependencies: - esrecurse: "npm:^4.3.0" - estraverse: "npm:^5.2.0" - checksum: 10/5c660fb905d5883ad018a6fea2b49f3cb5b1cbf2cd4bd08e98646e9864f9bc2c74c0839bed2d292e90a4a328833accc197c8f0baed89cbe8d605d6f918465491 - languageName: node - linkType: hard - -"eslint-utils@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-utils@npm:2.1.0" - dependencies: - eslint-visitor-keys: "npm:^1.1.0" - checksum: 10/a7e43a5154a16a90c021cabeb160c3668cccbcf6474ccb2a7d7762698582398f3b938c5330909b858ef7c21182edfc9786dbf89ed7b294f51b7659a378bf7cec - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^1.1.0": - version: 1.3.0 - resolution: "eslint-visitor-keys@npm:1.3.0" - checksum: 10/595ab230e0fcb52f86ba0986a9a473b9fcae120f3729b43f1157f88f27f8addb1e545c4e3d444185f2980e281ca15be5ada6f65b4599eec227cf30e41233b762 - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": - version: 3.4.3 - resolution: "eslint-visitor-keys@npm:3.4.3" - checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b - languageName: node - linkType: hard - -"eslint@npm:^8.57.0": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.1" - "@humanwhocodes/config-array": "npm:^0.13.0" - "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" - ajv: "npm:^6.12.4" - chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" - debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" - escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" - esutils: "npm:^2.0.2" - fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" - find-up: "npm:^5.0.0" - glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" - ignore: "npm:^5.2.0" - imurmurhash: "npm:^0.1.4" - is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" - json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" - lodash.merge: "npm:^4.6.2" - minimatch: "npm:^3.1.2" - natural-compare: "npm:^1.4.0" - optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" - bin: - eslint: bin/eslint.js - checksum: 10/5504fa24879afdd9f9929b2fbfc2ee9b9441a3d464efd9790fbda5f05738858530182029f13323add68d19fec749d3ab4a70320ded091ca4432b1e9cc4ed104c - languageName: node - linkType: hard - -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: "npm:^8.9.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10/255ab260f0d711a54096bdeda93adff0eadf02a6f9b92f02b323e83a2b7fc258797919437ad331efec3930475feb0142c5ecaaf3cdab4befebd336d47d3f3134 - languageName: node - linkType: hard - -"esprima@npm:^4.0.0": - version: 4.0.1 - resolution: "esprima@npm:4.0.1" - bin: - esparse: ./bin/esparse.js - esvalidate: ./bin/esvalidate.js - checksum: 10/f1d3c622ad992421362294f7acf866aa9409fbad4eb2e8fa230bd33944ce371d32279667b242d8b8907ec2b6ad7353a717f3c0e60e748873a34a7905174bc0eb - languageName: node - linkType: hard - -"esquery@npm:^1.4.2": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" - dependencies: - estraverse: "npm:^5.1.0" - checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a - languageName: node - linkType: hard - -"esrecurse@npm:^4.3.0": - version: 4.3.0 - resolution: "esrecurse@npm:4.3.0" - dependencies: - estraverse: "npm:^5.2.0" - checksum: 10/44ffcd89e714ea6b30143e7f119b104fc4d75e77ee913f34d59076b40ef2d21967f84e019f84e1fd0465b42cdbf725db449f232b5e47f29df29ed76194db8e16 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 10/37cbe6e9a68014d34dbdc039f90d0baf72436809d02edffcc06ba3c2a12eb298048f877511353b130153e532aac8d68ba78430c0dd2f44806ebc7c014b01585e - languageName: node - linkType: hard - -"esutils@npm:^2.0.2": - version: 2.0.3 - resolution: "esutils@npm:2.0.3" - checksum: 10/b23acd24791db11d8f65be5ea58fd9a6ce2df5120ae2da65c16cfc5331ff59d5ac4ef50af66cd4bde238881503ec839928a0135b99a036a9cdfa22d17fd56cdb - languageName: node - linkType: hard - -"execa@npm:^5.1.1": - version: 5.1.1 - resolution: "execa@npm:5.1.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^6.0.0" - human-signals: "npm:^2.1.0" - is-stream: "npm:^2.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^4.0.1" - onetime: "npm:^5.1.2" - signal-exit: "npm:^3.0.3" - strip-final-newline: "npm:^2.0.0" - checksum: 10/8ada91f2d70f7dff702c861c2c64f21dfdc1525628f3c0454fd6f02fce65f7b958616cbd2b99ca7fa4d474e461a3d363824e91b3eb881705231abbf387470597 - languageName: node - linkType: hard - -"exponential-backoff@npm:^3.1.1": - version: 3.1.1 - resolution: "exponential-backoff@npm:3.1.1" - checksum: 10/2d9bbb6473de7051f96790d5f9a678f32e60ed0aa70741dc7fdc96fec8d631124ec3374ac144387604f05afff9500f31a1d45bd9eee4cdc2e4f9ad2d9b9d5dbd - languageName: node - linkType: hard - -"fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": - version: 3.1.3 - resolution: "fast-deep-equal@npm:3.1.3" - checksum: 10/e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d - languageName: node - linkType: hard - -"fast-glob@npm:^3.3.2": - version: 3.3.3 - resolution: "fast-glob@npm:3.3.3" - dependencies: - "@nodelib/fs.stat": "npm:^2.0.2" - "@nodelib/fs.walk": "npm:^1.2.3" - glob-parent: "npm:^5.1.2" - merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.8" - checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad - languageName: node - linkType: hard - -"fast-json-stable-stringify@npm:^2.0.0": - version: 2.1.0 - resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: 10/2c20055c1fa43c922428f16ca8bb29f2807de63e5c851f665f7ac9790176c01c3b40335257736b299764a8d383388dabc73c8083b8e1bc3d99f0a941444ec60e - languageName: node - linkType: hard - -"fast-levenshtein@npm:^2.0.6": - version: 2.0.6 - resolution: "fast-levenshtein@npm:2.0.6" - checksum: 10/eb7e220ecf2bab5159d157350b81d01f75726a4382f5a9266f42b9150c4523b9795f7f5d9fbbbeaeac09a441b2369f05ee02db48ea938584205530fe5693cfe1 - languageName: node - linkType: hard - -"fastq@npm:^1.6.0": - version: 1.17.1 - resolution: "fastq@npm:1.17.1" - dependencies: - reusify: "npm:^1.0.4" - checksum: 10/a443180068b527dd7b3a63dc7f2a47ceca2f3e97b9c00a1efe5538757e6cc4056a3526df94308075d7727561baf09ebaa5b67da8dcbddb913a021c5ae69d1f69 - languageName: node - linkType: hard - -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" - dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10/099bb9d4ab332cb93c48b14807a6918a1da87c45dce91d4b61fd40e6505d56d0697da060cb901c729c90487067d93c9243f5da3dc9c41f0358483bfdebca736b - languageName: node - linkType: hard - -"fill-keys@npm:^1.0.2": - version: 1.0.2 - resolution: "fill-keys@npm:1.0.2" - dependencies: - is-object: "npm:~1.0.1" - merge-descriptors: "npm:~1.0.0" - checksum: 10/6e78e314dc6852060086a8edc754d6a5b8efea5389ba8ec48367c1d0fa14272f9fad2f5c1ced1dcbd73306ffbfa3aa8cc64add884150ccf729f2a45ebc22d2eb - languageName: node - linkType: hard - -"fill-range@npm:^7.1.1": - version: 7.1.1 - resolution: "fill-range@npm:7.1.1" - dependencies: - to-regex-range: "npm:^5.0.1" - checksum: 10/a7095cb39e5bc32fada2aa7c7249d3f6b01bd1ce461a61b0adabacccabd9198500c6fb1f68a7c851a657e273fce2233ba869638897f3d7ed2e87a2d89b4436ea - languageName: node - linkType: hard - -"find-cache-dir@npm:^3.2.0": - version: 3.3.2 - resolution: "find-cache-dir@npm:3.3.2" - dependencies: - commondir: "npm:^1.0.1" - make-dir: "npm:^3.0.2" - pkg-dir: "npm:^4.1.0" - checksum: 10/3907c2e0b15132704ed67083686cd3e68ab7d9ecc22e50ae9da20678245d488b01fa22c0e34c0544dc6edc4354c766f016c8c186a787be7c17f7cde8c5281e85 - languageName: node - linkType: hard - -"find-up@npm:^4.0.0, find-up@npm:^4.1.0": - version: 4.1.0 - resolution: "find-up@npm:4.1.0" - dependencies: - locate-path: "npm:^5.0.0" - path-exists: "npm:^4.0.0" - checksum: 10/4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 - languageName: node - linkType: hard - -"find-up@npm:^5.0.0": - version: 5.0.0 - resolution: "find-up@npm:5.0.0" - dependencies: - locate-path: "npm:^6.0.0" - path-exists: "npm:^4.0.0" - checksum: 10/07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" - dependencies: - flatted: "npm:^3.2.9" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10/02381c6ece5e9fa5b826c9bbea481d7fd77645d96e4b0b1395238124d581d10e56f17f723d897b6d133970f7a57f0fab9148cbbb67237a0a0ffe794ba60c0c70 - languageName: node - linkType: hard - -"flat@npm:^5.0.2": - version: 5.0.2 - resolution: "flat@npm:5.0.2" - bin: - flat: cli.js - checksum: 10/72479e651c15eab53e25ce04c31bab18cfaac0556505cac19221dbbe85bbb9686bc76e4d397e89e5bf516ce667dcf818f8b07e585568edba55abc2bf1f698fb5 - languageName: node - linkType: hard - -"flatted@npm:^3.2.9": - version: 3.4.2 - resolution: "flatted@npm:3.4.2" - checksum: 10/a9e78fe5c2c1fcd98209a015ccee3a6caa953e01729778e83c1fe92e68601a63e1e69cd4e573010ca99eaf585a581b80ccf1018b99283e6cbc2117bcba1e030f - languageName: node - linkType: hard - -"foreground-child@npm:^2.0.0": - version: 2.0.0 - resolution: "foreground-child@npm:2.0.0" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^3.0.2" - checksum: 10/f36574ad8e19d69ce06fceac7d86161b863968e4ba292c14b7b40e5c464e3e9bcd7711250d33427d95cc2bb0d48cf101df9687433dbbc7fd3c7e4f595be8305e - languageName: node - linkType: hard - -"foreground-child@npm:^3.1.0, foreground-child@npm:^3.3.0": - version: 3.3.0 - resolution: "foreground-child@npm:3.3.0" - dependencies: - cross-spawn: "npm:^7.0.0" - signal-exit: "npm:^4.0.1" - checksum: 10/e3a60480f3a09b12273ce2c5fcb9514d98dd0e528f58656a1b04680225f918d60a2f81f6a368f2f3b937fcee9cfc0cbf16f1ad9a0bc6a3a6e103a84c9a90087e - languageName: node - linkType: hard - -"fromentries@npm:^1.2.0": - version: 1.3.2 - resolution: "fromentries@npm:1.3.2" - checksum: 10/10d6e07d289db102c0c1eaf5c3e3fa55ddd6b50033d7de16d99a7cd89f1e1a302dfadb26457031f9bb5d2ed95a179aaf0396092dde5abcae06e8a2f0476826be - languageName: node - linkType: hard - -"fs-minipass@npm:^2.0.0": - version: 2.1.0 - resolution: "fs-minipass@npm:2.1.0" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10/03191781e94bc9a54bd376d3146f90fe8e082627c502185dbf7b9b3032f66b0b142c1115f3b2cc5936575fc1b44845ce903dd4c21bec2a8d69f3bd56f9cee9ec - languageName: node - linkType: hard - -"fs-minipass@npm:^3.0.0": - version: 3.0.3 - resolution: "fs-minipass@npm:3.0.3" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10/af143246cf6884fe26fa281621d45cfe111d34b30535a475bfa38dafe343dadb466c047a924ffc7d6b7b18265df4110224ce3803806dbb07173bf2087b648d7f - languageName: node - linkType: hard - -"fs.realpath@npm:^1.0.0": - version: 1.0.0 - resolution: "fs.realpath@npm:1.0.0" - checksum: 10/e703107c28e362d8d7b910bbcbfd371e640a3bb45ae157a362b5952c0030c0b6d4981140ec319b347bce7adc025dd7813da1ff908a945ac214d64f5402a51b96 - languageName: node - linkType: hard - -"fsevents@npm:~2.3.2": - version: 2.3.3 - resolution: "fsevents@npm:2.3.3" - dependencies: - node-gyp: "npm:latest" - checksum: 10/4c1ade961ded57cdbfbb5cac5106ec17bc8bccd62e16343c569a0ceeca83b9dfef87550b4dc5cbb89642da412b20c5071f304c8c464b80415446e8e155a038c0 - conditions: os=darwin - languageName: node - linkType: hard - -"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": - version: 2.3.3 - resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" - dependencies: - node-gyp: "npm:latest" - conditions: os=darwin - languageName: node - linkType: hard - -"function-bind@npm:^1.1.2": - version: 1.1.2 - resolution: "function-bind@npm:1.1.2" - checksum: 10/185e20d20f10c8d661d59aac0f3b63b31132d492e1b11fcc2a93cb2c47257ebaee7407c38513efd2b35cafdf972d9beb2ea4593c1e0f3bf8f2744836928d7454 - languageName: node - linkType: hard - -"gensync@npm:^1.0.0-beta.2": - version: 1.0.0-beta.2 - resolution: "gensync@npm:1.0.0-beta.2" - checksum: 10/17d8333460204fbf1f9160d067e1e77f908a5447febb49424b8ab043026049835c9ef3974445c57dbd39161f4d2b04356d7de12b2eecaa27a7a7ea7d871cbedd - languageName: node - linkType: hard - -"get-caller-file@npm:^2.0.1, get-caller-file@npm:^2.0.5": - version: 2.0.5 - resolution: "get-caller-file@npm:2.0.5" - checksum: 10/b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 - languageName: node - linkType: hard - -"get-func-name@npm:^2.0.1, get-func-name@npm:^2.0.2": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 10/3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b - languageName: node - linkType: hard - -"get-package-type@npm:^0.1.0": - version: 0.1.0 - resolution: "get-package-type@npm:0.1.0" - checksum: 10/bba0811116d11e56d702682ddef7c73ba3481f114590e705fc549f4d868972263896af313c57a25c076e3c0d567e11d919a64ba1b30c879be985fc9d44f96148 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": - version: 6.0.1 - resolution: "get-stream@npm:6.0.1" - checksum: 10/781266d29725f35c59f1d214aedc92b0ae855800a980800e2923b3fbc4e56b3cb6e462c42e09a1cf1a00c64e056a78fa407cbe06c7c92b7e5cd49b4b85c2a497 - languageName: node - linkType: hard - -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": - version: 5.1.2 - resolution: "glob-parent@npm:5.1.2" - dependencies: - is-glob: "npm:^4.0.1" - checksum: 10/32cd106ce8c0d83731966d31517adb766d02c3812de49c30cfe0675c7c0ae6630c11214c54a5ae67aca882cf738d27fd7768f21aa19118b9245950554be07247 - languageName: node - linkType: hard - -"glob-parent@npm:^6.0.2": - version: 6.0.2 - resolution: "glob-parent@npm:6.0.2" - dependencies: - is-glob: "npm:^4.0.3" - checksum: 10/c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 - languageName: node - linkType: hard - -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.4.5 - resolution: "glob@npm:10.4.5" - dependencies: - foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" - minipass: "npm:^7.1.2" - package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" - bin: - glob: dist/esm/bin.mjs - checksum: 10/698dfe11828b7efd0514cd11e573eaed26b2dff611f0400907281ce3eab0c1e56143ef9b35adc7c77ecc71fba74717b510c7c223d34ca8a98ec81777b293d4ac - languageName: node - linkType: hard - -"glob@npm:^7.1.3, glob@npm:^7.1.4, glob@npm:^7.1.6": - version: 7.2.3 - resolution: "glob@npm:7.2.3" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^3.1.1" - once: "npm:^1.3.0" - path-is-absolute: "npm:^1.0.0" - checksum: 10/59452a9202c81d4508a43b8af7082ca5c76452b9fcc4a9ab17655822e6ce9b21d4f8fbadabe4fe3faef448294cec249af305e2cd824b7e9aaf689240e5e96a7b - languageName: node - linkType: hard - -"glob@npm:^8.1.0": - version: 8.1.0 - resolution: "glob@npm:8.1.0" - dependencies: - fs.realpath: "npm:^1.0.0" - inflight: "npm:^1.0.4" - inherits: "npm:2" - minimatch: "npm:^5.0.1" - once: "npm:^1.3.0" - checksum: 10/9aab1c75eb087c35dbc41d1f742e51d0507aa2b14c910d96fb8287107a10a22f4bbdce26fc0a3da4c69a20f7b26d62f1640b346a4f6e6becfff47f335bb1dc5e - languageName: node - linkType: hard - -"globals@npm:^11.1.0": - version: 11.12.0 - resolution: "globals@npm:11.12.0" - checksum: 10/9f054fa38ff8de8fa356502eb9d2dae0c928217b8b5c8de1f09f5c9b6c8a96d8b9bd3afc49acbcd384a98a81fea713c859e1b09e214c60509517bb8fc2bc13c2 - languageName: node - linkType: hard - -"globals@npm:^13.19.0": - version: 13.24.0 - resolution: "globals@npm:13.24.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10/62c5b1997d06674fc7191d3e01e324d3eda4d65ac9cc4e78329fa3b5c4fd42a0e1c8722822497a6964eee075255ce21ccf1eec2d83f92ef3f06653af4d0ee28e - languageName: node - linkType: hard - -"graceful-fs@npm:^4.1.15, graceful-fs@npm:^4.2.6": - version: 4.2.11 - resolution: "graceful-fs@npm:4.2.11" - checksum: 10/bf152d0ed1dc159239db1ba1f74fdbc40cb02f626770dcd5815c427ce0688c2635a06ed69af364396da4636d0408fcf7d4afdf7881724c3307e46aff30ca49e2 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: 10/6dd60dba97007b21e3a829fab3f771803cc1292977fe610e240ea72afd67e5690ac9eeaafc4a99710e78962e5936ab5a460787c2a1180f1cb0ccfac37d29f897 - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 10/4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b - languageName: node - linkType: hard - -"has-flag@npm:^4.0.0": - version: 4.0.0 - resolution: "has-flag@npm:4.0.0" - checksum: 10/261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad - languageName: node - linkType: hard - -"hasha@npm:^5.0.0": - version: 5.2.2 - resolution: "hasha@npm:5.2.2" - dependencies: - is-stream: "npm:^2.0.0" - type-fest: "npm:^0.8.0" - checksum: 10/06cc474bed246761ff61c19d629977eb5f53fa817be4313a255a64ae0f433e831a29e83acb6555e3f4592b348497596f1d1653751008dda4f21c9c21ca60ac5a - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": - version: 2.0.2 - resolution: "hasown@npm:2.0.2" - dependencies: - function-bind: "npm:^1.1.2" - checksum: 10/7898a9c1788b2862cf0f9c345a6bec77ba4a0c0983c7f19d610c382343d4f98fa260686b225dfb1f88393a66679d2ec58ee310c1d6868c081eda7918f32cc70a - languageName: node - linkType: hard - -"he@npm:^1.2.0": - version: 1.2.0 - resolution: "he@npm:1.2.0" - bin: - he: bin/he - checksum: 10/d09b2243da4e23f53336e8de3093e5c43d2c39f8d0d18817abfa32ce3e9355391b2edb4bb5edc376aea5d4b0b59d6a0482aab4c52bc02ef95751e4b818e847f1 - languageName: node - linkType: hard - -"html-escaper@npm:^2.0.0": - version: 2.0.2 - resolution: "html-escaper@npm:2.0.2" - checksum: 10/034d74029dcca544a34fb6135e98d427acd73019796ffc17383eaa3ec2fe1c0471dcbbc8f8ed39e46e86d43ccd753a160631615e4048285e313569609b66d5b7 - languageName: node - linkType: hard - -"http-cache-semantics@npm:^4.1.1": - version: 4.1.1 - resolution: "http-cache-semantics@npm:4.1.1" - checksum: 10/362d5ed66b12ceb9c0a328fb31200b590ab1b02f4a254a697dc796850cc4385603e75f53ec59f768b2dad3bfa1464bd229f7de278d2899a0e3beffc634b6683f - languageName: node - linkType: hard - -"http-proxy-agent@npm:^7.0.0": - version: 7.0.2 - resolution: "http-proxy-agent@npm:7.0.2" - dependencies: - agent-base: "npm:^7.1.0" - debug: "npm:^4.3.4" - checksum: 10/d062acfa0cb82beeb558f1043c6ba770ea892b5fb7b28654dbc70ea2aeea55226dd34c02a294f6c1ca179a5aa483c4ea641846821b182edbd9cc5d89b54c6848 - languageName: node - linkType: hard - -"https-proxy-agent@npm:^7.0.1": - version: 7.0.5 - resolution: "https-proxy-agent@npm:7.0.5" - dependencies: - agent-base: "npm:^7.0.2" - debug: "npm:4" - checksum: 10/6679d46159ab3f9a5509ee80c3a3fc83fba3a920a5e18d32176c3327852c3c00ad640c0c4210a8fd70ea3c4a6d3a1b375bf01942516e7df80e2646bdc77658ab - languageName: node - linkType: hard - -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: 10/df59be9e0af479036798a881d1f136c4a29e0b518d4abb863afbd11bf30efa3eeb1d0425fc65942dcc05ab3bf40205ea436b0ff389f2cd20b75b8643d539bf86 - languageName: node - linkType: hard - -"iconv-lite@npm:^0.6.2": - version: 0.6.3 - resolution: "iconv-lite@npm:0.6.3" - dependencies: - safer-buffer: "npm:>= 2.1.2 < 3.0.0" - checksum: 10/24e3292dd3dadaa81d065c6f8c41b274a47098150d444b96e5f53b4638a9a71482921ea6a91a1f59bb71d9796de25e04afd05919fa64c360347ba65d3766f10f - languageName: node - linkType: hard - -"ignore@npm:^5.1.1, ignore@npm:^5.2.0": - version: 5.3.2 - resolution: "ignore@npm:5.3.2" - checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 - languageName: node - linkType: hard - -"import-fresh@npm:^3.2.1": - version: 3.3.0 - resolution: "import-fresh@npm:3.3.0" - dependencies: - parent-module: "npm:^1.0.0" - resolve-from: "npm:^4.0.0" - checksum: 10/2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa - languageName: node - linkType: hard - -"imurmurhash@npm:^0.1.4": - version: 0.1.4 - resolution: "imurmurhash@npm:0.1.4" - checksum: 10/2d30b157a91fe1c1d7c6f653cbf263f039be6c5bfa959245a16d4ee191fc0f2af86c08545b6e6beeb041c56b574d2d5b9f95343d378ab49c0f37394d541e7fc8 - languageName: node - linkType: hard - -"indent-string@npm:^4.0.0": - version: 4.0.0 - resolution: "indent-string@npm:4.0.0" - checksum: 10/cd3f5cbc9ca2d624c6a1f53f12e6b341659aba0e2d3254ae2b4464aaea8b4294cdb09616abbc59458f980531f2429784ed6a420d48d245bcad0811980c9efae9 - languageName: node - linkType: hard - -"inflight@npm:^1.0.4": - version: 1.0.6 - resolution: "inflight@npm:1.0.6" - dependencies: - once: "npm:^1.3.0" - wrappy: "npm:1" - checksum: 10/d2ebd65441a38c8336c223d1b80b921b9fa737e37ea466fd7e253cb000c64ae1f17fa59e68130ef5bda92cfd8d36b83d37dab0eb0a4558bcfec8e8cdfd2dcb67 - languageName: node - linkType: hard - -"inherits@npm:2": - version: 2.0.4 - resolution: "inherits@npm:2.0.4" - checksum: 10/cd45e923bee15186c07fa4c89db0aace24824c482fb887b528304694b2aa6ff8a898da8657046a5dcf3e46cd6db6c61629551f9215f208d7c3f157cf9b290521 - languageName: node - linkType: hard - -"ip-address@npm:^9.0.5": - version: 9.0.5 - resolution: "ip-address@npm:9.0.5" - dependencies: - jsbn: "npm:1.1.0" - sprintf-js: "npm:^1.1.3" - checksum: 10/1ed81e06721af012306329b31f532b5e24e00cb537be18ddc905a84f19fe8f83a09a1699862bf3a1ec4b9dea93c55a3fa5faf8b5ea380431469df540f38b092c - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: "npm:^2.0.0" - checksum: 10/078e51b4f956c2c5fd2b26bb2672c3ccf7e1faff38e0ebdba45612265f4e3d9fc3127a1fa8370bbf09eab61339203c3d3b7af5662cbf8be4030f8fac37745b0e - languageName: node - linkType: hard - -"is-core-module@npm:^2.13.0": - version: 2.15.1 - resolution: "is-core-module@npm:2.15.1" - dependencies: - hasown: "npm:^2.0.2" - checksum: 10/77316d5891d5743854bcef2cd2f24c5458fb69fbc9705c12ca17d54a2017a67d0693bbf1ba8c77af376c0eef6bf6d1b27a4ab08e4db4e69914c3789bdf2ceec5 - languageName: node - linkType: hard - -"is-extglob@npm:^2.1.1": - version: 2.1.1 - resolution: "is-extglob@npm:2.1.1" - checksum: 10/df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^3.0.0": - version: 3.0.0 - resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 10/44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": - version: 4.0.3 - resolution: "is-glob@npm:4.0.3" - dependencies: - is-extglob: "npm:^2.1.1" - checksum: 10/3ed74f2b0cdf4f401f38edb0442ddfde3092d79d7d35c9919c86641efdbcbb32e45aa3c0f70ce5eecc946896cd5a0f26e4188b9f2b881876f7cb6c505b82da11 - languageName: node - linkType: hard - -"is-lambda@npm:^1.0.1": - version: 1.0.1 - resolution: "is-lambda@npm:1.0.1" - checksum: 10/93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 - languageName: node - linkType: hard - -"is-number@npm:^4.0.0": - version: 4.0.0 - resolution: "is-number@npm:4.0.0" - checksum: 10/7f25967eb4fd92c4c5c282f6510c86d257de5894501b831ae6ab44a964c690ba721eef931eb2aaad2aacf35fd0cf57b9d2135b0bd25147dc5bc64f99fbca1785 - languageName: node - linkType: hard - -"is-number@npm:^7.0.0": - version: 7.0.0 - resolution: "is-number@npm:7.0.0" - checksum: 10/6a6c3383f68afa1e05b286af866017c78f1226d43ac8cb064e115ff9ed85eb33f5c4f7216c96a71e4dfea289ef52c5da3aef5bbfade8ffe47a0465d70c0c8e86 - languageName: node - linkType: hard - -"is-object@npm:~1.0.1": - version: 1.0.2 - resolution: "is-object@npm:1.0.2" - checksum: 10/db53971751c50277f0ed31d065d93038d23cb9785090ab5c8070a903cf5bab16cdb18f05b8855599ad87ec19eb4c85afa05980bcda77dd4a8482120b6348c73c - languageName: node - linkType: hard - -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-plain-obj@npm:^2.1.0": - version: 2.1.0 - resolution: "is-plain-obj@npm:2.1.0" - checksum: 10/cec9100678b0a9fe0248a81743041ed990c2d4c99f893d935545cfbc42876cbe86d207f3b895700c690ad2fa520e568c44afc1605044b535a7820c1d40e38daa - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: 10/b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 - languageName: node - linkType: hard - -"is-typedarray@npm:^1.0.0": - version: 1.0.0 - resolution: "is-typedarray@npm:1.0.0" - checksum: 10/4b433bfb0f9026f079f4eb3fbaa4ed2de17c9995c3a0b5c800bec40799b4b2a8b4e051b1ada77749deb9ded4ae52fe2096973f3a93ff83df1a5a7184a669478c - languageName: node - linkType: hard - -"is-unicode-supported@npm:^0.1.0": - version: 0.1.0 - resolution: "is-unicode-supported@npm:0.1.0" - checksum: 10/a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 - languageName: node - linkType: hard - -"is-windows@npm:^1.0.2": - version: 1.0.2 - resolution: "is-windows@npm:1.0.2" - checksum: 10/438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 - languageName: node - linkType: hard - -"isexe@npm:^2.0.0": - version: 2.0.0 - resolution: "isexe@npm:2.0.0" - checksum: 10/7c9f715c03aff08f35e98b1fadae1b9267b38f0615d501824f9743f3aab99ef10e303ce7db3f186763a0b70a19de5791ebfc854ff884d5a8c4d92211f642ec92 - languageName: node - linkType: hard - -"isexe@npm:^3.1.1": - version: 3.1.1 - resolution: "isexe@npm:3.1.1" - checksum: 10/7fe1931ee4e88eb5aa524cd3ceb8c882537bc3a81b02e438b240e47012eef49c86904d0f0e593ea7c3a9996d18d0f1f3be8d3eaa92333977b0c3a9d353d5563e - languageName: node - linkType: hard - -"istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.2 - resolution: "istanbul-lib-coverage@npm:3.2.2" - checksum: 10/40bbdd1e937dfd8c830fa286d0f665e81b7a78bdabcd4565f6d5667c99828bda3db7fb7ac6b96a3e2e8a2461ddbc5452d9f8bc7d00cb00075fa6a3e99f5b6a81 - languageName: node - linkType: hard - -"istanbul-lib-hook@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-hook@npm:3.0.0" - dependencies: - append-transform: "npm:^2.0.0" - checksum: 10/512a996cce6b1b9003ba59eab42299dd1527176c01f3ceb7b16bf68f437eeab4958f9df7df0a6b258d45d5f1a2ca2a1bdb915970711e1a5d7b2de911c582f721 - languageName: node - linkType: hard - -"istanbul-lib-instrument@npm:^6.0.2": - version: 6.0.3 - resolution: "istanbul-lib-instrument@npm:6.0.3" - dependencies: - "@babel/core": "npm:^7.23.9" - "@babel/parser": "npm:^7.23.9" - "@istanbuljs/schema": "npm:^0.1.3" - istanbul-lib-coverage: "npm:^3.2.0" - semver: "npm:^7.5.4" - checksum: 10/aa5271c0008dfa71b6ecc9ba1e801bf77b49dc05524e8c30d58aaf5b9505e0cd12f25f93165464d4266a518c5c75284ecb598fbd89fec081ae77d2c9d3327695 - languageName: node - linkType: hard - -"istanbul-lib-processinfo@npm:^2.0.2": - version: 2.0.3 - resolution: "istanbul-lib-processinfo@npm:2.0.3" - dependencies: - archy: "npm:^1.0.0" - cross-spawn: "npm:^7.0.3" - istanbul-lib-coverage: "npm:^3.2.0" - p-map: "npm:^3.0.0" - rimraf: "npm:^3.0.0" - uuid: "npm:^8.3.2" - checksum: 10/60e7b3441687249460f34a817c7204967b07830a69b6e430e60a45615319c2ab4e2b2eaeb8b3decf549fccd419cd600d21173961632229967608d7d1b194f39e - languageName: node - linkType: hard - -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.1 - resolution: "istanbul-lib-report@npm:3.0.1" - dependencies: - istanbul-lib-coverage: "npm:^3.0.0" - make-dir: "npm:^4.0.0" - supports-color: "npm:^7.1.0" - checksum: 10/86a83421ca1cf2109a9f6d193c06c31ef04a45e72a74579b11060b1e7bb9b6337a4e6f04abfb8857e2d569c271273c65e855ee429376a0d7c91ad91db42accd1 - languageName: node - linkType: hard - -"istanbul-lib-source-maps@npm:^4.0.0": - version: 4.0.1 - resolution: "istanbul-lib-source-maps@npm:4.0.1" - dependencies: - debug: "npm:^4.1.1" - istanbul-lib-coverage: "npm:^3.0.0" - source-map: "npm:^0.6.1" - checksum: 10/5526983462799aced011d776af166e350191b816821ea7bcf71cab3e5272657b062c47dc30697a22a43656e3ced78893a42de677f9ccf276a28c913190953b82 - languageName: node - linkType: hard - -"istanbul-reports@npm:^3.0.2": - version: 3.1.7 - resolution: "istanbul-reports@npm:3.1.7" - dependencies: - html-escaper: "npm:^2.0.0" - istanbul-lib-report: "npm:^3.0.0" - checksum: 10/f1faaa4684efaf57d64087776018d7426312a59aa6eeb4e0e3a777347d23cd286ad18f427e98f0e3dee666103d7404c9d7abc5f240406a912fa16bd6695437fa - languageName: node - linkType: hard - -"jackspeak@npm:^3.1.2": - version: 3.4.3 - resolution: "jackspeak@npm:3.4.3" - dependencies: - "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10/96f8786eaab98e4bf5b2a5d6d9588ea46c4d06bbc4f2eb861fdd7b6b182b16f71d8a70e79820f335d52653b16d4843b29dd9cdcf38ae80406756db9199497cf3 - languageName: node - linkType: hard - -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 10/af37d0d913fb56aec6dc0074c163cc71cd23c0b8aad5c2350747b6721d37ba118af35abdd8b33c47ec2800de07dedb16a527ca9c530ee004093e04958bd0cbf2 - languageName: node - linkType: hard - -"js-yaml@npm:^3.13.1": - version: 3.14.2 - resolution: "js-yaml@npm:3.14.2" - dependencies: - argparse: "npm:^1.0.7" - esprima: "npm:^4.0.0" - bin: - js-yaml: bin/js-yaml.js - checksum: 10/172e0b6007b0bf0fc8d2469c94424f7dd765c64a047d2b790831fecef2204a4054eabf4d911eb73ab8c9a3256ab8ba1ee8d655b789bf24bf059c772acc2075a1 - languageName: node - linkType: hard - -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" - dependencies: - argparse: "npm:^2.0.1" - bin: - js-yaml: bin/js-yaml.js - checksum: 10/c138a34a3fd0d08ebaf71273ad4465569a483b8a639e0b118ff65698d257c2791d3199e3f303631f2cb98213fa7b5f5d6a4621fd0fff819421b990d30d967140 - languageName: node - linkType: hard - -"jsbn@npm:1.1.0": - version: 1.1.0 - resolution: "jsbn@npm:1.1.0" - checksum: 10/bebe7ae829bbd586ce8cbe83501dd8cb8c282c8902a8aeeed0a073a89dc37e8103b1244f3c6acd60278bcbfe12d93a3f83c9ac396868a3b3bbc3c5e5e3b648ef - languageName: node - linkType: hard - -"jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" - bin: - jsesc: bin/jsesc - checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 - languageName: node - linkType: hard - -"json-buffer@npm:3.0.1": - version: 3.0.1 - resolution: "json-buffer@npm:3.0.1" - checksum: 10/82876154521b7b68ba71c4f969b91572d1beabadd87bd3a6b236f85fbc7dc4695089191ed60bb59f9340993c51b33d479f45b6ba9f3548beb519705281c32c3c - languageName: node - linkType: hard - -"json-schema-traverse@npm:^0.4.1": - version: 0.4.1 - resolution: "json-schema-traverse@npm:0.4.1" - checksum: 10/7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b - languageName: node - linkType: hard - -"json-stable-stringify-without-jsonify@npm:^1.0.1": - version: 1.0.1 - resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: 10/12786c2e2f22c27439e6db0532ba321f1d0617c27ad8cb1c352a0e9249a50182fd1ba8b52a18899291604b0c32eafa8afd09e51203f19109a0537f68db2b652d - languageName: node - linkType: hard - -"json5@npm:^2.2.3": - version: 2.2.3 - resolution: "json5@npm:2.2.3" - bin: - json5: lib/cli.js - checksum: 10/1db67b853ff0de3534085d630691d3247de53a2ed1390ba0ddff681ea43e9b3e30ecbdb65c5e9aab49435e44059c23dbd6fee8ee619419ba37465bb0dd7135da - languageName: node - linkType: hard - -"just-extend@npm:^6.2.0": - version: 6.2.0 - resolution: "just-extend@npm:6.2.0" - checksum: 10/1f487b074b9e5773befdd44dc5d1b446f01f24f7d4f1f255d51c0ef7f686e8eb5f95d983b792b9ca5c8b10cd7e60a924d64103725759eddbd7f18bcb22743f92 - languageName: node - linkType: hard - -"keyv@npm:^4.5.3": - version: 4.5.4 - resolution: "keyv@npm:4.5.4" - dependencies: - json-buffer: "npm:3.0.1" - checksum: 10/167eb6ef64cc84b6fa0780ee50c9de456b422a1e18802209234f7c2cf7eae648c7741f32e50d7e24ccb22b24c13154070b01563d642755b156c357431a191e75 - languageName: node - linkType: hard - -"kind-of@npm:^6.0.0": - version: 6.0.3 - resolution: "kind-of@npm:6.0.3" - checksum: 10/5873d303fb36aad875b7538798867da2ae5c9e328d67194b0162a3659a627d22f742fc9c4ae95cd1704132a24b00cae5041fc00c0f6ef937dc17080dc4dbb962 - languageName: node - linkType: hard - -"levn@npm:^0.4.1": - version: 0.4.1 - resolution: "levn@npm:0.4.1" - dependencies: - prelude-ls: "npm:^1.2.1" - type-check: "npm:~0.4.0" - checksum: 10/2e4720ff79f21ae08d42374b0a5c2f664c5be8b6c8f565bb4e1315c96ed3a8acaa9de788ffed82d7f2378cf36958573de07ef92336cb5255ed74d08b8318c9ee - languageName: node - linkType: hard - -"locate-path@npm:^5.0.0": - version: 5.0.0 - resolution: "locate-path@npm:5.0.0" - dependencies: - p-locate: "npm:^4.1.0" - checksum: 10/83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 - languageName: node - linkType: hard - -"locate-path@npm:^6.0.0": - version: 6.0.0 - resolution: "locate-path@npm:6.0.0" - dependencies: - p-locate: "npm:^5.0.0" - checksum: 10/72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"lodash.flattendeep@npm:^4.4.0": - version: 4.4.0 - resolution: "lodash.flattendeep@npm:4.4.0" - checksum: 10/0d0b41d8d86999e8bea94905ac65347404d427aacddbc6654dc2f85905e27cd2b708139671ecea135fa6f0a17ed94b9d4cab8ce12b08eddcbb1ddd83952ee4c2 - languageName: node - linkType: hard - -"lodash.get@npm:^4.4.2": - version: 4.4.2 - resolution: "lodash.get@npm:4.4.2" - checksum: 10/2a4925f6e89bc2c010a77a802d1ba357e17ed1ea03c2ddf6a146429f2856a216663e694a6aa3549a318cbbba3fd8b7decb392db457e6ac0b83dc745ed0a17380 - languageName: node - linkType: hard - -"lodash.merge@npm:^4.6.2": - version: 4.6.2 - resolution: "lodash.merge@npm:4.6.2" - checksum: 10/d0ea2dd0097e6201be083865d50c3fb54fbfbdb247d9cc5950e086c991f448b7ab0cdab0d57eacccb43473d3f2acd21e134db39f22dac2d6c9ba6bf26978e3d6 - languageName: node - linkType: hard - -"log-symbols@npm:^4.1.0": - version: 4.1.0 - resolution: "log-symbols@npm:4.1.0" - dependencies: - chalk: "npm:^4.1.0" - is-unicode-supported: "npm:^0.1.0" - checksum: 10/fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 - languageName: node - linkType: hard - -"loupe@npm:^2.3.6": - version: 2.3.7 - resolution: "loupe@npm:2.3.7" - dependencies: - get-func-name: "npm:^2.0.1" - checksum: 10/635c8f0914c2ce7ecfe4e239fbaf0ce1d2c00e4246fafcc4ed000bfdb1b8f89d05db1a220054175cca631ebf3894872a26fffba0124477fcb562f78762848fb1 - languageName: node - linkType: hard - -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": - version: 10.4.3 - resolution: "lru-cache@npm:10.4.3" - checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a - languageName: node - linkType: hard - -"lru-cache@npm:^5.1.1": - version: 5.1.1 - resolution: "lru-cache@npm:5.1.1" - dependencies: - yallist: "npm:^3.0.2" - checksum: 10/951d2673dcc64a7fb888bf3d13bc2fdf923faca97d89cdb405ba3dfff77e2b26e5798d405e78fcd7094c9e7b8b4dab2ddc5a4f8a11928af24a207b7c738ca3f8 - languageName: node - linkType: hard - -"luxon@npm:^3.7.2": - version: 3.7.2 - resolution: "luxon@npm:3.7.2" - checksum: 10/b24cd205ed306ce7415991687897dcc4027921ae413c9116590bc33a95f93b86ce52cf74ba72b4f5c5ab1c10090517f54ac8edfb127c049e0bf55b90dc2260be - languageName: node - linkType: hard - -"make-dir@npm:^3.0.0, make-dir@npm:^3.0.2": - version: 3.1.0 - resolution: "make-dir@npm:3.1.0" - dependencies: - semver: "npm:^6.0.0" - checksum: 10/484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - -"make-dir@npm:^4.0.0": - version: 4.0.0 - resolution: "make-dir@npm:4.0.0" - dependencies: - semver: "npm:^7.5.3" - checksum: 10/bf0731a2dd3aab4db6f3de1585cea0b746bb73eb5a02e3d8d72757e376e64e6ada190b1eddcde5b2f24a81b688a9897efd5018737d05e02e2a671dda9cff8a8a - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.0": - version: 13.0.1 - resolution: "make-fetch-happen@npm:13.0.1" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - proc-log: "npm:^4.2.0" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10/11bae5ad6ac59b654dbd854f30782f9de052186c429dfce308eda42374528185a100ee40ac9ffdc36a2b6c821ecaba43913e4730a12f06f15e895ea9cb23fa59 - languageName: node - linkType: hard - -"math-random@npm:^1.0.1": - version: 1.0.4 - resolution: "math-random@npm:1.0.4" - checksum: 10/9edf31ea337bba21994eb968218fd571d55fce86b51661158d8e241886b73121d9e1a35a5bb8997dba8ce67417a83c8dbd0811917248f886840035b7f1c667b9 - languageName: node - linkType: hard - -"merge-descriptors@npm:~1.0.0": - version: 1.0.3 - resolution: "merge-descriptors@npm:1.0.3" - checksum: 10/52117adbe0313d5defa771c9993fe081e2d2df9b840597e966aadafde04ae8d0e3da46bac7ca4efc37d4d2b839436582659cd49c6a43eacb3fe3050896a105d1 - languageName: node - linkType: hard - -"merge-stream@npm:^2.0.0": - version: 2.0.0 - resolution: "merge-stream@npm:2.0.0" - checksum: 10/6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 - languageName: node - linkType: hard - -"merge2@npm:^1.3.0": - version: 1.4.1 - resolution: "merge2@npm:1.4.1" - checksum: 10/7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 - languageName: node - linkType: hard - -"micromatch@npm:^4.0.8": - version: 4.0.8 - resolution: "micromatch@npm:4.0.8" - dependencies: - braces: "npm:^3.0.3" - picomatch: "npm:^2.3.1" - checksum: 10/6bf2a01672e7965eb9941d1f02044fad2bd12486b5553dc1116ff24c09a8723157601dc992e74c911d896175918448762df3b3fd0a6b61037dd1a9766ddfbf58 - languageName: node - linkType: hard - -"mimic-fn@npm:^2.1.0": - version: 2.1.0 - resolution: "mimic-fn@npm:2.1.0" - checksum: 10/d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a - languageName: node - linkType: hard - -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": - version: 3.1.5 - resolution: "minimatch@npm:3.1.5" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10/b11a7ee5773cd34c1a0c8436cdbe910901018fb4b6cb47aa508a18d567f6efd2148507959e35fba798389b161b8604a2d704ccef751ea36bd4582f9852b7d63f - languageName: node - linkType: hard - -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": - version: 5.1.6 - resolution: "minimatch@npm:5.1.6" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/126b36485b821daf96d33b5c821dac600cc1ab36c87e7a532594f9b1652b1fa89a1eebcaad4dff17c764dce1a7ac1531327f190fed5f97d8f6e5f889c116c429 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.4": - version: 9.0.5 - resolution: "minimatch@npm:9.0.5" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348 - languageName: node - linkType: hard - -"minipass-collect@npm:^2.0.1": - version: 2.0.1 - resolution: "minipass-collect@npm:2.0.1" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10/b251bceea62090f67a6cced7a446a36f4cd61ee2d5cea9aee7fff79ba8030e416327a1c5aa2908dc22629d06214b46d88fdab8c51ac76bacbf5703851b5ad342 - languageName: node - linkType: hard - -"minipass-fetch@npm:^3.0.0": - version: 3.0.5 - resolution: "minipass-fetch@npm:3.0.5" - dependencies: - encoding: "npm:^0.1.13" - minipass: "npm:^7.0.3" - minipass-sized: "npm:^1.0.3" - minizlib: "npm:^2.1.2" - dependenciesMeta: - encoding: - optional: true - checksum: 10/c669948bec1373313aaa8f104b962a3ced9f45c49b26366a4b0ae27ccdfa9c5740d72c8a84d3f8623d7a61c5fc7afdfda44789008c078f61a62441142efc4a97 - languageName: node - linkType: hard - -"minipass-flush@npm:^1.0.5": - version: 1.0.5 - resolution: "minipass-flush@npm:1.0.5" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10/56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf - languageName: node - linkType: hard - -"minipass-pipeline@npm:^1.2.4": - version: 1.2.4 - resolution: "minipass-pipeline@npm:1.2.4" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10/b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b - languageName: node - linkType: hard - -"minipass-sized@npm:^1.0.3": - version: 1.0.3 - resolution: "minipass-sized@npm:1.0.3" - dependencies: - minipass: "npm:^3.0.0" - checksum: 10/40982d8d836a52b0f37049a0a7e5d0f089637298e6d9b45df9c115d4f0520682a78258905e5c8b180fb41b593b0a82cc1361d2c74b45f7ada66334f84d1ecfdd - languageName: node - linkType: hard - -"minipass@npm:^3.0.0": - version: 3.3.6 - resolution: "minipass@npm:3.3.6" - dependencies: - yallist: "npm:^4.0.0" - checksum: 10/a5c6ef069f70d9a524d3428af39f2b117ff8cd84172e19b754e7264a33df460873e6eb3d6e55758531580970de50ae950c496256bb4ad3691a2974cddff189f0 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0": - version: 5.0.0 - resolution: "minipass@npm:5.0.0" - checksum: 10/61682162d29f45d3152b78b08bab7fb32ca10899bc5991ffe98afc18c9e9543bd1e3be94f8b8373ba6262497db63607079dc242ea62e43e7b2270837b7347c93 - languageName: node - linkType: hard - -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": - version: 7.1.2 - resolution: "minipass@npm:7.1.2" - checksum: 10/c25f0ee8196d8e6036661104bacd743785b2599a21de5c516b32b3fa2b83113ac89a2358465bc04956baab37ffb956ae43be679b2262bf7be15fce467ccd7950 - languageName: node - linkType: hard - -"minizlib@npm:^2.1.1, minizlib@npm:^2.1.2": - version: 2.1.2 - resolution: "minizlib@npm:2.1.2" - dependencies: - minipass: "npm:^3.0.0" - yallist: "npm:^4.0.0" - checksum: 10/ae0f45436fb51344dcb87938446a32fbebb540d0e191d63b35e1c773d47512e17307bf54aa88326cc6d176594d00e4423563a091f7266c2f9a6872cdc1e234d1 - languageName: node - linkType: hard - -"mkdirp@npm:^1.0.3": - version: 1.0.4 - resolution: "mkdirp@npm:1.0.4" - bin: - mkdirp: bin/cmd.js - checksum: 10/d71b8dcd4b5af2fe13ecf3bd24070263489404fe216488c5ba7e38ece1f54daf219e72a833a3a2dc404331e870e9f44963a33399589490956bff003a3404d3b2 - languageName: node - linkType: hard - -"mocha@npm:^10.8.2": - version: 10.8.2 - resolution: "mocha@npm:10.8.2" - dependencies: - ansi-colors: "npm:^4.1.3" - browser-stdout: "npm:^1.3.1" - chokidar: "npm:^3.5.3" - debug: "npm:^4.3.5" - diff: "npm:^5.2.0" - escape-string-regexp: "npm:^4.0.0" - find-up: "npm:^5.0.0" - glob: "npm:^8.1.0" - he: "npm:^1.2.0" - js-yaml: "npm:^4.1.0" - log-symbols: "npm:^4.1.0" - minimatch: "npm:^5.1.6" - ms: "npm:^2.1.3" - serialize-javascript: "npm:^6.0.2" - strip-json-comments: "npm:^3.1.1" - supports-color: "npm:^8.1.1" - workerpool: "npm:^6.5.1" - yargs: "npm:^16.2.0" - yargs-parser: "npm:^20.2.9" - yargs-unparser: "npm:^2.0.0" - bin: - _mocha: bin/_mocha - mocha: bin/mocha.js - checksum: 10/903bbffcb195ef9d36b27db54e3462c5486de1397289e0953735b3530397a139336c452bcf5188c663496c660d2285bbb6c7213290d36d536ad647b6145cb917 - languageName: node - linkType: hard - -"mock-fs@npm:^5.5.0": - version: 5.5.0 - resolution: "mock-fs@npm:5.5.0" - checksum: 10/f40f0ea4b0b0f79f2218a2ea64b55b756989a262ebe4aac7b4fb6d8757866c35f59a2740adb114a91854ab7a091378702facd5ba750f051cbc795622c685e415 - languageName: node - linkType: hard - -"module-not-found-error@npm:^1.0.1": - version: 1.0.1 - resolution: "module-not-found-error@npm:1.0.1" - checksum: 10/ebd65339d4d5980dd55cd32dbf112ec02b8e33f30866312b94caeee4783322259f18cf2270e9d2e600df3bd1876c35612b87f5c2525c21885fb1f83e85a9b9b0 - languageName: node - linkType: hard - -"ms@npm:^2.1.3": - version: 2.1.3 - resolution: "ms@npm:2.1.3" - checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d - languageName: node - linkType: hard - -"my-dev-tools@workspace:.": - version: 0.0.0-use.local - resolution: "my-dev-tools@workspace:." - dependencies: - chai: "npm:^4.5.0" - dotenv: "npm:^17.3.1" - eslint: "npm:^8.57.0" - eslint-plugin-node: "npm:^11.1.0" - luxon: "npm:^3.7.2" - mocha: "npm:^10.8.2" - mock-fs: "npm:^5.5.0" - nyc: "npm:^17.1.0" - proxyquire: "npm:^2.1.3" - randomatic: "npm:^3.1.1" - semver: "npm:^7.7.3" - shelljs: "npm:^0.10.0" - simple-git: "npm:^3.36.0" - sinon: "npm:^19.0.4" - sinon-chai: "npm:^3.7.0" - uuid: "npm:11.1.1" - yargs: "npm:^17.7.2" - languageName: unknown - linkType: soft - -"natural-compare@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare@npm:1.4.0" - checksum: 10/23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d - languageName: node - linkType: hard - -"negotiator@npm:^0.6.3": - version: 0.6.3 - resolution: "negotiator@npm:0.6.3" - checksum: 10/2723fb822a17ad55c93a588a4bc44d53b22855bf4be5499916ca0cab1e7165409d0b288ba2577d7b029f10ce18cf2ed8e703e5af31c984e1e2304277ef979837 - languageName: node - linkType: hard - -"nise@npm:^6.1.1": - version: 6.1.1 - resolution: "nise@npm:6.1.1" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - "@sinonjs/fake-timers": "npm:^13.0.1" - "@sinonjs/text-encoding": "npm:^0.7.3" - just-extend: "npm:^6.2.0" - path-to-regexp: "npm:^8.1.0" - checksum: 10/2d3175587cf0a351e2c91eb643fdc59d266de39f394a3ac0bace38571749d1e7f25341d763899245139b8f0d2ee048b2d3387d75ecf94c4897e947d5fc881eea - languageName: node - linkType: hard - -"node-gyp@npm:latest": - version: 10.2.0 - resolution: "node-gyp@npm:10.2.0" - dependencies: - env-paths: "npm:^2.2.0" - exponential-backoff: "npm:^3.1.1" - glob: "npm:^10.3.10" - graceful-fs: "npm:^4.2.6" - make-fetch-happen: "npm:^13.0.0" - nopt: "npm:^7.0.0" - proc-log: "npm:^4.1.0" - semver: "npm:^7.3.5" - tar: "npm:^6.2.1" - which: "npm:^4.0.0" - bin: - node-gyp: bin/node-gyp.js - checksum: 10/41773093b1275751dec942b985982fd4e7a69b88cae719b868babcef3880ee6168aaec8dcaa8cd0b9fa7c84873e36cc549c6cac6a124ee65ba4ce1f1cc108cfe - languageName: node - linkType: hard - -"node-preload@npm:^0.2.1": - version: 0.2.1 - resolution: "node-preload@npm:0.2.1" - dependencies: - process-on-spawn: "npm:^1.0.0" - checksum: 10/de36ed365b7e474eaf05c41f976774dece23a7f398fe76dbf9705f9670a1f49e6a27c5f31fe58b4e43d96413fdce4806192c60d35317b25725636c90889d5bab - languageName: node - linkType: hard - -"node-releases@npm:^2.0.18": - version: 2.0.18 - resolution: "node-releases@npm:2.0.18" - checksum: 10/241e5fa9556f1c12bafb83c6c3e94f8cf3d8f2f8f904906ecef6e10bcaa1d59aa61212d4651bec70052015fc54bd3fdcdbe7fc0f638a17e6685aa586c076ec4e - languageName: node - linkType: hard - -"nopt@npm:^7.0.0": - version: 7.2.1 - resolution: "nopt@npm:7.2.1" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10/95a1f6dec8a81cd18cdc2fed93e6f0b4e02cf6bdb4501c848752c6e34f9883d9942f036a5e3b21a699047d8a448562d891e67492df68ec9c373e6198133337ae - languageName: node - linkType: hard - -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": - version: 3.0.0 - resolution: "normalize-path@npm:3.0.0" - checksum: 10/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 - languageName: node - linkType: hard - -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" - dependencies: - path-key: "npm:^3.0.0" - checksum: 10/5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 - languageName: node - linkType: hard - -"nyc@npm:^17.1.0": - version: 17.1.0 - resolution: "nyc@npm:17.1.0" - dependencies: - "@istanbuljs/load-nyc-config": "npm:^1.0.0" - "@istanbuljs/schema": "npm:^0.1.2" - caching-transform: "npm:^4.0.0" - convert-source-map: "npm:^1.7.0" - decamelize: "npm:^1.2.0" - find-cache-dir: "npm:^3.2.0" - find-up: "npm:^4.1.0" - foreground-child: "npm:^3.3.0" - get-package-type: "npm:^0.1.0" - glob: "npm:^7.1.6" - istanbul-lib-coverage: "npm:^3.0.0" - istanbul-lib-hook: "npm:^3.0.0" - istanbul-lib-instrument: "npm:^6.0.2" - istanbul-lib-processinfo: "npm:^2.0.2" - istanbul-lib-report: "npm:^3.0.0" - istanbul-lib-source-maps: "npm:^4.0.0" - istanbul-reports: "npm:^3.0.2" - make-dir: "npm:^3.0.0" - node-preload: "npm:^0.2.1" - p-map: "npm:^3.0.0" - process-on-spawn: "npm:^1.0.0" - resolve-from: "npm:^5.0.0" - rimraf: "npm:^3.0.0" - signal-exit: "npm:^3.0.2" - spawn-wrap: "npm:^2.0.0" - test-exclude: "npm:^6.0.0" - yargs: "npm:^15.0.2" - bin: - nyc: bin/nyc.js - checksum: 10/08ce3aeac3b1903e82d0b9c95779420d5dba86a04e79a36e2f551bb51aa304f508373de7f5c027198754402e966e177b5dbdf61bbfab0a3b30708675d5105caf - languageName: node - linkType: hard - -"once@npm:^1.3.0": - version: 1.4.0 - resolution: "once@npm:1.4.0" - dependencies: - wrappy: "npm:1" - checksum: 10/cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 - languageName: node - linkType: hard - -"onetime@npm:^5.1.2": - version: 5.1.2 - resolution: "onetime@npm:5.1.2" - dependencies: - mimic-fn: "npm:^2.1.0" - checksum: 10/e9fd0695a01cf226652f0385bf16b7a24153dbbb2039f764c8ba6d2306a8506b0e4ce570de6ad99c7a6eb49520743afdb66edd95ee979c1a342554ed49a9aadd - languageName: node - linkType: hard - -"optionator@npm:^0.9.3": - version: 0.9.4 - resolution: "optionator@npm:0.9.4" - dependencies: - deep-is: "npm:^0.1.3" - fast-levenshtein: "npm:^2.0.6" - levn: "npm:^0.4.1" - prelude-ls: "npm:^1.2.1" - type-check: "npm:^0.4.0" - word-wrap: "npm:^1.2.5" - checksum: 10/a8398559c60aef88d7f353a4f98dcdff6090a4e70f874c827302bf1213d9106a1c4d5fcb68dacb1feb3c30a04c4102f41047aa55d4c576b863d6fc876e001af6 - languageName: node - linkType: hard - -"p-limit@npm:^2.2.0": - version: 2.3.0 - resolution: "p-limit@npm:2.3.0" - dependencies: - p-try: "npm:^2.0.0" - checksum: 10/84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 - languageName: node - linkType: hard - -"p-limit@npm:^3.0.2": - version: 3.1.0 - resolution: "p-limit@npm:3.1.0" - dependencies: - yocto-queue: "npm:^0.1.0" - checksum: 10/7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-locate@npm:^4.1.0": - version: 4.1.0 - resolution: "p-locate@npm:4.1.0" - dependencies: - p-limit: "npm:^2.2.0" - checksum: 10/513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 - languageName: node - linkType: hard - -"p-locate@npm:^5.0.0": - version: 5.0.0 - resolution: "p-locate@npm:5.0.0" - dependencies: - p-limit: "npm:^3.0.2" - checksum: 10/1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-map@npm:^3.0.0": - version: 3.0.0 - resolution: "p-map@npm:3.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10/d4a0664d2af05d7e5f6f342e6493d4cad48f7398ac803c5066afb1f8d2010bfc2a83d935689437288f7b1a743772085b8fa0909a8282b5df4210bcda496c37c8 - languageName: node - linkType: hard - -"p-map@npm:^4.0.0": - version: 4.0.0 - resolution: "p-map@npm:4.0.0" - dependencies: - aggregate-error: "npm:^3.0.0" - checksum: 10/7ba4a2b1e24c05e1fc14bbaea0fc6d85cf005ae7e9c9425d4575550f37e2e584b1af97bcde78eacd7559208f20995988d52881334db16cf77bc1bcf68e48ed7c - languageName: node - linkType: hard - -"p-try@npm:^2.0.0": - version: 2.2.0 - resolution: "p-try@npm:2.2.0" - checksum: 10/f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae - languageName: node - linkType: hard - -"package-hash@npm:^4.0.0": - version: 4.0.0 - resolution: "package-hash@npm:4.0.0" - dependencies: - graceful-fs: "npm:^4.1.15" - hasha: "npm:^5.0.0" - lodash.flattendeep: "npm:^4.4.0" - release-zalgo: "npm:^1.0.0" - checksum: 10/c7209d98ac31926e0c1753d014f8b6b924e1e6a1aacf833dc99edece9c8381424c41c97c26c7eee82026944a79e99023cde5998bf515d7465c87005d52152040 - languageName: node - linkType: hard - -"package-json-from-dist@npm:^1.0.0": - version: 1.0.1 - resolution: "package-json-from-dist@npm:1.0.1" - checksum: 10/58ee9538f2f762988433da00e26acc788036914d57c71c246bf0be1b60cdbd77dd60b6a3e1a30465f0b248aeb80079e0b34cb6050b1dfa18c06953bb1cbc7602 - languageName: node - linkType: hard - -"parent-module@npm:^1.0.0": - version: 1.0.1 - resolution: "parent-module@npm:1.0.1" - dependencies: - callsites: "npm:^3.0.0" - checksum: 10/6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff - languageName: node - linkType: hard - -"path-exists@npm:^4.0.0": - version: 4.0.0 - resolution: "path-exists@npm:4.0.0" - checksum: 10/505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-is-absolute@npm:^1.0.0": - version: 1.0.1 - resolution: "path-is-absolute@npm:1.0.1" - checksum: 10/060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 - languageName: node - linkType: hard - -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": - version: 3.1.1 - resolution: "path-key@npm:3.1.1" - checksum: 10/55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 - languageName: node - linkType: hard - -"path-parse@npm:^1.0.7": - version: 1.0.7 - resolution: "path-parse@npm:1.0.7" - checksum: 10/49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": - version: 1.11.1 - resolution: "path-scurry@npm:1.11.1" - dependencies: - lru-cache: "npm:^10.2.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10/5e8845c159261adda6f09814d7725683257fcc85a18f329880ab4d7cc1d12830967eae5d5894e453f341710d5484b8fdbbd4d75181b4d6e1eb2f4dc7aeadc434 - languageName: node - linkType: hard - -"path-to-regexp@npm:^8.1.0": - version: 8.2.0 - resolution: "path-to-regexp@npm:8.2.0" - checksum: 10/23378276a172b8ba5f5fb824475d1818ca5ccee7bbdb4674701616470f23a14e536c1db11da9c9e6d82b82c556a817bbf4eee6e41b9ed20090ef9427cbb38e13 - languageName: node - linkType: hard - -"pathval@npm:^1.1.1": - version: 1.1.1 - resolution: "pathval@npm:1.1.1" - checksum: 10/b50a4751068aa3a5428f5a0b480deecedc6f537666a3630a0c2ae2d5e7c0f4bf0ee77b48404441ec1220bef0c91625e6030b3d3cf5a32ab0d9764018d1d9dbb6 - languageName: node - linkType: hard - -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: 10/a2ad60d94d185c30f2a140b19c512547713fb89b920d32cc6cf658fa786d63a37ba7b8451872c3d9fc34883971fb6e5878e07a20b60506e0bb2554dce9169ccb - languageName: node - linkType: hard - -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": - version: 2.3.2 - resolution: "picomatch@npm:2.3.2" - checksum: 10/b788ef8148a2415b9dec12f0bb350ae6a5830f8f1950e472abc2f5225494debf7d1b75eb031df0ceaea9e8ec3e7bad599e8dbf3c60d61b42be429ba41bff4426 - languageName: node - linkType: hard - -"pkg-dir@npm:^4.1.0": - version: 4.2.0 - resolution: "pkg-dir@npm:4.2.0" - dependencies: - find-up: "npm:^4.0.0" - checksum: 10/9863e3f35132bf99ae1636d31ff1e1e3501251d480336edb1c211133c8d58906bed80f154a1d723652df1fda91e01c7442c2eeaf9dc83157c7ae89087e43c8d6 - languageName: node - linkType: hard - -"prelude-ls@npm:^1.2.1": - version: 1.2.1 - resolution: "prelude-ls@npm:1.2.1" - checksum: 10/0b9d2c76801ca652a7f64892dd37b7e3fab149a37d2424920099bf894acccc62abb4424af2155ab36dea8744843060a2d8ddc983518d0b1e22265a22324b72ed - languageName: node - linkType: hard - -"proc-log@npm:^4.1.0, proc-log@npm:^4.2.0": - version: 4.2.0 - resolution: "proc-log@npm:4.2.0" - checksum: 10/4e1394491b717f6c1ade15c570ecd4c2b681698474d3ae2d303c1e4b6ab9455bd5a81566211e82890d5a5ae9859718cc6954d5150bb18b09b72ecb297beae90a - languageName: node - linkType: hard - -"process-on-spawn@npm:^1.0.0": - version: 1.0.0 - resolution: "process-on-spawn@npm:1.0.0" - dependencies: - fromentries: "npm:^1.2.0" - checksum: 10/8795d71742798e5a059e13da2a9c13988aa7c673a3a57f276c1ff6ed942ba9b7636139121c6a409eaa2ea6a8fda7af4be19c3dc576320515bb3f354e3544106e - languageName: node - linkType: hard - -"promise-retry@npm:^2.0.1": - version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: "npm:^2.0.2" - retry: "npm:^0.12.0" - checksum: 10/96e1a82453c6c96eef53a37a1d6134c9f2482f94068f98a59145d0986ca4e497bf110a410adf73857e588165eab3899f0ebcf7b3890c1b3ce802abc0d65967d4 - languageName: node - linkType: hard - -"proxyquire@npm:^2.1.3": - version: 2.1.3 - resolution: "proxyquire@npm:2.1.3" - dependencies: - fill-keys: "npm:^1.0.2" - module-not-found-error: "npm:^1.0.1" - resolve: "npm:^1.11.1" - checksum: 10/c124bdb6f732d680c59c2d4cf0ff66ebae7b3c76af0c1bb05d5c9b982ba05db22c1df6ad4cb486d1d8a5f6b1fe0534cbea864917e82dacaf947cfa84c4c30463 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.3.1 - resolution: "punycode@npm:2.3.1" - checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059 - languageName: node - linkType: hard - -"queue-microtask@npm:^1.2.2": - version: 1.2.3 - resolution: "queue-microtask@npm:1.2.3" - checksum: 10/72900df0616e473e824202113c3df6abae59150dfb73ed13273503127235320e9c8ca4aaaaccfd58cf417c6ca92a6e68ee9a5c3182886ae949a768639b388a7b - languageName: node - linkType: hard - -"randomatic@npm:^3.1.1": - version: 3.1.1 - resolution: "randomatic@npm:3.1.1" - dependencies: - is-number: "npm:^4.0.0" - kind-of: "npm:^6.0.0" - math-random: "npm:^1.0.1" - checksum: 10/fd7517e78425722b67ad6ddbf930f668bf00624d7210546e32562888d8558d0fcca9b5b7ca8639943eea6dc1b03ea666d5af0a7fd698b7b08e1cdb84c94fd5b5 - languageName: node - linkType: hard - -"randombytes@npm:^2.1.0": - version: 2.1.0 - resolution: "randombytes@npm:2.1.0" - dependencies: - safe-buffer: "npm:^5.1.0" - checksum: 10/4efd1ad3d88db77c2d16588dc54c2b52fd2461e70fe5724611f38d283857094fe09040fa2c9776366803c3152cf133171b452ef717592b65631ce5dc3a2bdafc - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: "npm:^2.2.1" - checksum: 10/196b30ef6ccf9b6e18c4e1724b7334f72a093d011a99f3b5920470f0b3406a51770867b3e1ae9711f227ef7a7065982f6ee2ce316746b2cb42c88efe44297fe7 - languageName: node - linkType: hard - -"regexpp@npm:^3.0.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: 10/3310010895a906873262f4b494fc99bcef1e71ef6720a0532c5999ca586498cbd4a284c8e3c2423f9d1d37512fd08d6064b7564e0e59508cf938f76dd15ace84 - languageName: node - linkType: hard - -"release-zalgo@npm:^1.0.0": - version: 1.0.0 - resolution: "release-zalgo@npm:1.0.0" - dependencies: - es6-error: "npm:^4.0.1" - checksum: 10/1719e44b240ee1f57d034b26ea167f3cbf3c36fdae6d6efd0e6e5b202d9852baffc1c5595d378b5f8b2ad729b907ddd962f3d051d89499f83584993a5399f964 - languageName: node - linkType: hard - -"require-directory@npm:^2.1.1": - version: 2.1.1 - resolution: "require-directory@npm:2.1.1" - checksum: 10/a72468e2589270d91f06c7d36ec97a88db53ae5d6fe3787fadc943f0b0276b10347f89b363b2a82285f650bdcc135ad4a257c61bdd4d00d6df1fa24875b0ddaf - languageName: node - linkType: hard - -"require-main-filename@npm:^2.0.0": - version: 2.0.0 - resolution: "require-main-filename@npm:2.0.0" - checksum: 10/8604a570c06a69c9d939275becc33a65676529e1c3e5a9f42d58471674df79357872b96d70bb93a0380a62d60dc9031c98b1a9dad98c946ffdd61b7ac0c8cedd - languageName: node - linkType: hard - -"resolve-from@npm:^4.0.0": - version: 4.0.0 - resolution: "resolve-from@npm:4.0.0" - checksum: 10/91eb76ce83621eea7bbdd9b55121a5c1c4a39e54a9ce04a9ad4517f102f8b5131c2cf07622c738a6683991bf54f2ce178f5a42803ecbd527ddc5105f362cc9e3 - languageName: node - linkType: hard - -"resolve-from@npm:^5.0.0": - version: 5.0.0 - resolution: "resolve-from@npm:5.0.0" - checksum: 10/be18a5e4d76dd711778664829841cde690971d02b6cbae277735a09c1c28f407b99ef6ef3cd585a1e6546d4097b28df40ed32c4a287b9699dcf6d7f208495e23 - languageName: node - linkType: hard - -"resolve@npm:^1.10.1, resolve@npm:^1.11.1": - version: 1.22.8 - resolution: "resolve@npm:1.22.8" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10/c473506ee01eb45cbcfefb68652ae5759e092e6b0fb64547feadf9736a6394f258fbc6f88e00c5ca36d5477fbb65388b272432a3600fa223062e54333c156753 - languageName: node - linkType: hard - -"resolve@patch:resolve@npm%3A^1.10.1#optional!builtin, resolve@patch:resolve@npm%3A^1.11.1#optional!builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" - dependencies: - is-core-module: "npm:^2.13.0" - path-parse: "npm:^1.0.7" - supports-preserve-symlinks-flag: "npm:^1.0.0" - bin: - resolve: bin/resolve - checksum: 10/f345cd37f56a2c0275e3fe062517c650bb673815d885e7507566df589375d165bbbf4bdb6aa95600a9bc55f4744b81f452b5a63f95b9f10a72787dba3c90890a - languageName: node - linkType: hard - -"retry@npm:^0.12.0": - version: 0.12.0 - resolution: "retry@npm:0.12.0" - checksum: 10/1f914879f97e7ee931ad05fe3afa629bd55270fc6cf1c1e589b6a99fab96d15daad0fa1a52a00c729ec0078045fe3e399bd4fd0c93bcc906957bdc17f89cb8e6 - languageName: node - linkType: hard - -"reusify@npm:^1.0.4": - version: 1.0.4 - resolution: "reusify@npm:1.0.4" - checksum: 10/14222c9e1d3f9ae01480c50d96057228a8524706db79cdeb5a2ce5bb7070dd9f409a6f84a02cbef8cdc80d39aef86f2dd03d155188a1300c599b05437dcd2ffb - languageName: node - linkType: hard - -"rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": - version: 3.0.2 - resolution: "rimraf@npm:3.0.2" - dependencies: - glob: "npm:^7.1.3" - bin: - rimraf: bin.js - checksum: 10/063ffaccaaaca2cfd0ef3beafb12d6a03dd7ff1260d752d62a6077b5dfff6ae81bea571f655bb6b589d366930ec1bdd285d40d560c0dae9b12f125e54eb743d5 - languageName: node - linkType: hard - -"run-parallel@npm:^1.1.9": - version: 1.2.0 - resolution: "run-parallel@npm:1.2.0" - dependencies: - queue-microtask: "npm:^1.2.2" - checksum: 10/cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d - languageName: node - linkType: hard - -"safe-buffer@npm:^5.1.0": - version: 5.2.1 - resolution: "safe-buffer@npm:5.2.1" - checksum: 10/32872cd0ff68a3ddade7a7617b8f4c2ae8764d8b7d884c651b74457967a9e0e886267d3ecc781220629c44a865167b61c375d2da6c720c840ecd73f45d5d9451 - languageName: node - linkType: hard - -"safer-buffer@npm:>= 2.1.2 < 3.0.0": - version: 2.1.2 - resolution: "safer-buffer@npm:2.1.2" - checksum: 10/7eaf7a0cf37cc27b42fb3ef6a9b1df6e93a1c6d98c6c6702b02fe262d5fcbd89db63320793b99b21cb5348097d0a53de81bd5f4e8b86e20cc9412e3f1cfb4e83 - languageName: node - linkType: hard - -"semver@npm:^6.0.0, semver@npm:^6.1.0, semver@npm:^6.3.1": - version: 6.3.1 - resolution: "semver@npm:6.3.1" - bin: - semver: bin/semver.js - checksum: 10/1ef3a85bd02a760c6ef76a45b8c1ce18226de40831e02a00bad78485390b98b6ccaa31046245fc63bba4a47a6a592b6c7eedc65cc47126e60489f9cc1ce3ed7e - languageName: node - linkType: hard - -"semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 - languageName: node - linkType: hard - -"semver@npm:^7.7.3": - version: 7.7.3 - resolution: "semver@npm:7.7.3" - bin: - semver: bin/semver.js - checksum: 10/8dbc3168e057a38fc322af909c7f5617483c50caddba135439ff09a754b20bdd6482a5123ff543dad4affa488ecf46ec5fb56d61312ad20bb140199b88dfaea9 - languageName: node - linkType: hard - -"serialize-javascript@npm:^6.0.2": - version: 6.0.2 - resolution: "serialize-javascript@npm:6.0.2" - dependencies: - randombytes: "npm:^2.1.0" - checksum: 10/445a420a6fa2eaee4b70cbd884d538e259ab278200a2ededd73253ada17d5d48e91fb1f4cd224a236ab62ea7ba0a70c6af29fc93b4f3d3078bf7da1c031fde58 - languageName: node - linkType: hard - -"set-blocking@npm:^2.0.0": - version: 2.0.0 - resolution: "set-blocking@npm:2.0.0" - checksum: 10/8980ebf7ae9eb945bb036b6e283c547ee783a1ad557a82babf758a065e2fb6ea337fd82cac30dd565c1e606e423f30024a19fff7afbf4977d784720c4026a8ef - languageName: node - linkType: hard - -"shebang-command@npm:^2.0.0": - version: 2.0.0 - resolution: "shebang-command@npm:2.0.0" - dependencies: - shebang-regex: "npm:^3.0.0" - checksum: 10/6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa - languageName: node - linkType: hard - -"shebang-regex@npm:^3.0.0": - version: 3.0.0 - resolution: "shebang-regex@npm:3.0.0" - checksum: 10/1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 - languageName: node - linkType: hard - -"shelljs@npm:^0.10.0": - version: 0.10.0 - resolution: "shelljs@npm:0.10.0" - dependencies: - execa: "npm:^5.1.1" - fast-glob: "npm:^3.3.2" - checksum: 10/5e7836699db2d06e1f28184b9c12f9b0d862e51a670929e5aadb085cfd10fb477a31716dc0147f8248c0a7490ec64e18fc9259488dc02ceac67af67a80fa552d - languageName: node - linkType: hard - -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3": - version: 3.0.7 - resolution: "signal-exit@npm:3.0.7" - checksum: 10/a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 - languageName: node - linkType: hard - -"signal-exit@npm:^4.0.1": - version: 4.1.0 - resolution: "signal-exit@npm:4.1.0" - checksum: 10/c9fa63bbbd7431066174a48ba2dd9986dfd930c3a8b59de9c29d7b6854ec1c12a80d15310869ea5166d413b99f041bfa3dd80a7947bcd44ea8e6eb3ffeabfa1f - languageName: node - linkType: hard - -"simple-git@npm:^3.36.0": - version: 3.36.0 - resolution: "simple-git@npm:3.36.0" - dependencies: - "@kwsites/file-exists": "npm:^1.1.1" - "@kwsites/promise-deferred": "npm:^1.1.1" - "@simple-git/args-pathspec": "npm:^1.0.3" - "@simple-git/argv-parser": "npm:^1.1.0" - debug: "npm:^4.4.0" - checksum: 10/79a745464798bce17fc5c286ff4a44ba07d368a745d03d31f3c3cef51bd63b98dc29e72f55dda087b64e5db90e5e9f91a7429543ddf08d105d9a069c525e6818 - languageName: node - linkType: hard - -"sinon-chai@npm:^3.7.0": - version: 3.7.0 - resolution: "sinon-chai@npm:3.7.0" - peerDependencies: - chai: ^4.0.0 - sinon: ">=4.0.0" - checksum: 10/028853eb8a545ca613c6863014a40f07d1e6b81467e20939fefcd13f170206d24165b91099fb297aeb4d137745e321da25daa8e2d665cc0a78f90d5b877e8bbe - languageName: node - linkType: hard - -"sinon@npm:^19.0.4": - version: 19.0.4 - resolution: "sinon@npm:19.0.4" - dependencies: - "@sinonjs/commons": "npm:^3.0.1" - "@sinonjs/fake-timers": "npm:^13.0.5" - "@sinonjs/samsam": "npm:^8.0.1" - diff: "npm:^7.0.0" - nise: "npm:^6.1.1" - supports-color: "npm:^7.2.0" - checksum: 10/c38e4de00b1829f629f331abb4fc77c4f4fdc905126e7500a49a3c46bc85ba7b93a365aa8d7e7f7b8dc8e0f78554a31c6c3c6258130184c9ff88d5a3062e1cee - languageName: node - linkType: hard - -"smart-buffer@npm:^4.2.0": - version: 4.2.0 - resolution: "smart-buffer@npm:4.2.0" - checksum: 10/927484aa0b1640fd9473cee3e0a0bcad6fce93fd7bbc18bac9ad0c33686f5d2e2c422fba24b5899c184524af01e11dd2bd051c2bf2b07e47aff8ca72cbfc60d2 - languageName: node - linkType: hard - -"socks-proxy-agent@npm:^8.0.3": - version: 8.0.4 - resolution: "socks-proxy-agent@npm:8.0.4" - dependencies: - agent-base: "npm:^7.1.1" - debug: "npm:^4.3.4" - socks: "npm:^2.8.3" - checksum: 10/c8e7c2b398338b49a0a0f4d2bae5c0602aeeca6b478b99415927b6c5db349ca258448f2c87c6958ebf83eea17d42cbc5d1af0bfecb276cac10b9658b0f07f7d7 - languageName: node - linkType: hard - -"socks@npm:^2.8.3": - version: 2.8.3 - resolution: "socks@npm:2.8.3" - dependencies: - ip-address: "npm:^9.0.5" - smart-buffer: "npm:^4.2.0" - checksum: 10/ffcb622c22481dfcd7589aae71fbfd71ca34334064d181df64bf8b7feaeee19706aba4cffd1de35cc7bbaeeaa0af96be2d7f40fcbc7bc0ab69533a7ae9ffc4fb - languageName: node - linkType: hard - -"source-map@npm:^0.6.1": - version: 0.6.1 - resolution: "source-map@npm:0.6.1" - checksum: 10/59ef7462f1c29d502b3057e822cdbdae0b0e565302c4dd1a95e11e793d8d9d62006cdc10e0fd99163ca33ff2071360cf50ee13f90440806e7ed57d81cba2f7ff - languageName: node - linkType: hard - -"spawn-wrap@npm:^2.0.0": - version: 2.0.0 - resolution: "spawn-wrap@npm:2.0.0" - dependencies: - foreground-child: "npm:^2.0.0" - is-windows: "npm:^1.0.2" - make-dir: "npm:^3.0.0" - rimraf: "npm:^3.0.0" - signal-exit: "npm:^3.0.2" - which: "npm:^2.0.1" - checksum: 10/ce6ca08d66c3a41a28a7ecc10bf4945d7930fd3ae961d40804ee109cee6ee9f8436125f53bc07918ca1eb461fe2ff0033af1dc3cb803469b585639675fc2d2e7 - languageName: node - linkType: hard - -"sprintf-js@npm:^1.1.3": - version: 1.1.3 - resolution: "sprintf-js@npm:1.1.3" - checksum: 10/e7587128c423f7e43cc625fe2f87e6affdf5ca51c1cc468e910d8aaca46bb44a7fbcfa552f787b1d3987f7043aeb4527d1b99559e6621e01b42b3f45e5a24cbb - languageName: node - linkType: hard - -"sprintf-js@npm:~1.0.2": - version: 1.0.3 - resolution: "sprintf-js@npm:1.0.3" - checksum: 10/c34828732ab8509c2741e5fd1af6b767c3daf2c642f267788f933a65b1614943c282e74c4284f4fa749c264b18ee016a0d37a3e5b73aee446da46277d3a85daa - languageName: node - linkType: hard - -"ssri@npm:^10.0.0": - version: 10.0.6 - resolution: "ssri@npm:10.0.6" - dependencies: - minipass: "npm:^7.0.3" - checksum: 10/f92c1b3cc9bfd0a925417412d07d999935917bc87049f43ebec41074661d64cf720315661844106a77da9f8204b6d55ae29f9514e673083cae39464343af2a8b - languageName: node - linkType: hard - -"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": - version: 4.2.3 - resolution: "string-width@npm:4.2.3" - dependencies: - emoji-regex: "npm:^8.0.0" - is-fullwidth-code-point: "npm:^3.0.0" - strip-ansi: "npm:^6.0.1" - checksum: 10/e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb - languageName: node - linkType: hard - -"string-width@npm:^5.0.1, string-width@npm:^5.1.2": - version: 5.1.2 - resolution: "string-width@npm:5.1.2" - dependencies: - eastasianwidth: "npm:^0.2.0" - emoji-regex: "npm:^9.2.2" - strip-ansi: "npm:^7.0.1" - checksum: 10/7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 - languageName: node - linkType: hard - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": - version: 6.0.1 - resolution: "strip-ansi@npm:6.0.1" - dependencies: - ansi-regex: "npm:^5.0.1" - checksum: 10/ae3b5436d34fadeb6096367626ce987057713c566e1e7768818797e00ac5d62023d0f198c4e681eae9e20701721980b26a64a8f5b91238869592a9c6800719a2 - languageName: node - linkType: hard - -"strip-ansi@npm:^7.0.1": - version: 7.1.0 - resolution: "strip-ansi@npm:7.1.0" - dependencies: - ansi-regex: "npm:^6.0.1" - checksum: 10/475f53e9c44375d6e72807284024ac5d668ee1d06010740dec0b9744f2ddf47de8d7151f80e5f6190fc8f384e802fdf9504b76a7e9020c9faee7103623338be2 - languageName: node - linkType: hard - -"strip-bom@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-bom@npm:4.0.0" - checksum: 10/9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 - languageName: node - linkType: hard - -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 10/69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 - languageName: node - linkType: hard - -"strip-json-comments@npm:^3.1.1": - version: 3.1.1 - resolution: "strip-json-comments@npm:3.1.1" - checksum: 10/492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 - languageName: node - linkType: hard - -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 10/5f505c6fa3c6e05873b43af096ddeb22159831597649881aeb8572d6fe3b81e798cc10840d0c9735e0026b250368851b7f77b65e84f4e4daa820a4f69947f55b - languageName: node - linkType: hard - -"supports-color@npm:^7.1.0, supports-color@npm:^7.2.0": - version: 7.2.0 - resolution: "supports-color@npm:7.2.0" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10/c8bb7afd564e3b26b50ca6ee47572c217526a1389fe018d00345856d4a9b08ffbd61fadaf283a87368d94c3dcdb8f5ffe2650a5a65863e21ad2730ca0f05210a - languageName: node - linkType: hard - -"supports-color@npm:^8.1.1": - version: 8.1.1 - resolution: "supports-color@npm:8.1.1" - dependencies: - has-flag: "npm:^4.0.0" - checksum: 10/157b534df88e39c5518c5e78c35580c1eca848d7dbaf31bbe06cdfc048e22c7ff1a9d046ae17b25691128f631a51d9ec373c1b740c12ae4f0de6e292037e4282 - languageName: node - linkType: hard - -"supports-preserve-symlinks-flag@npm:^1.0.0": - version: 1.0.0 - resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 10/a9dc19ae2220c952bd2231d08ddeecb1b0328b61e72071ff4000c8384e145cc07c1c0bdb3b5a1cb06e186a7b2790f1dee793418b332f6ddf320de25d9125be7e - languageName: node - linkType: hard - -"tar@npm:^6.1.11, tar@npm:^6.2.1": - version: 6.2.1 - resolution: "tar@npm:6.2.1" - dependencies: - chownr: "npm:^2.0.0" - fs-minipass: "npm:^2.0.0" - minipass: "npm:^5.0.0" - minizlib: "npm:^2.1.1" - mkdirp: "npm:^1.0.3" - yallist: "npm:^4.0.0" - checksum: 10/bfbfbb2861888077fc1130b84029cdc2721efb93d1d1fb80f22a7ac3a98ec6f8972f29e564103bbebf5e97be67ebc356d37fa48dbc4960600a1eb7230fbd1ea0 - languageName: node - linkType: hard - -"test-exclude@npm:^6.0.0": - version: 6.0.0 - resolution: "test-exclude@npm:6.0.0" - dependencies: - "@istanbuljs/schema": "npm:^0.1.2" - glob: "npm:^7.1.4" - minimatch: "npm:^3.0.4" - checksum: 10/8fccb2cb6c8fcb6bb4115394feb833f8b6cf4b9503ec2485c2c90febf435cac62abe882a0c5c51a37b9bbe70640cdd05acf5f45e486ac4583389f4b0855f69e5 - languageName: node - linkType: hard - -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 - languageName: node - linkType: hard - -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10/be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - -"to-regex-range@npm:^5.0.1": - version: 5.0.1 - resolution: "to-regex-range@npm:5.0.1" - dependencies: - is-number: "npm:^7.0.0" - checksum: 10/10dda13571e1f5ad37546827e9b6d4252d2e0bc176c24a101252153ef435d83696e2557fe128c4678e4e78f5f01e83711c703eef9814eb12dab028580d45980a - languageName: node - linkType: hard - -"type-check@npm:^0.4.0, type-check@npm:~0.4.0": - version: 0.4.0 - resolution: "type-check@npm:0.4.0" - dependencies: - prelude-ls: "npm:^1.2.1" - checksum: 10/14687776479d048e3c1dbfe58a2409e00367810d6960c0f619b33793271ff2a27f81b52461f14a162f1f89a9b1d8da1b237fc7c99b0e1fdcec28ec63a86b1fec - languageName: node - linkType: hard - -"type-detect@npm:4.0.8": - version: 4.0.8 - resolution: "type-detect@npm:4.0.8" - checksum: 10/5179e3b8ebc51fce1b13efb75fdea4595484433f9683bbc2dca6d99789dba4e602ab7922d2656f2ce8383987467f7770131d4a7f06a26287db0615d2f4c4ce7d - languageName: node - linkType: hard - -"type-detect@npm:^4.0.0, type-detect@npm:^4.1.0": - version: 4.1.0 - resolution: "type-detect@npm:4.1.0" - checksum: 10/e363bf0352427a79301f26a7795a27718624c49c576965076624eb5495d87515030b207217845f7018093adcbe169b2d119bb9b7f1a31a92bfbb1ab9639ca8dd - languageName: node - linkType: hard - -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10/8907e16284b2d6cfa4f4817e93520121941baba36b39219ea36acfe64c86b9dbc10c9941af450bd60832c8f43464974d51c0957f9858bc66b952b66b6914cbb9 - languageName: node - linkType: hard - -"type-fest@npm:^0.8.0": - version: 0.8.1 - resolution: "type-fest@npm:0.8.1" - checksum: 10/fd4a91bfb706aeeb0d326ebd2e9a8ea5263979e5dec8d16c3e469a5bd3a946e014a062ef76c02e3086d3d1c7209a56a20a4caafd0e9f9a5c2ab975084ea3d388 - languageName: node - linkType: hard - -"typedarray-to-buffer@npm:^3.1.5": - version: 3.1.5 - resolution: "typedarray-to-buffer@npm:3.1.5" - dependencies: - is-typedarray: "npm:^1.0.0" - checksum: 10/7c850c3433fbdf4d04f04edfc751743b8f577828b8e1eb93b95a3bce782d156e267d83e20fb32b3b47813e69a69ab5e9b5342653332f7d21c7d1210661a7a72c - languageName: node - linkType: hard - -"unique-filename@npm:^3.0.0": - version: 3.0.0 - resolution: "unique-filename@npm:3.0.0" - dependencies: - unique-slug: "npm:^4.0.0" - checksum: 10/8e2f59b356cb2e54aab14ff98a51ac6c45781d15ceaab6d4f1c2228b780193dc70fae4463ce9e1df4479cb9d3304d7c2043a3fb905bdeca71cc7e8ce27e063df - languageName: node - linkType: hard - -"unique-slug@npm:^4.0.0": - version: 4.0.0 - resolution: "unique-slug@npm:4.0.0" - dependencies: - imurmurhash: "npm:^0.1.4" - checksum: 10/40912a8963fc02fb8b600cf50197df4a275c602c60de4cac4f75879d3c48558cfac48de08a25cc10df8112161f7180b3bbb4d662aadb711568602f9eddee54f0 - languageName: node - linkType: hard - -"update-browserslist-db@npm:^1.1.0": - version: 1.1.1 - resolution: "update-browserslist-db@npm:1.1.1" - dependencies: - escalade: "npm:^3.2.0" - picocolors: "npm:^1.1.0" - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 10/7678dd8609750588d01aa7460e8eddf2ff9d16c2a52fb1811190e0d056390f1fdffd94db3cf8fb209cf634ab4fa9407886338711c71cc6ccade5eeb22b093734 - languageName: node - linkType: hard - -"uri-js@npm:^4.2.2": - version: 4.4.1 - resolution: "uri-js@npm:4.4.1" - dependencies: - punycode: "npm:^2.1.0" - checksum: 10/b271ca7e3d46b7160222e3afa3e531505161c9a4e097febae9664e4b59912f4cbe94861361a4175edac3a03fee99d91e44b6a58c17a634bc5a664b19fc76fbcb - languageName: node - linkType: hard - -"uuid@npm:11.1.1": - version: 11.1.1 - resolution: "uuid@npm:11.1.1" - bin: - uuid: dist/esm/bin/uuid - checksum: 10/16411d3dc12a08d6691616c09a75e66a7f900ba1beef6628a76fe0602f82fae2ee537b564d0b7bc95c24f58d059ca9b58c75a1e806118efb50e17822ff00ddd2 - languageName: node - linkType: hard - -"uuid@npm:^8.3.2": - version: 8.3.2 - resolution: "uuid@npm:8.3.2" - bin: - uuid: dist/bin/uuid - checksum: 10/9a5f7aa1d6f56dd1e8d5f2478f855f25c645e64e26e347a98e98d95781d5ed20062d6cca2eecb58ba7c84bc3910be95c0451ef4161906abaab44f9cb68ffbdd1 - languageName: node - linkType: hard - -"which-module@npm:^2.0.0": - version: 2.0.1 - resolution: "which-module@npm:2.0.1" - checksum: 10/1967b7ce17a2485544a4fdd9063599f0f773959cca24176dbe8f405e55472d748b7c549cd7920ff6abb8f1ab7db0b0f1b36de1a21c57a8ff741f4f1e792c52be - languageName: node - linkType: hard - -"which@npm:^2.0.1": - version: 2.0.2 - resolution: "which@npm:2.0.2" - dependencies: - isexe: "npm:^2.0.0" - bin: - node-which: ./bin/node-which - checksum: 10/4782f8a1d6b8fc12c65e968fea49f59752bf6302dc43036c3bf87da718a80710f61a062516e9764c70008b487929a73546125570acea95c5b5dcc8ac3052c70f - languageName: node - linkType: hard - -"which@npm:^4.0.0": - version: 4.0.0 - resolution: "which@npm:4.0.0" - dependencies: - isexe: "npm:^3.1.1" - bin: - node-which: bin/which.js - checksum: 10/f17e84c042592c21e23c8195108cff18c64050b9efb8459589116999ea9da6dd1509e6a1bac3aeebefd137be00fabbb61b5c2bc0aa0f8526f32b58ee2f545651 - languageName: node - linkType: hard - -"word-wrap@npm:^1.2.5": - version: 1.2.5 - resolution: "word-wrap@npm:1.2.5" - checksum: 10/1ec6f6089f205f83037be10d0c4b34c9183b0b63fca0834a5b3cee55dd321429d73d40bb44c8fc8471b5203d6e8f8275717f49a8ff4b2b0ab41d7e1b563e0854 - languageName: node - linkType: hard - -"workerpool@npm:^6.5.1": - version: 6.5.1 - resolution: "workerpool@npm:6.5.1" - checksum: 10/b1b00139fe62f2ebec556a2af8085bf6e7502ad26cf2a4dcb34fb4408b2e68aa12c88b0a50cb463b24f2806d60fa491fc0da933b56ec3b53646aeec0025d14cb - languageName: node - linkType: hard - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": - version: 7.0.0 - resolution: "wrap-ansi@npm:7.0.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10/cebdaeca3a6880da410f75209e68cd05428580de5ad24535f22696d7d9cab134d1f8498599f344c3cf0fb37c1715807a183778d8c648d6cc0cb5ff2bb4236540 - languageName: node - linkType: hard - -"wrap-ansi@npm:^6.2.0": - version: 6.2.0 - resolution: "wrap-ansi@npm:6.2.0" - dependencies: - ansi-styles: "npm:^4.0.0" - string-width: "npm:^4.1.0" - strip-ansi: "npm:^6.0.0" - checksum: 10/0d64f2d438e0b555e693b95aee7b2689a12c3be5ac458192a1ce28f542a6e9e59ddfecc37520910c2c88eb1f82a5411260566dba5064e8f9895e76e169e76187 - languageName: node - linkType: hard - -"wrap-ansi@npm:^8.1.0": - version: 8.1.0 - resolution: "wrap-ansi@npm:8.1.0" - dependencies: - ansi-styles: "npm:^6.1.0" - string-width: "npm:^5.0.1" - strip-ansi: "npm:^7.0.1" - checksum: 10/7b1e4b35e9bb2312d2ee9ee7dc95b8cb5f8b4b5a89f7dde5543fe66c1e3715663094defa50d75454ac900bd210f702d575f15f3f17fa9ec0291806d2578d1ddf - languageName: node - linkType: hard - -"wrappy@npm:1": - version: 1.0.2 - resolution: "wrappy@npm:1.0.2" - checksum: 10/159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 - languageName: node - linkType: hard - -"write-file-atomic@npm:^3.0.0": - version: 3.0.3 - resolution: "write-file-atomic@npm:3.0.3" - dependencies: - imurmurhash: "npm:^0.1.4" - is-typedarray: "npm:^1.0.0" - signal-exit: "npm:^3.0.2" - typedarray-to-buffer: "npm:^3.1.5" - checksum: 10/0955ab94308b74d32bc252afe69d8b42ba4b8a28b8d79f399f3f405969f82623f981e35d13129a52aa2973450f342107c06d86047572637584e85a1c0c246bf3 - languageName: node - linkType: hard - -"y18n@npm:^4.0.0": - version: 4.0.3 - resolution: "y18n@npm:4.0.3" - checksum: 10/392870b2a100bbc643bc035fe3a89cef5591b719c7bdc8721bcdb3d27ab39fa4870acdca67b0ee096e146d769f311d68eda6b8195a6d970f227795061923013f - languageName: node - linkType: hard - -"y18n@npm:^5.0.5": - version: 5.0.8 - resolution: "y18n@npm:5.0.8" - checksum: 10/5f1b5f95e3775de4514edbb142398a2c37849ccfaf04a015be5d75521e9629d3be29bd4432d23c57f37e5b61ade592fb0197022e9993f81a06a5afbdcda9346d - languageName: node - linkType: hard - -"yallist@npm:^3.0.2": - version: 3.1.1 - resolution: "yallist@npm:3.1.1" - checksum: 10/9af0a4329c3c6b779ac4736c69fae4190ac03029fa27c1aef4e6bcc92119b73dea6fe5db5fe881fb0ce2a0e9539a42cdf60c7c21eda04d1a0b8c082e38509efb - languageName: node - linkType: hard - -"yallist@npm:^4.0.0": - version: 4.0.0 - resolution: "yallist@npm:4.0.0" - checksum: 10/4cb02b42b8a93b5cf50caf5d8e9beb409400a8a4d85e83bb0685c1457e9ac0b7a00819e9f5991ac25ffabb56a78e2f017c1acc010b3a1babfe6de690ba531abd - languageName: node - linkType: hard - -"yargs-parser@npm:^18.1.2": - version: 18.1.3 - resolution: "yargs-parser@npm:18.1.3" - dependencies: - camelcase: "npm:^5.0.0" - decamelize: "npm:^1.2.0" - checksum: 10/235bcbad5b7ca13e5abc54df61d42f230857c6f83223a38e4ed7b824681875b7f8b6ed52139d88a3ad007050f28dc0324b3c805deac7db22ae3b4815dae0e1bf - languageName: node - linkType: hard - -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.9": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 10/0188f430a0f496551d09df6719a9132a3469e47fe2747208b1dd0ab2bb0c512a95d0b081628bbca5400fb20dbf2fabe63d22badb346cecadffdd948b049f3fcc - languageName: node - linkType: hard - -"yargs-parser@npm:^21.1.1": - version: 21.1.1 - resolution: "yargs-parser@npm:21.1.1" - checksum: 10/9dc2c217ea3bf8d858041252d43e074f7166b53f3d010a8c711275e09cd3d62a002969a39858b92bbda2a6a63a585c7127014534a560b9c69ed2d923d113406e - languageName: node - linkType: hard - -"yargs-unparser@npm:^2.0.0": - version: 2.0.0 - resolution: "yargs-unparser@npm:2.0.0" - dependencies: - camelcase: "npm:^6.0.0" - decamelize: "npm:^4.0.0" - flat: "npm:^5.0.2" - is-plain-obj: "npm:^2.1.0" - checksum: 10/68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 - languageName: node - linkType: hard - -"yargs@npm:^15.0.2": - version: 15.4.1 - resolution: "yargs@npm:15.4.1" - dependencies: - cliui: "npm:^6.0.0" - decamelize: "npm:^1.2.0" - find-up: "npm:^4.1.0" - get-caller-file: "npm:^2.0.1" - require-directory: "npm:^2.1.1" - require-main-filename: "npm:^2.0.0" - set-blocking: "npm:^2.0.0" - string-width: "npm:^4.2.0" - which-module: "npm:^2.0.0" - y18n: "npm:^4.0.0" - yargs-parser: "npm:^18.1.2" - checksum: 10/bbcc82222996c0982905b668644ca363eebe6ffd6a572fbb52f0c0e8146661d8ce5af2a7df546968779bb03d1e4186f3ad3d55dfaadd1c4f0d5187c0e3a5ba16 - languageName: node - linkType: hard - -"yargs@npm:^16.2.0": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: "npm:^7.0.2" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: 10/807fa21211d2117135d557f95fcd3c3d390530cda2eca0c840f1d95f0f40209dcfeb5ec18c785a1f3425896e623e3b2681e8bb7b6600060eda1c3f4804e7957e - languageName: node - linkType: hard - -"yargs@npm:^17.7.2": - version: 17.7.2 - resolution: "yargs@npm:17.7.2" - dependencies: - cliui: "npm:^8.0.1" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.3" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^21.1.1" - checksum: 10/abb3e37678d6e38ea85485ed86ebe0d1e3464c640d7d9069805ea0da12f69d5a32df8e5625e370f9c96dd1c2dc088ab2d0a4dd32af18222ef3c4224a19471576 - languageName: node - linkType: hard - -"yocto-queue@npm:^0.1.0": - version: 0.1.0 - resolution: "yocto-queue@npm:0.1.0" - checksum: 10/f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard