diff --git a/.betterer.results b/.betterer.results index 6d502c778..706f05f64 100644 --- a/.betterer.results +++ b/.betterer.results @@ -2,4 +2,49 @@ // // If this file contains merge conflicts, use `betterer merge` to automatically resolve them: // https://phenomnomnominal.github.io/betterer/docs/results-file/#merge -// \ No newline at end of file +// +exports[`no hack comments`] = { + value: `{}` +}; + +exports[`no knip errors`] = { + value: `{ + ".betterer.ts:194472954": [ + [0, 0, 0, "Unused files", "3789190540"] + ], + "packages/betterer/src/fs/version-control.worker.ts:2897508041": [ + [0, 0, 0, "Unused files", "3789190540"] + ], + "packages/docgen/package.json:2326583700": [ + [0, 0, 0, "Unused dependencies: tslib", "975605642"] + ], + "packages/extension/package.json:710109374": [ + [0, 0, 0, "Unused dependencies: lodash.debounce", "2305943112"], + [0, 0, 0, "Unused dependencies: vscode-languageclient", "2194305828"], + [0, 0, 0, "Unused dependencies: vscode-languageserver", "1576609144"], + [0, 0, 0, "Unused dependencies: vscode-languageserver-textdocument", "2013829255"], + [0, 0, 0, "Unused dependencies: vscode-uri", "2713846241"] + ], + "packages/fixture/package.json:4000629575": [ + [0, 0, 0, "Unused dependencies: ansi-regex", "2577412447"] + ], + "tools/docs-filter.ts:893765149": [ + [0, 0, 0, "Unused files", "3789190540"] + ], + "vitest.config.ts:1758587906": [ + [0, 0, 0, "Unlisted dependencies: @vitest/coverage-v8", "423406117"] + ], + "website/package.json:2119283197": [ + [0, 0, 0, "Unused dependencies: @algolia/client-search", "615397950"], + [0, 0, 0, "Unused dependencies: @docusaurus/core", "1623780400"], + [0, 0, 0, "Unused dependencies: @docusaurus/plugin-client-redirects", "1894418674"], + [0, 0, 0, "Unused dependencies: @docusaurus/preset-classic", "3564359911"], + [0, 0, 0, "Unused dependencies: @mdx-js/react", "3475488353"], + [0, 0, 0, "Unused dependencies: clsx", "1980870894"], + [0, 0, 0, "Unused dependencies: react", "964551243"], + [0, 0, 0, "Unused dependencies: react-dom", "2933334464"], + [0, 0, 0, "Unused dependencies: react-loadable", "4081059722"], + [0, 0, 0, "Unlisted binaries: docusaurus", "1661342944"] + ] + }` +}; diff --git a/.betterer.ts b/.betterer.ts index b66de7282..fd532433d 100644 --- a/.betterer.ts +++ b/.betterer.ts @@ -1,6 +1,17 @@ import { regexp } from '@betterer/regexp'; +import { knip } from '@betterer/knip'; export default { 'no hack comments': () => - regexp(/(\/\/\s*HACK)/i).include(['./packages/**/src/**/*.ts', './packages/**/src/**/*.tsx']) + regexp(/(\/\/\s*HACK)/i).include(['./packages/**/src/**/*.ts', './packages/**/src/**/*.tsx']), + 'no knip errors': () => + knip( + './knip.json', + {}, + { + production: true, + strict: true, + tags: ['-knipignore', '-internal'] + } + ).skip() }; diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 691d6030e..000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,72 +0,0 @@ -const path = require('path'); - -const BASE_EXTENDS = [ - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking', - 'plugin:prettier/recommended', - 'plugin:import/recommended', - 'plugin:import/typescript', - 'plugin:eslint-comments/recommended', - 'plugin:require-extensions/recommended' -]; - -const BASE_RULES = { - 'eol-last': ['error', 'always'], - '@typescript-eslint/return-await': ['error', 'always'], - '@typescript-eslint/no-use-before-define': ['error', { functions: false }], - '@typescript-eslint/member-ordering': 'error', - '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports', disallowTypeAnnotations: false }], - 'eslint-comments/require-description': ['error', { ignore: ['eslint-enable'] }], - 'import/no-unresolved': 'off' -}; - -const OVERRIDE_RULES = { - ...BASE_RULES, - 'no-console': 'error', - '@typescript-eslint/unbound-method': 'off' -}; - -module.exports = { - env: { - es2021: true, - node: true - }, - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2021, - project: path.resolve(__dirname, './tsconfig.eslint.json'), - sourceType: 'module' - }, - plugins: ['@typescript-eslint', 'require-extensions'], - rules: { - ...BASE_RULES - }, - overrides: [ - { - files: ['**/*.ts', '**/*.tsx'], - extends: BASE_EXTENDS, - rules: OVERRIDE_RULES - }, - { - files: ['test/**/*'], - env: { - jest: true - }, - plugins: ['jest'], - extends: [...BASE_EXTENDS, 'plugin:jest/recommended', 'plugin:jest/style'], - rules: OVERRIDE_RULES - }, - { - files: ['docs/**/*'], - env: { - browser: true - } - } - ], - settings: { - 'import/resolver': { - typescript: true - } - } -}; diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 0d88407c0..04256f81a 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -23,8 +23,8 @@ If applicable, add screenshots to help explain your problem. **Versions (please complete the following information):** - OS: [e.g. Windows, MacOS] -- Betterer Version [e.g. 4.*] -- Node Version [e.g. 14.*] +- Betterer Version [e.g. 6.*] +- Node Version [e.g. 20.*] **Additional context** Add any other context about the problem here. diff --git a/.github/workflows/build-extension.yaml b/.github/workflows/build-extension.yaml index 05c582c07..1a67df36b 100644 --- a/.github/workflows/build-extension.yaml +++ b/.github/workflows/build-extension.yaml @@ -12,22 +12,20 @@ jobs: strategy: matrix: - node-version: [16.x] + node-version: [18.x, 20.x, 22.x] operating-system: [macOS-latest] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Use node.js ${{ matrix['node-version'] }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: ${{ matrix['node-version'] }} - - name: Install dependencies - uses: sergioramos/yarn-actions/install@master - with: - frozen-lockfile: true - - name: Run build - run: yarn compile:packages && yarn build:extension - - name: Run extension test - uses: GabrielBB/xvfb-action@v1.0 - with: - run: yarn test:extension + # - name: Install dependencies + # run: npm install + # - name: Run build + # run: npm run compile:packages && npm run build:extension + # - name: Run extension test + # uses: GabrielBB/xvfb-action@v1.0 + # with: + # run: npm run test:extension diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 70cba75a8..7888f1343 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -12,18 +12,22 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [16.x, 18.x, 20.x, 22.x] operating-system: [windows-latest, macOS-latest, ubuntu-latest] steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 + - name: Use node.js ${{ matrix['node-version'] }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: ${{ matrix['node-version'] }} + - name: Install dependencies - uses: sergioramos/yarn-actions/install@master - with: - frozen-lockfile: true + run: npm install + - name: Run build - run: yarn build:ci + run: npm run build:ci + + - name: Coverage + run: cat ./reports/unit-coverage/coverage-summary.md >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6f52d4a4a..46c5a2614 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -24,15 +24,15 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/commitlint.yaml b/.github/workflows/commitlint.yaml new file mode 100644 index 000000000..4c49a0c04 --- /dev/null +++ b/.github/workflows/commitlint.yaml @@ -0,0 +1,26 @@ +name: Lint Commit Messages +on: [pull_request] + +permissions: + contents: read + pull-requests: read + +jobs: + commitlint: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Node + uses: actions/setup-node@v4 + with: + node-version: '20' + + - name: Install dependencies + run: npm install + + - name: Validate all commits from PR + run: npx commitlint --from ${{ github.event.pull_request.base.sha }} --to ${{ github.event.pull_request.head.sha }} --verbose diff --git a/.github/workflows/documentation.yml b/.github/workflows/documentation.yml index f7dde8ea4..17f52d97b 100644 --- a/.github/workflows/documentation.yml +++ b/.github/workflows/documentation.yml @@ -11,26 +11,27 @@ jobs: if: github.event_name != 'push' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: - node-version: '16.x' + node-version: '20.x' - name: Test Build run: | - yarn install --frozen-lockfile - yarn api - yarn docs + npm install + npm run api + npm run docs cd website - yarn install --frozen-lockfile - yarn build + npm install + npm run build gh-release: if: github.event_name != 'pull_request' runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - uses: actions/checkout@v4 + - name: Use node.js 20.x + uses: actions/setup-node@v4 with: - node-version: '16.x' + node-version: '20.x' - name: Add key to allow access to repository env: SSH_AUTH_SOCK: /tmp/ssh_agent.sock @@ -51,9 +52,9 @@ jobs: run: | git config --global user.email "actions@gihub.com" git config --global user.name "gh-actions" - yarn install --frozen-lockfile - yarn api - yarn docs + npm install + npm run api + npm run docs cd website - yarn install --frozen-lockfile - yarn deploy + npm install + npm run deploy diff --git a/.gitignore b/.gitignore index 6019f25c0..b2065b40c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,12 +3,10 @@ dist node_modules reports lerna-debug.log -yarn-error.log *.tsbuildinfo *.vsix goldens/models goldens/temp -packages/**/yarn.lock website/build website/docs/api/*.md website/.docusaurus @@ -16,3 +14,5 @@ packages/extension/.vscode-test *.patch betterer.*.log .betterer.cache +.betterer.*.mjs +.eslintcache diff --git a/.husky/commit-msg b/.husky/commit-msg index d71a03b9f..34eed8b28 100755 --- a/.husky/commit-msg +++ b/.husky/commit-msg @@ -1,4 +1 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -yarn commitlint --edit $1 +npx --no -- commitlint --edit $1 \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit index ace87be85..86977c0f0 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1,6 +1,6 @@ -#!/bin/sh -. "$(dirname "$0")/_/husky.sh" - -yarn -yarn build +npm install npx lint-staged +npm run test:api +npm run test:dependencies +npm run test:e2e +npm run betterer:precommit \ No newline at end of file diff --git a/.lintstagedrc b/.lintstagedrc deleted file mode 100644 index d958404e5..000000000 --- a/.lintstagedrc +++ /dev/null @@ -1,5 +0,0 @@ -{ - "*.ts,tsx": "yarn betterer:precommit", - "*.js": "yarn lint", - "*": "yarn format" - } \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index 1d38baf72..6e143c91b 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,34 +1,30 @@ .DS_Store +.betterer.cache +.betterer.results +.husky +.gitattributes +.gitignore +.lintstagedrc +.npmrc +.prettierignore +.vscode-test +CHANGELOG.md dist fixtures goldens node_modules reports lerna-debug.log -yarn-error.log -tsconfig.tsbuildinfo -.vscode-test -*.vsix -**/*.snap test/__snapshots__/** -**/yarn.lock -**/*.gif -**/*.ico -**/*.png -.husky -.betterer.results -.gitattributes -.gitignore -.npmrc -.prettierignore -.yarnrc -.lintstagedrc +tsconfig.tsbuildinfo website/build website/.docusaurus -*.patch -CHANGELOG.md -betterer.log -.betterer.cache website/static/.nojekyll website/static/videos/start.mp4 website/static/videos/watch.mp4 +*.patch +*.vsix +**/*.snap +**/*.gif +**/*.ico +**/*.png diff --git a/.prettierrc.js b/.prettierrc.js index 765d8c6ac..28215c341 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,4 @@ -module.exports = { +export default { singleQuote: true, printWidth: 120, endOfLine: 'lf', diff --git a/.vscode/launch.json b/.vscode/launch.json index 1a6cf7b30..917a489eb 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -17,7 +17,6 @@ "name": "Attach to Server", "type": "node", "request": "attach", - "protocol": "inspector", "address": "localhost", "port": 6060, "outFiles": ["${workspaceRoot}/packages/extension/dist/server/**/*.js"] @@ -36,6 +35,17 @@ ], "preLaunchTask": "Make Fixtures Directory", "outFiles": ["${workspaceRoot}/packages/extension/dist/test/**/*.js"] + }, + { + "type": "node", + "request": "launch", + "name": "Debug Current Test File", + "autoAttachChildProcesses": true, + "skipFiles": ["/**", "**/node_modules/**"], + "program": "${workspaceRoot}/node_modules/vitest/vitest.mjs", + "args": ["run", "${relativeFile}"], + "smartStep": true, + "console": "integratedTerminal" } ], "compounds": [ diff --git a/.vscode/settings.json b/.vscode/settings.json index 2fdfa3246..5cffdcfc1 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,28 +1,52 @@ { "typescript.tsdk": "node_modules/typescript/lib", - "betterer.tsconfigPath": "./tsconfig.json", "cSpell.words": [ "automerge", "bettere", "betterertest", "borks", "bufferutil", + "Cacheable", + "callsite", + "clsx", + "Comlink", "commitlint", "crlfs", + "customise", "Deserialiser", "docgen", + "esque", "GOLDENS", "hasher", + "initialisation", "initialise", "initialised", "Initialising", + "internationalisation", + "INTERP", + "Knip", + "knipignore", + "lcov", "Lifecycles", "loglevel", + "monocart", "ngcc", + "outfile", + "pluralisation", "reparse", + "serialisable", + "serialising", + "stabilise", + "stylelint", "stylelintrc", + "summarised", + "thanos", + "Treffenstädt", "tsbuildinfo", - "tstemplate" + "tstemplate", + "typeof", + "ungap", + "Vitest" ], "javascript.preferences.importModuleSpecifierEnding": "js", "typescript.preferences.importModuleSpecifierEnding": "js" diff --git a/.yarnrc b/.yarnrc deleted file mode 100644 index a1f15f515..000000000 --- a/.yarnrc +++ /dev/null @@ -1,2 +0,0 @@ -registry "https://registry.npmjs.org/" -network-timeout 600000 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f8173686b..9602a805d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,48 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/monorepo + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) +* **betterer 🐛:** handle -1 column fixes [#1202](https://github.com/phenomnomnominal/betterer/issues/1202) ([#1214](https://github.com/phenomnomnominal/betterer/issues/1214)) ([d26c395](https://github.com/phenomnomnominal/betterer/commit/d26c3958219a87168d21afbca53656fb0082d109)) +* **betterer 🐛:** handles more paths in results file, and some TypeScript error message fun ([#1226](https://github.com/phenomnomnominal/betterer/issues/1226)) ([ae555e6](https://github.com/phenomnomnominal/betterer/commit/ae555e60eb20b4d3f8ca7625d34e0eda210da011)) +* **betterer 🐛:** improve docs, handle include and exclude, add tests, simplify ([#1219](https://github.com/phenomnomnominal/betterer/issues/1219)) ([285d432](https://github.com/phenomnomnominal/betterer/commit/285d4323896ac00dbf5cf44f94cba961d0605f37)) +* **betterer 🐛:** just use the string as the memoize key ([#1225](https://github.com/phenomnomnominal/betterer/issues/1225)) ([d897782](https://github.com/phenomnomnominal/betterer/commit/d8977824c2c66190d233dbf773aaf6294c3389d4)) +* **betterer 🐛:** remove printed from api ([#1233](https://github.com/phenomnomnominal/betterer/issues/1233)) ([e452b5e](https://github.com/phenomnomnominal/betterer/commit/e452b5e32358af2fc1c9f42684161f4990f17f9f)) + + +* feat(betterer ✨)!: allow cache in CI mode (#1218) ([8cf8207](https://github.com/phenomnomnominal/betterer/commit/8cf8207ff3e23c7fd439b067e2c2981c0e4fae44)), closes [#1218](https://github.com/phenomnomnominal/betterer/issues/1218) [#1164](https://github.com/phenomnomnominal/betterer/issues/1164) + + +### Features + +* **beterer ✨:** make logo optional ([#1137](https://github.com/phenomnomnominal/betterer/issues/1137)) ([b3d9cac](https://github.com/phenomnomnominal/betterer/commit/b3d9cac3633aa2e6365f196d06e4acd5937d4dbe)) +* **betterer ✨:** add more details to file issues ([#1211](https://github.com/phenomnomnominal/betterer/issues/1211)) ([5a53e45](https://github.com/phenomnomnominal/betterer/commit/5a53e45b4d51e643458c21bd911b5500e698a1a8)) +* **betterer ✨:** improve CLI output when files have changed but test results have not ([#1185](https://github.com/phenomnomnominal/betterer/issues/1185)) ([aeb46f8](https://github.com/phenomnomnominal/betterer/commit/aeb46f8f96e33b2defed0a178b10a2eaaab3c842)) +* **betterer ✨:** no more git hashes for cache ([#1228](https://github.com/phenomnomnominal/betterer/issues/1228)) ([1b117d7](https://github.com/phenomnomnominal/betterer/commit/1b117d7fb3326defe5ae4dc7d16074fc2c42976e)) +* **betterer ✨:** no more weird completed then new tests ([#1213](https://github.com/phenomnomnominal/betterer/issues/1213)) ([da704f2](https://github.com/phenomnomnominal/betterer/commit/da704f2e91b3b26a7f1cd6953a21bd623b3cb9c8)) +* **betterer ✨:** specify different cache strategies ([#1232](https://github.com/phenomnomnominal/betterer/issues/1232)) ([df77035](https://github.com/phenomnomnominal/betterer/commit/df7703537910c320c0444e26582e8436947ff00d)) + + +### BREAKING CHANGES + +* ci: true no longer disables the cache + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) diff --git a/api-documenter.json b/api-documenter.json index fc13b9918..71c633a24 100644 --- a/api-documenter.json +++ b/api-documenter.json @@ -2,5 +2,10 @@ "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-documenter.schema.json", "outputTarget": "markdown", - "plugins": [{ "packageName": "doc-plugin-betterer", "enabledFeatureNames": ["betterer-docgen"] }] + "plugins": [ + { + "packageName": "doc-plugin-betterer", + "enabledFeatureNames": ["betterer-docgen"] + } + ] } diff --git a/commitlint.config.js b/commitlint.config.js index 64bcba7a1..19cea68a5 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1,4 +1,4 @@ -module.exports = { +export default { extends: ['@commitlint/config-conventional'], plugins: ['@phenomnomnominal'], rules: { diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 000000000..8ee658f0d --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,83 @@ +import { FlatCompat } from '@eslint/eslintrc'; +import jsLint from '@eslint/js'; +import comments from '@eslint-community/eslint-plugin-eslint-comments/configs'; +import prettier from 'eslint-config-prettier'; +import globals from 'globals'; +import tsLint from 'typescript-eslint'; + +import 'core-js/actual/structured-clone.js'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const dirname = path.dirname(fileURLToPath(import.meta.url)); +const compat = new FlatCompat({ + baseDirectory: dirname +}); + +export default tsLint.config( + { files: ['packages/**/src/**/*.{ts,tsx}', 'test/**/*.{ts,tsx}', '*.{ts}'] }, + { + ignores: ['**/node_modules/**', '**/dist/**', 'fixtures/**', 'reports/**', 'website/**', '**/.vscode-test/**'] + }, + + // TODO: Fix when extension is upgraded: + { + ignores: [ + '**/jest.config.js', + '**/webpack.server.config.js', + '**/webpack.client.config.js', + '**/extension/test/*.e2e-spec.ts' + ] + }, + + { + languageOptions: { + globals: globals.browser, + parserOptions: { + project: './tsconfig.eslint.json', + tsconfigRootDir: dirname + } + } + }, + + comments.recommended, + jsLint.configs.recommended, + + { + rules: { + 'no-console': 'error', + '@eslint-community/eslint-comments/require-description': ['error', { ignore: ['eslint-enable'] }] + } + }, + + ...compat.plugins('require-extensions'), + ...compat.extends('plugin:require-extensions/recommended'), + + // TODO: Fix when import rules support ESLint 9: + // ...compat.extends('plugin:import/recommended'), + // ...compat.extends('plugin:import/typescript'), + + ...tsLint.configs.strictTypeChecked, + ...tsLint.configs.stylisticTypeChecked, + { + rules: { + '@typescript-eslint/return-await': ['error', 'always'], + '@typescript-eslint/no-use-before-define': ['error', { functions: false }], + '@typescript-eslint/member-ordering': 'error', + '@typescript-eslint/consistent-type-imports': [ + 'error', + { prefer: 'type-imports', disallowTypeAnnotations: false } + ], + '@typescript-eslint/array-type': ['error', { default: 'generic', readonly: 'generic' }], + '@typescript-eslint/no-invalid-void-type': 'off' + } + }, + + { + files: ['*.js'], + ...tsLint.configs.disableTypeChecked + }, + + prettier +); diff --git a/goldens/api/betterer.api.md b/goldens/api/betterer.api.md index 39a1a70ec..6fa3d3a20 100644 --- a/goldens/api/betterer.api.md +++ b/goldens/api/betterer.api.md @@ -6,45 +6,40 @@ import type { BettererConstraintResult } from '@betterer/constraints'; import type { BettererError } from '@betterer/errors'; -import type { BettererLogs } from '@betterer/logger'; +import type { BettererLogger } from '@betterer/logger'; -// Warning: (ae-missing-release-tag) "betterer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public -export function betterer(options?: BettererOptionsStart): Promise; +export const betterer: { + (options?: BettererOptions): Promise; + merge: typeof merge; + results: typeof results; + runner: typeof runner; + watch: typeof watch; +}; + +// @public +export type BettererAPI = typeof betterer; -// @public (undocumented) -export namespace betterer { - var // (undocumented) - merge: merge; - var // (undocumented) - results: results; - var // (undocumented) - runner: runner; - var // (undocumented) - watch: watch; +// @public +export enum BettererCacheStrategy { + FilePath = "FilePath", + FilePaths = "FilePaths" } -// Warning: (ae-incompatible-release-tags) The symbol "BettererConfig" is marked as @public, but its signature references "BettererConfigBase" which is marked as @internal -// Warning: (ae-incompatible-release-tags) The symbol "BettererConfig" is marked as @public, but its signature references "BettererConfigStart" which is marked as @internal -// Warning: (ae-incompatible-release-tags) The symbol "BettererConfig" is marked as @public, but its signature references "BettererConfigWatch" which is marked as @internal -// // @public -export interface BettererConfig extends BettererConfigBase, BettererConfigStart, BettererConfigWatch { +export interface BettererConfig extends BettererConfigFS, BettererConfigReporter, BettererConfigContext { } -// @internal -export interface BettererConfigBase { - cache: boolean; - cachePath: string; - configPaths: BettererConfigPaths; - cwd: string; +// @public +export interface BettererConfigContext { + ci: boolean; + excludes: BettererConfigExcludes; filters: BettererConfigFilters; - logo: boolean; - reporter: BettererReporter; - resultsPath: string; - tsconfigPath: string | null; - versionControlPath: string; + includes: BettererConfigIncludes; + precommit: boolean; + strict: boolean; + strictDeadlines: boolean; + update: boolean; workers: number; } @@ -54,6 +49,22 @@ export type BettererConfigExcludes = ReadonlyArray; // @public export type BettererConfigFilters = ReadonlyArray; +// @public +export interface BettererConfigFS { + basePath: string; + cache: boolean; + cachePath: string; + configPaths: BettererConfigPaths; + cwd: string; + ignores: BettererConfigIgnores; + repoPath: string; + resultsPath: string; + // @deprecated + tsconfigPath: string | null; + versionControlPath: string | null; + watch: boolean; +} + // @public export type BettererConfigIgnores = ReadonlyArray; @@ -61,29 +72,18 @@ export type BettererConfigIgnores = ReadonlyArray; export type BettererConfigIncludes = ReadonlyArray; // @public -export type BettererConfigPaths = ReadonlyArray; +export type BettererConfigPaths = readonly [string, ...Array]; -// @internal -export interface BettererConfigStart { - ci: boolean; - excludes: BettererConfigExcludes; - includes: BettererConfigIncludes; - precommit: boolean; - strict: boolean; - update: boolean; -} - -// @internal -export interface BettererConfigWatch { - ignores: BettererConfigIgnores; - watch: boolean; +// @public +export interface BettererConfigReporter { + logo: boolean; } // @public export interface BettererContext { readonly config: BettererConfig; options(optionsOverride: BettererOptionsOverride): Promise; - stop(): Promise; + stop(): Promise; } // @public @@ -110,11 +110,10 @@ export type BettererDeserialise = (serialised: // @public export interface BettererDiff { diff: DiffType; - logs: BettererLogs; } // @public -export type BettererDiffer = (expected: DeserialisedType, result: DeserialisedType) => BettererDiff; +export type BettererDiffer = (this: BettererRun, expected: DeserialisedType, result: DeserialisedType) => MaybeAsync>; // @public export interface BettererFile extends BettererFileBase { @@ -128,7 +127,7 @@ export interface BettererFileBase { readonly absolutePath: string; readonly hash: string; readonly issues: BettererFileIssues; - readonly key: string; + readonly key: BettererFileTestResultKey; } // @public @@ -138,8 +137,6 @@ export interface BettererFileDiff { new?: BettererFileIssuesSerialised; } -// Warning: (ae-unresolved-link) The @link reference could not be resolved: No member was found with name "cwd" -// // @public export type BettererFileGlobs = ReadonlyArray>; @@ -168,41 +165,29 @@ export type BettererFilePath = string; export type BettererFilePaths = ReadonlyArray; // @public -export type BettererFilePatterns = ReadonlyArray>; +export type BettererFilePatterns = ReadonlyArray>; // @public export interface BettererFileResolver { readonly baseDirectory: string; + included(filePaths: BettererFilePaths): BettererFilePaths; + relative(to: string): string; resolve(...pathSegments: Array): string; + tmp(filePath?: BettererFilePath): Promise; validate(filePaths: BettererFilePaths): Promise; } // @public export type BettererFilesDiff = Record; -// Warning: (ae-forgotten-export) The symbol "BettererFileTestBase" needs to be exported by the entry point index.d.ts -// // @public -export class BettererFileTest implements BettererFileTestBase { +export class BettererFileTest extends BettererResolverTest { constructor(fileTest: BettererFileTestFunction); - // Warning: (ae-forgotten-export) The symbol "BettererFileTestConfig" needs to be exported by the entry point index.d.ts - readonly config: BettererFileTestConfig; - constraint(constraintOverride: BettererTestConstraint): this; - deadline(deadlineOverride: BettererTestDeadline): this; - exclude(...excludePatterns: BettererFilePatterns): this; - goal(goalOverride: BettererTestGoal): this; - include(...includePatterns: BettererFileGlobs): this; - get isOnly(): boolean; - get isSkipped(): boolean; - only(): this; - skip(): this; } // @public export type BettererFileTestDiff = BettererDiff; -// Warning: (ae-forgotten-export) The symbol "MaybeAsync" needs to be exported by the entry point index.d.ts -// // @public export type BettererFileTestFunction = (filePaths: BettererFilePaths, fileTestResult: BettererFileTestResult, resolver: BettererFileResolver) => MaybeAsync; @@ -213,7 +198,10 @@ export interface BettererFileTestResult { } // @public -export type BettererFileTestResultSerialised = Record; +export type BettererFileTestResultKey = `${string}:${string}`; + +// @public +export type BettererFileTestResultSerialised = Record; // @public export interface BettererFileTestResultSummary { @@ -225,19 +213,21 @@ export interface BettererFileTestResultSummary { // @public export type BettererFileTestResultSummaryDetails = Record; -// @internal -export interface BettererOptionsBase { - cache?: boolean; - cachePath?: string; - configPaths?: BettererOptionsPaths; - cwd?: string; +// @public +export type BettererOptions = BettererOptionsContext & BettererOptionsFS & BettererOptionsMode & BettererOptionsReporter; + +// @public +export type BettererOptionsContext = BettererOptionsMode & { + excludes?: BettererOptionsExcludes; filters?: BettererOptionsFilters; - logo?: boolean; - reporters?: BettererOptionsReporters; - resultsPath?: string; - silent?: boolean; - tsconfigPath?: string; + includes?: BettererOptionsIncludes; + strictDeadlines?: boolean; workers?: number | boolean; +}; + +// @public +export interface BettererOptionsContextOverride { + filters?: BettererOptionsFilters; } // @public @@ -247,63 +237,36 @@ export type BettererOptionsExcludes = Array | string | RegExp; export type BettererOptionsFilters = Array | string | RegExp; // @public -export type BettererOptionsIgnores = Array; - -// @public -export type BettererOptionsIncludes = Array | string; - -// @public -export interface BettererOptionsMerge { - contents?: Array; +export interface BettererOptionsFS { + basePath?: string; + cache?: boolean; + cachePath?: string; + configPaths?: BettererOptionsPaths; cwd?: string; + repoPath?: string; resultsPath?: string; + // @deprecated + tsconfigPath?: string; } // @public -export interface BettererOptionsOverride { - filters?: BettererOptionsFilters; - ignores?: BettererOptionsIgnores; - reporters?: BettererOptionsReporters; -} - -// @public -export type BettererOptionsPaths = Array | string; +export type BettererOptionsIgnores = Array; // @public -export type BettererOptionsReporters = Array; +export type BettererOptionsIncludes = Array | string; // @public -export interface BettererOptionsResults { - configPaths?: BettererOptionsPaths; +export interface BettererOptionsMerge { + contents?: Array; cwd?: string; - excludes?: BettererOptionsExcludes; - filters?: BettererOptionsFilters; - includes?: BettererOptionsIncludes; resultsPath?: string; } -// Warning: (ae-incompatible-release-tags) The symbol "BettererOptionsRunner" is marked as @public, but its signature references "BettererOptionsBase" which is marked as @internal -// // @public -export type BettererOptionsRunner = BettererOptionsBase; +export type BettererOptionsMode = BettererOptionsModeCI | BettererOptionsModeDefault | BettererOptionsModePrecommit | BettererOptionsModeStrict | BettererOptionsModeUpdate; -// Warning: (ae-incompatible-release-tags) The symbol "BettererOptionsStart" is marked as @public, but its signature references "BettererOptionsStartCI" which is marked as @internal -// Warning: (ae-incompatible-release-tags) The symbol "BettererOptionsStart" is marked as @public, but its signature references "BettererOptionsStartDefault" which is marked as @internal -// Warning: (ae-incompatible-release-tags) The symbol "BettererOptionsStart" is marked as @public, but its signature references "BettererOptionsStartPrecommit" which is marked as @internal -// Warning: (ae-incompatible-release-tags) The symbol "BettererOptionsStart" is marked as @public, but its signature references "BettererOptionsStartStrict" which is marked as @internal -// Warning: (ae-incompatible-release-tags) The symbol "BettererOptionsStart" is marked as @public, but its signature references "BettererOptionsStartUpdate" which is marked as @internal -// // @public -export type BettererOptionsStart = BettererOptionsStartCI | BettererOptionsStartDefault | BettererOptionsStartPrecommit | BettererOptionsStartStrict | BettererOptionsStartUpdate; - -// @internal -export interface BettererOptionsStartBase extends BettererOptionsBase { - excludes?: BettererOptionsExcludes; - includes?: BettererOptionsIncludes; -} - -// @internal -export interface BettererOptionsStartCI extends BettererOptionsStartBase { +export interface BettererOptionsModeCI { // (undocumented) ci?: true; // (undocumented) @@ -312,12 +275,10 @@ export interface BettererOptionsStartCI extends BettererOptionsStartBase { strict?: true; // (undocumented) update?: false; - // (undocumented) - watch?: false; } -// @internal -export interface BettererOptionsStartDefault extends BettererOptionsStartBase { +// @public +export interface BettererOptionsModeDefault { // (undocumented) ci?: false; // (undocumented) @@ -326,26 +287,22 @@ export interface BettererOptionsStartDefault extends BettererOptionsStartBase { strict?: false; // (undocumented) update?: false; - // (undocumented) - watch?: false; } -// @internal -export interface BettererOptionsStartPrecommit extends BettererOptionsStartBase { +// @public +export interface BettererOptionsModePrecommit { // (undocumented) ci?: false; // (undocumented) precommit?: true; // (undocumented) - strict?: boolean; + strict?: true; // (undocumented) update?: false; - // (undocumented) - watch?: false; } -// @internal -export interface BettererOptionsStartStrict extends BettererOptionsStartBase { +// @public +export interface BettererOptionsModeStrict { // (undocumented) ci?: false; // (undocumented) @@ -354,12 +311,10 @@ export interface BettererOptionsStartStrict extends BettererOptionsStartBase { strict?: true; // (undocumented) update?: false; - // (undocumented) - watch?: false; } -// @internal -export interface BettererOptionsStartUpdate extends BettererOptionsStartBase { +// @public +export interface BettererOptionsModeUpdate { // (undocumented) ci?: false; // (undocumented) @@ -368,21 +323,67 @@ export interface BettererOptionsStartUpdate extends BettererOptionsStartBase { strict?: false; // (undocumented) update?: true; +} + +// @public +export interface BettererOptionsModeWatch { // (undocumented) - watch?: false; + ci?: false; + // (undocumented) + precommit?: false; + // (undocumented) + strict?: false; + // (undocumented) + update?: false; +} + +// @public +export interface BettererOptionsOverride extends BettererOptionsContextOverride, BettererOptionsReporterOverride, BettererOptionsWatcherOverride { +} + +// @public +export type BettererOptionsPaths = Array | string; + +// @public +export interface BettererOptionsReporter { + logo?: boolean; + reporters?: BettererOptionsReporters; + silent?: boolean; } // @public -export interface BettererOptionsWatch extends BettererOptionsRunner { +export interface BettererOptionsReporterOverride { + reporters?: BettererOptionsReporters; +} + +// @public +export type BettererOptionsReporters = Array; + +// @public +export type BettererOptionsResults = Pick & Pick; + +// @public +export type BettererOptionsRunner = BettererOptions; + +// @public +export type BettererOptionsWatch = BettererOptionsContext & BettererOptionsFS & BettererOptionsModeWatch & BettererOptionsReporter & BettererOptionsWatcher; + +// @public +export interface BettererOptionsWatcher { ignores?: BettererOptionsIgnores; watch?: true; } +// @public +export interface BettererOptionsWatcherOverride { + ignores?: BettererOptionsIgnores; +} + // @public export type BettererPrinter = (serialised: SerialisedType) => MaybeAsync; // @public -export type BettererProgress = (baseline: DeserialisedType | null, result: DeserialisedType | null) => MaybeAsync; +export type BettererProgress = (this: BettererRun, baseline: DeserialisedType | null, result: DeserialisedType | null) => MaybeAsync; // @public export interface BettererReporter { @@ -392,15 +393,24 @@ export interface BettererReporter { contextStart?(context: BettererContext, lifecycle: Promise): Promise | void; runEnd?(runSummary: BettererRunSummary): Promise | void; runError?(run: BettererRun, error: BettererError): Promise | void; + runLogger?: BettererRunLogger; runStart?(run: BettererRun, lifecycle: Promise): Promise | void; suiteEnd?(suiteSummary: BettererSuiteSummary): Promise | void; suiteError?(suite: BettererSuite, error: BettererError): Promise | void; suiteStart?(suite: BettererSuite, lifecycle: Promise): Promise | void; } +// @public +export class BettererResolverTest extends BettererTest { + constructor(options: BettererTestOptions); + cache(strategy?: BettererCacheStrategy): this; + exclude(...excludePatterns: BettererFilePatterns): this; + include(...includePatterns: BettererFileGlobs): this; + readonly resolver: BettererFileResolver; +} + // @public export interface BettererResult { - // (undocumented) value: unknown; } @@ -421,16 +431,26 @@ export interface BettererRun { readonly expected: BettererResult | null; readonly filePaths: BettererFilePaths | null; readonly isNew: boolean; + readonly isObsolete: boolean; + readonly isRemoved: boolean; readonly isSkipped: boolean; + readonly logger: BettererLogger; readonly name: string; } // @public -export interface BettererRunner { - options(optionsOverride: BettererOptionsOverride): void; +export type BettererRunLogFunction = (run: BettererRun, ...args: Parameters) => ReturnType; + +// @public +export type BettererRunLogger = { + [Log in keyof BettererLogger]: BettererLogger[Log] extends Func ? BettererRunLogFunction : never; +}; + +// @public +export interface BettererRunner extends BettererContext { queue(filePaths?: string | BettererFilePaths): Promise; - stop(): Promise; - stop(force: true): Promise; + stop(): Promise; + stop(force?: true): Promise; } // @public @@ -451,27 +471,21 @@ export interface BettererRunSummary extends BettererRun { readonly isSame: boolean; readonly isUpdated: boolean; readonly isWorse: boolean; - // (undocumented) - readonly printed: string | null; readonly result: BettererResult | null; readonly timestamp: number; } // @public -export type BettererSerialise = (result: DeserialisedType, resultsPath: string) => SerialisedType; +export type BettererSerialise = (this: BettererRun, result: DeserialisedType, resultsPath: string) => SerialisedType; // @public export interface BettererSerialiser { - // (undocumented) deserialise: BettererDeserialise; - // (undocumented) serialise: BettererSerialise; } // @public export interface BettererSuite { - // Warning: (ae-unresolved-link) The @link reference could not be resolved: No member was found with name "includes" - // Warning: (ae-unresolved-link) The @link reference could not be resolved: No member was found with name "excludes" readonly filePaths: BettererFilePaths; readonly runs: BettererRuns; } @@ -484,10 +498,13 @@ export interface BettererSuiteSummary extends BettererSuite { readonly better: BettererRunSummaries; readonly changed: BettererTestNames; readonly completed: BettererRunSummaries; + readonly error: Error | null; readonly expired: BettererRunSummaries; readonly failed: BettererRunSummaries; readonly new: BettererRunSummaries; + readonly obsolete: BettererRunSummaries; readonly ran: BettererRunSummaries; + readonly removed: BettererRunSummaries; readonly runSummaries: BettererRunSummaries; readonly same: BettererRunSummaries; readonly skipped: BettererRunSummaries; @@ -495,12 +512,10 @@ export interface BettererSuiteSummary extends BettererSuite { readonly worse: BettererRunSummaries; } -// Warning: (ae-incompatible-release-tags) The symbol "BettererTest" is marked as @public, but its signature references "BettererTestBase" which is marked as @internal -// // @public -export class BettererTest implements BettererTestBase { +export class BettererTest { constructor(options: BettererTestOptions); - readonly config: BettererTestConfig; + get config(): BettererTestConfig; constraint(constraintOverride: BettererTestConstraint): this; deadline(deadlineOverride: BettererTestDeadline): this; goal(goalOverride: BettererTestGoal): this; @@ -510,81 +525,42 @@ export class BettererTest { - // (undocumented) - config: BettererTestConfig; - // (undocumented) - constraint(constraintOverride: BettererTestConstraint): this; - // (undocumented) - goal(goalOverride: BettererTestGoal): this; - // (undocumented) - isOnly: boolean; - // (undocumented) - isSkipped: boolean; - // (undocumented) - only(): this; - // (undocumented) - skip(): this; -} - // @public export interface BettererTestConfig { - // (undocumented) - configPath: string; - // (undocumented) - constraint: BettererTestConstraint; - // (undocumented) - deadline: number; - // (undocumented) - differ: BettererDiffer; - // (undocumented) - goal: BettererTestGoal; - // (undocumented) - printer: BettererPrinter; - // (undocumented) - progress: BettererProgress; - // (undocumented) - serialiser: BettererSerialiser; - // (undocumented) - test: BettererTestFunction; + readonly constraint: BettererTestConstraint; + readonly deadline: number; + readonly differ: BettererDiffer; + readonly goal: BettererTestGoal; + readonly printer: BettererPrinter; + readonly progress: BettererProgress; + readonly serialiser: BettererSerialiser; + readonly test: BettererTestFunction; } // @public -export type BettererTestConstraint = (result: DeserialisedType, expected: DeserialisedType) => MaybeAsync; +export type BettererTestConstraint = (this: BettererRun, result: DeserialisedType, expected: DeserialisedType) => MaybeAsync; // @public export type BettererTestDeadline = Date | string; // @public -export type BettererTestFunction = (run: BettererRun) => MaybeAsync; +export type BettererTestFunction = (this: BettererRun, run: BettererRun) => MaybeAsync; // @public -export type BettererTestGoal = (result: DeserialisedType) => MaybeAsync; +export type BettererTestGoal = (this: BettererRun, result: DeserialisedType) => MaybeAsync; // @public export type BettererTestNames = ReadonlyArray; // @public -export type BettererTestOptions = BettererTestOptionsBasic | BettererTestOptionsComplex; - -// @public -export interface BettererTestOptionsBasic { - constraint: BettererTestConstraint; - deadline?: BettererTestDeadline; - goal?: number | BettererTestGoal; - test: BettererTestFunction; -} - -// @public -export interface BettererTestOptionsComplex { +export interface BettererTestOptions { constraint: BettererTestConstraint; deadline?: BettererTestDeadline; - differ: BettererDiffer; + differ?: BettererDiffer; goal: DeserialisedType | BettererTestGoal; printer?: BettererPrinter; progress?: BettererProgress; - serialiser: BettererSerialiser; + serialiser?: BettererSerialiser; test: BettererTestFunction; } @@ -598,6 +574,12 @@ export interface BettererTestResultSummary { // @public export type BettererTestResultSummaryDetails = string; +// @public +export type Func = (...args: Array) => any; + +// @public +export type MaybeAsync = T | Promise; + // @public export function merge(options?: BettererOptionsMerge): Promise; diff --git a/goldens/api/cli.api.md b/goldens/api/cli.api.md index 944246a55..2a2760ce0 100644 --- a/goldens/api/cli.api.md +++ b/goldens/api/cli.api.md @@ -9,17 +9,12 @@ export type BettererCLIArguments = Array; // @internal export interface BettererPackageJSON { - // (undocumented) - devDependencies: Record; - // (undocumented) - scripts: Record & { - betterer: string; - }; - // (undocumented) + devDependencies?: Record; + scripts?: Record; version: string; } // @internal -export function cli__(cwd: string, argv: BettererCLIArguments, isCI?: boolean): Promise; +export function cliΔ(cwd: string, argv: BettererCLIArguments, isCI?: boolean, isTest?: boolean): Promise; ``` diff --git a/goldens/api/coverage.api.md b/goldens/api/coverage.api.md index 585df6f9b..1b03b1bf3 100644 --- a/goldens/api/coverage.api.md +++ b/goldens/api/coverage.api.md @@ -4,10 +4,7 @@ ```ts -import type { BettererFileGlobs } from '@betterer/betterer'; -import type { BettererFilePatterns } from '@betterer/betterer'; -import type { BettererRun } from '@betterer/betterer'; -import { BettererTest } from '@betterer/betterer'; +import type { BettererResolverTest } from '@betterer/betterer'; // @public export type BettererCoverageDiff = BettererCoverageIssues; @@ -16,19 +13,10 @@ export type BettererCoverageDiff = BettererCoverageIssues; export type BettererCoverageIssue = Record; // @public -export type BettererCoverageIssues = { - [filePath: string]: BettererCoverageIssue; -}; +export type BettererCoverageIssues = Record; // @public -export class BettererCoverageTest extends BettererTest { - // Warning: (ae-forgotten-export) The symbol "BettererCoverageTestFunction" needs to be exported by the entry point index.d.ts - // - // @internal - constructor(test: BettererCoverageTestFunction, coverageSummaryPath?: string); - exclude(...excludePatterns: BettererFilePatterns): this; - include(...includePatterns: BettererFileGlobs): this; -} +export type BettererCoverageTest = BettererResolverTest; // @public export type BettererCoverageTypes = 'lines' | 'statements' | 'functions' | 'branches'; diff --git a/goldens/api/errors.api.md b/goldens/api/errors.api.md index 9b1ad4a88..370d887be 100644 --- a/goldens/api/errors.api.md +++ b/goldens/api/errors.api.md @@ -17,7 +17,10 @@ export type BettererErrorDetail = string | Error | BettererError; // @public export type BettererErrorDetails = ReadonlyArray; -// @public -export function isBettererError(err: unknown): err is BettererError; +// @internal +export function invariantΔ(check: unknown, message: `${string}!`, ...values: Array): asserts check; + +// @internal +export function isBettererErrorΔ(err: unknown): err is BettererError; ``` diff --git a/goldens/api/eslint.api.md b/goldens/api/eslint.api.md index 7bbe8e99c..472843dd8 100644 --- a/goldens/api/eslint.api.md +++ b/goldens/api/eslint.api.md @@ -8,9 +8,9 @@ import { BettererFileTest } from '@betterer/betterer'; import type { Linter } from 'eslint'; // @public -export type BettererESLintRulesConfig = Record; +export type BettererESLintConfig = Array; // @public -export function eslint(rules: BettererESLintRulesConfig): BettererFileTest; +export function eslint(...overrideConfig: BettererESLintConfig): BettererFileTest; ``` diff --git a/goldens/api/knip.api.md b/goldens/api/knip.api.md new file mode 100644 index 000000000..eb3f67099 --- /dev/null +++ b/goldens/api/knip.api.md @@ -0,0 +1,60 @@ +## API Report File for "@betterer/knip" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { BettererFileTest } from '@betterer/betterer'; +import type { ConfigurationValidator } from 'knip/dist/ConfigurationValidator.js'; +import type { z } from 'zod'; + +// @beta +export function knip(configFilePath: string, extraConfiguration?: KnipConfig, extraCliOptions?: KnipCLIOptions): BettererFileTest; + +// @beta +export type KnipCLIOptions = Partial<{ + cache: boolean; + cacheLocation: string; + config: string; + debug: boolean; + dependencies: boolean; + directory: string; + exclude: string; + exports: boolean; + tags: Array; + experimentalTags: Array; + files: boolean; + fix: boolean; + fixType: Array; + allowRemoveFiles: boolean; + help: boolean; + ignoreInternal: boolean; + include: Array; + includeLibs: boolean; + includeEntryExports: boolean; + isolateWorkspaces: boolean; + maxIssues: string; + noConfigHints: boolean; + noExitCode: boolean; + noGitignore: boolean; + noProgress: boolean; + performance: boolean; + production: boolean; + preprocessor: Array; + preprocessorOptions: string; + reporter: Array; + reporterOptions: string; + strict: boolean; + trace: boolean; + traceExport: string; + traceFile: string; + tsConfig: string; + version: boolean; + watch: boolean; + workspace: string; +}>; + +// @beta +export type KnipConfig = z.infer; + +``` diff --git a/goldens/api/logger.api.md b/goldens/api/logger.api.md index 543f3f71a..fc3383764 100644 --- a/goldens/api/logger.api.md +++ b/goldens/api/logger.api.md @@ -18,7 +18,7 @@ export interface BettererLog { } // @public -export type BettererLogCode = (codeInfo: BettererLoggerCodeInfo) => Promise; +export type BettererLogCode = (codeInfo: BettererLoggerCodeInfo) => MaybeAsync; // @public export interface BettererLogger { @@ -48,21 +48,21 @@ export type BettererLoggerMessage = string; export type BettererLoggerMessages = Array; // @public -export type BettererLogMessage = (...messages: BettererLoggerMessages) => Promise; +export type BettererLogMessage = (...messages: BettererLoggerMessages) => MaybeAsync; // @internal export type BettererLogs = Array; // @internal -export function code__(codeInfo: BettererLoggerCodeInfo): string; +export function codeΔ(codeInfo: BettererLoggerCodeInfo): string; // @internal -export function diff__(a: T, b: T, diffOptions: DiffOptions): string | null; +export function diffStringsΔ(a: string, b: string, diffOptions: DiffOptions): string; // @internal -export function diffStrings__(a: string, b: string, diffOptions: DiffOptions): string; +export function diffΔ(a: T, b: T, diffOptions: DiffOptions): string | null; -// @internal -export function log__(logs: BettererLogs, logger: BettererLogger): Promise; +// @public +export type MaybeAsync = T | Promise; ``` diff --git a/goldens/api/render.api.md b/goldens/api/render.api.md index b6377441f..96948c3e5 100644 --- a/goldens/api/render.api.md +++ b/goldens/api/render.api.md @@ -7,14 +7,15 @@ import { Box } from 'ink'; import { createContext } from 'react'; import { FC } from 'react'; +import IL from 'ink-link'; import { Instance } from 'ink'; import { memo } from 'react'; import { process as process_2 } from 'process'; import { PropsWithChildren } from 'react'; import R from 'react'; +import { default as React_3 } from 'react'; import { render } from 'ink'; import { RenderOptions } from 'ink'; -import { Text as Text_2 } from 'ink'; import { TextProps } from 'ink'; import TI from 'ink-text-input'; import { useApp } from 'ink'; @@ -34,19 +35,25 @@ export { createContext } export { FC } // @internal -export function getRenderOptions(env?: string, options?: RenderOptions): RenderOptions; +export function getRenderOptionsΔ(env?: string, options?: RenderOptions): RenderOptions; // @internal -export function getStdErr(): StdErr; +export function getStdErrΔ(): Process['stderr']; // @internal -export function getStdIn(): StdIn; +export function getStdInΔ(): Process['stdin']; // @internal -export function getStdOut(): StdOut; +export function getStdOutΔ(): Process['stdout']; export { Instance } +// @internal +export const Link: React.FC; + +// @internal +export type LinkProps = React.ComponentProps; + export { memo } // @internal @@ -63,18 +70,11 @@ export { render } export { RenderOptions } // @internal -export type StdErr = Process['stderr']; - -// @internal -export type StdIn = Process['stdin']; - -// @internal -export type StdOut = Process['stdout']; - +const Text_2: React_3.FC; export { Text_2 as Text } // @internal -export const TextInput: (props: TextInputProps) => JSX.Element; +export const TextInput: React.FC; // @internal export type TextInputProps = React.ComponentProps; diff --git a/goldens/api/reporter.api.md b/goldens/api/reporter.api.md index 034d02991..955e1530c 100644 --- a/goldens/api/reporter.api.md +++ b/goldens/api/reporter.api.md @@ -7,7 +7,7 @@ import type { BettererReporter } from '@betterer/betterer'; // @internal -export function createReporter__(): BettererReporter; +export function createReporterΔ(): BettererReporter; // @public export const reporter: BettererReporter; diff --git a/goldens/api/tasks.api.md b/goldens/api/tasks.api.md index 3da6e37a3..179a13cac 100644 --- a/goldens/api/tasks.api.md +++ b/goldens/api/tasks.api.md @@ -4,65 +4,87 @@ ```ts -/// - import type { BettererError } from '@betterer/errors'; +import type { BettererLog } from '@betterer/logger'; import type { BettererLogger } from '@betterer/logger'; +import type { BettererLogs } from '@betterer/logger'; import type { FC } from '@betterer/render'; +import type { PropsWithChildren } from '@betterer/render'; -// @public +// @internal export const BettererErrorLog: FC; -// @public +// @internal export interface BettererErrorLogProps { error: Error | BettererError; } -// @public +// @internal export const BettererLogo: FC; -// @public -export type BettererTask = (logger: BettererLogger) => Promise; +// @internal +export type BettererTask = (logger: BettererLogger, statusLogger: BettererLogger) => Promise; -// @public +// @internal export const BettererTaskLogger: FC; -// @public +// @internal export interface BettererTaskLoggerProps { name: string; task: BettererTask; } -// @public -export type BettererTasksDone = () => void; +// @internal +export const BettererTaskResult: FC; + +// @internal +export interface BettererTaskResultProps { + error: Error | null; + logs: BettererLogs; + name: string; + status: BettererLog | null; +} -// @public +// @internal export const BettererTasksLogger: FC; -// @public -export interface BettererTasksLoggerProps { - done?: BettererTasksDone; +// @internal +export type BettererTasksLoggerProps = PropsWithChildren<{ exit?: boolean; name: string; - timer?: boolean; update?: BettererTasksStatusUpdate; -} +}>; + +// @internal +export const BettererTasksResult: FC; -// @public +// @internal +export type BettererTasksResultProps = PropsWithChildren; + +// @internal export interface BettererTasksState { - // (undocumented) done: number; - // (undocumented) endTime: number | null; - // (undocumented) errors: number; - // (undocumented) running: number; - // (undocumented) startTime: number; } -// @public +// @internal export type BettererTasksStatusUpdate = (state: BettererTasksState) => string; +// @internal +export interface BettererTaskState { + done: boolean; + error: Error | null; + running: boolean; +} + +// @internal +export function useTimer(): number; + ``` diff --git a/goldens/api/time.api.md b/goldens/api/time.api.md index 1f95e5250..d47254b4c 100644 --- a/goldens/api/time.api.md +++ b/goldens/api/time.api.md @@ -5,9 +5,9 @@ ```ts // @internal -export function getPreciseTime__(): number; +export function getPreciseTimeΔ(): number; // @internal -export function getTime__(): number; +export function getTimeΔ(): number; ``` diff --git a/goldens/api/typescript.api.md b/goldens/api/typescript.api.md index eb7e412fb..b6aec6830 100644 --- a/goldens/api/typescript.api.md +++ b/goldens/api/typescript.api.md @@ -5,9 +5,9 @@ ```ts import { BettererFileTest } from '@betterer/betterer'; -import * as ts from 'typescript'; +import type { CompilerOptions } from 'typescript'; // @public -export function typescript(configFilePath: string, extraCompilerOptions?: ts.CompilerOptions): BettererFileTest; +export function typescript(configFilePath: string, extraCompilerOptions: CompilerOptions): BettererFileTest; ``` diff --git a/goldens/api/worker.api.md b/goldens/api/worker.api.md index 13a6a1ad9..60ce2428b 100644 --- a/goldens/api/worker.api.md +++ b/goldens/api/worker.api.md @@ -4,42 +4,40 @@ ```ts -/// - import type { Remote } from 'comlink'; -// @public -export type BettererWorkerAPI = { +// @internal +export interface BettererWorkerAPI { api: Remote; destroy(): Promise; -}; +} -// @public -export type BettererWorkerFactory> = () => API; +// @internal +export type BettererWorkerFactory> = () => API | Promise; -// @public +// @internal export interface BettererWorkerHandle> { claim(): Promise; destroy(): Promise; release(): void; } -// @public +// @internal export interface BettererWorkerPool> { destroy(): Promise; getWorkerHandle(): BettererWorkerHandle; } // @internal -export function createWorkerPool__>(workerCount: number, workerFactory: BettererWorkerFactory): BettererWorkerPool; +export function createWorkerPoolΔ>(workerCount: number, workerFactory: BettererWorkerFactory): Promise>; // @internal -export function exposeToMain__(api: Expose): void; +export function exposeToMainΔ(api: object): void; // @internal -export function exposeToWorker__(api: Expose): Expose; +export function exposeToWorkerΔ(api: Expose): Expose; // @internal -export function importWorker__(importPath: string): BettererWorkerAPI; +export function importWorkerΔ(importPath: string): Promise>; ``` diff --git a/jest.config.js b/jest.config.js deleted file mode 100644 index 2860cb880..000000000 --- a/jest.config.js +++ /dev/null @@ -1,20 +0,0 @@ -module.exports = { - setupFilesAfterEnv: ['./test/setup.ts'], - collectCoverage: true, - collectCoverageFrom: [ - '/packages/**/dist/**/*.js', - '!/packages/**/dist/**/types.js', - '!/packages/**/dist/**/public.js', - '!/packages/extension/.vscode-test/**/*', - '!/packages/extension/dist/**/*.js', - '!/packages/fixture/dist/**/*.js', - '!/packages/render/dist/**/*.js' - ], - coverageDirectory: '/reports/coverage', - coverageReporters: ['clover', 'json', 'json-summary', 'lcov', 'text'], - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/*.spec.ts', '!**/*.e2e.spec.ts', '!**/workers.spec.ts'], - watchPathIgnorePatterns: ['/fixtures', '/packages/[^/]+/src'], - modulePathIgnorePatterns: ['/packages/extension'] -}; diff --git a/jest.e2e.config.js b/jest.e2e.config.js deleted file mode 100644 index 90692d4ec..000000000 --- a/jest.e2e.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - setupFilesAfterEnv: ['./test/setup.ts'], - preset: 'ts-jest', - testEnvironment: 'node', - testRegex: '.*\\.e2e.spec\\.ts$', - watchPathIgnorePatterns: ['/fixtures', '/packages/[^/]+/src'], - modulePathIgnorePatterns: ['/packages/extension'] -}; diff --git a/jest.workers.config.js b/jest.workers.config.js deleted file mode 100644 index 9b52e1f71..000000000 --- a/jest.workers.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - setupFilesAfterEnv: ['./test/setup.ts'], - preset: 'ts-jest', - testEnvironment: 'node', - testRegex: '.*\\workers.spec\\.ts$', - watchPathIgnorePatterns: ['/fixtures', '/packages/[^/]+/src'], - modulePathIgnorePatterns: ['/packages/extension'] -}; diff --git a/knip.json b/knip.json new file mode 100644 index 000000000..d4f3a1f2f --- /dev/null +++ b/knip.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://unpkg.com/knip@5/schema.json", + "webpack": { + "config": ["webpack.*.config.js"] + }, + "entry": [".betterer.ts"], + "ignore": ["**/dist/**/*.{ts,js}"], + "workspaces": { + "packages/betterer": { + "ignoreDependencies": ["@betterer/reporter", "simple-git", "esbuild"] + }, + "packages/extension": { + "entry": ["packages/extension/client/extension.ts", "packages/extension/server/server.ts"], + "project": ["packages/extension/client/**/*.ts", "packages/extension/server/**/*.ts"] + }, + "packages/fixture": { + "entry": ["packages/fixture/src/index.ts"], + "project": "packages/fixture/src/**/*.ts" + }, + "packages/render": { + "entry": ["packages/render/src/index.ts"], + "project": "packages/render/src/**/*.ts" + }, + "test": { + "entry": ["test/api/src/index.tsx", "test/dependencies/src/index.tsx"], + "project": ["test/api/src/**/*.{ts,tsx}", "test/dependencies/src/**/*.{ts,tsx}"] + }, + + "website": { + "entry": [ + "website/babel.config.js", + "website/docusaurus.config.js", + "website/sidebars.js", + "website/src/pages/index.js" + ], + "project": ["website/**/*.{ts,tsx}"] + } + } +} diff --git a/lerna.json b/lerna.json index d62721e6e..f5f259c97 100644 --- a/lerna.json +++ b/lerna.json @@ -8,6 +8,7 @@ "packages/errors", "packages/eslint", "packages/fixture", + "packages/knip", "packages/logger", "packages/regexp", "packages/render", @@ -19,9 +20,8 @@ "packages/typescript", "packages/worker" ], - "npmClient": "yarn", - "useWorkspaces": true, - "version": "5.4.0", + "npmClient": "npm", + "version": "6.0.0-alpha.1", "command": { "publish": { "conventionalCommits": true diff --git a/lint-staged.config.js b/lint-staged.config.js new file mode 100644 index 000000000..e1292305a --- /dev/null +++ b/lint-staged.config.js @@ -0,0 +1,4 @@ +export default { + '*.{ts,tsx}': () => 'npm run api', + '*': ['npm run lint', 'npm run format', 'npm run betterer:precommit'] +}; diff --git a/mcr.config.ts b/mcr.config.ts new file mode 100644 index 000000000..2feed2263 --- /dev/null +++ b/mcr.config.ts @@ -0,0 +1,25 @@ +export const MCROptions = { + name: 'Unit Coverage Report', + outputDir: './reports/unit-coverage', + + reports: ['v8', 'markdown-summary', 'console-summary'], + + filter: { + '**/index.ts': false, + '**/packages/angular/src/**': true, + '**/packages/betterer/src/**': true, + '**/packages/cli/src/**': true, + '**/packages/constraints/src/**': true, + '**/packages/coverage/src/**': true, + '**/packages/errors/src/**': true, + '**/packages/eslint/src/**': true, + '**/packages/knip/src/**': false, + '**/packages/logger/src/**': true, + '**/packages/regexp/src/**': true, + '**/packages/reporter/src/**': true, + '**/packages/stylelint/src/**': true, + '**/packages/tsquery/src/**': true, + '**/packages/typescript/src/**': true, + '**/packages/worker/src/**': true + } +}; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..bd47859ce --- /dev/null +++ b/package-lock.json @@ -0,0 +1,19644 @@ +{ + "name": "@betterer/monorepo", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@betterer/monorepo", + "version": "0.0.0", + "license": "MIT", + "workspaces": [ + "packages/*", + "test" + ], + "devDependencies": { + "@betterer/cli": "./packages/betterer", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", + "@eslint-community/eslint-plugin-eslint-comments": "^4.4.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.9.1", + "@microsoft/api-extractor": "^7.47.7", + "@phenomnomnominal/commitlint-plugin": "^1.1.1", + "@types/eslint": "^9.6.1", + "@types/ignore-walk": "^4.0.3", + "@types/node": "^18.19.50", + "@vitest/ui": "^2.0.5", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-require-extensions": "^0.1.3", + "globals": "^15.9.0", + "husky": "^9.1.5", + "knip": "^5.29.2", + "lerna": "^8.1.9", + "lint-staged": "^15.2.10", + "patch-package": "^8.0.0", + "prettier": "^3.2.5", + "tsx": "^4.19.2", + "typescript": "^5.5.4", + "typescript-eslint": "^8.4.0", + "vite": "^5.2.9", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^2.0.5", + "vitest-monocart-coverage": "^2.1.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular/common": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.2.2.tgz", + "integrity": "sha512-AQe4xnnNNch/sXRnV82C8FmhijxPATKfPGojC2qbAG2o6VkWKgt5Lbj0O8WxvSIOS5Syedv+O2kLY/JMGWHNtw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.2.2", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.2.2.tgz", + "integrity": "sha512-gmVNCXZiv/CIk2eKRLnH19N9VsPuE2s3Oxm0MNi003zk1cLy7D4YEm4fSrjKXtPY8MMpRXiu5f63W94hLwWEVw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/core": "18.2.2" + }, + "peerDependenciesMeta": { + "@angular/core": { + "optional": true + } + } + }, + "node_modules/@angular/compiler-cli": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.2.2.tgz", + "integrity": "sha512-fF7lDrTA12YGqVjF4LyMi4hm58cv9G6CWmzSlvun0nMYCwrbRNnakZsj19dOfiIqqu4MwHaF4w3PTmUSxkMuiw==", + "dev": true, + "dependencies": { + "@babel/core": "7.25.2", + "@jridgewell/sourcemap-codec": "^1.4.14", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "reflect-metadata": "^0.2.0", + "semver": "^7.0.0", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/index.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/compiler": "18.2.2", + "typescript": ">=5.4 <5.6" + } + }, + "node_modules/@angular/compiler-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/compiler-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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/@angular/compiler-cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/core": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.2.2.tgz", + "integrity": "sha512-Rx6XajL0Ydj9hXUSPDvL2Q/kMzWtbiE3VxZFJnkE+fLQiWvr0GncB+NTb/nQ6QlPQ0ly60DvuI3KLcGDuFtGVA==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.14.10" + } + }, + "node_modules/@angular/platform-browser": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.2.2.tgz", + "integrity": "sha512-Bfvl8elCFxyJ9vlwamr4X5sVMcp/tSwBal2coyl0WR+/PH2PAAtf+/WMYxIN90yZmPiJx6RZWUSJRlHOFiFp3A==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/animations": "18.2.2", + "@angular/common": "18.2.2", + "@angular/core": "18.2.2" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.2.2.tgz", + "integrity": "sha512-UM/+1nY4iIj1v4lxAmV3XRHPAh/4qfNKScCLq8tJGot64rPCbtCl0Rl8rFFGqxAFvTErVDaJycUgWNZSfVl/hw==", + "dev": true, + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.2.2", + "@angular/compiler": "18.2.2", + "@angular/core": "18.2.2", + "@angular/platform-browser": "18.2.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@betterer/angular": { + "resolved": "packages/angular", + "link": true + }, + "node_modules/@betterer/betterer": { + "resolved": "packages/betterer", + "link": true + }, + "node_modules/@betterer/cli": { + "resolved": "packages/cli", + "link": true + }, + "node_modules/@betterer/constraints": { + "resolved": "packages/constraints", + "link": true + }, + "node_modules/@betterer/coverage": { + "resolved": "packages/coverage", + "link": true + }, + "node_modules/@betterer/errors": { + "resolved": "packages/errors", + "link": true + }, + "node_modules/@betterer/eslint": { + "resolved": "packages/eslint", + "link": true + }, + "node_modules/@betterer/fixture": { + "resolved": "packages/fixture", + "link": true + }, + "node_modules/@betterer/knip": { + "resolved": "packages/knip", + "link": true + }, + "node_modules/@betterer/logger": { + "resolved": "packages/logger", + "link": true + }, + "node_modules/@betterer/regexp": { + "resolved": "packages/regexp", + "link": true + }, + "node_modules/@betterer/render": { + "resolved": "packages/render", + "link": true + }, + "node_modules/@betterer/reporter": { + "resolved": "packages/reporter", + "link": true + }, + "node_modules/@betterer/stylelint": { + "resolved": "packages/stylelint", + "link": true + }, + "node_modules/@betterer/tasks": { + "resolved": "packages/tasks", + "link": true + }, + "node_modules/@betterer/time": { + "resolved": "packages/time", + "link": true + }, + "node_modules/@betterer/tsquery": { + "resolved": "packages/tsquery", + "link": true + }, + "node_modules/@betterer/typescript": { + "resolved": "packages/typescript", + "link": true + }, + "node_modules/@betterer/worker": { + "resolved": "packages/worker", + "link": true + }, + "node_modules/@commitlint/cli": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.5.0.tgz", + "integrity": "sha512-gaGqSliGwB86MDmAAKAtV9SV1SHdmN8pnGq4EJU4+hLisQ7IFfx4jvU4s+pk6tl0+9bv6yT+CaZkufOinkSJIQ==", + "dev": true, + "dependencies": { + "@commitlint/format": "^19.5.0", + "@commitlint/lint": "^19.5.0", + "@commitlint/load": "^19.5.0", + "@commitlint/read": "^19.5.0", + "@commitlint/types": "^19.5.0", + "tinyexec": "^0.3.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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/@commitlint/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.5.0.tgz", + "integrity": "sha512-OBhdtJyHNPryZKg0fFpZNOBM1ZDbntMvqMuSmpfyP86XSfwzGw4CaoYRG4RutUPg0BTK07VMRIkNJT6wi2zthg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.5.0", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.5.0.tgz", + "integrity": "sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.5.0", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@commitlint/ensure": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.5.0.tgz", + "integrity": "sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.5.0", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.5.0.tgz", + "integrity": "sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.5.0.tgz", + "integrity": "sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.5.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.5.0.tgz", + "integrity": "sha512-0XQ7Llsf9iL/ANtwyZ6G0NGp5Y3EQ8eDQSxv/SRcfJ0awlBY4tHFAvwWbw66FVUaWICH7iE5en+FD9TQsokZ5w==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.5.0", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/lint": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.5.0.tgz", + "integrity": "sha512-cAAQwJcRtiBxQWO0eprrAbOurtJz8U6MgYqLz+p9kLElirzSCc0vGMcyCaA1O7AqBuxo11l1XsY3FhOFowLAAg==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^19.5.0", + "@commitlint/parse": "^19.5.0", + "@commitlint/rules": "^19.5.0", + "@commitlint/types": "^19.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.5.0.tgz", + "integrity": "sha512-INOUhkL/qaKqwcTUvCE8iIUf5XHsEPCLY9looJ/ipzi7jtGhgmtH7OOFiNvwYgH7mA8osUWOUDV8t4E2HAi4xA==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.5.0", + "@commitlint/execute-rule": "^19.5.0", + "@commitlint/resolve-extends": "^19.5.0", + "@commitlint/types": "^19.5.0", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, + "node_modules/@commitlint/load/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@commitlint/message": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.5.0.tgz", + "integrity": "sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.5.0.tgz", + "integrity": "sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.5.0", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse/node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@commitlint/parse/node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/parse/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/parse/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/@commitlint/parse/node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.5.0.tgz", + "integrity": "sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^19.5.0", + "@commitlint/types": "^19.5.0", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8", + "tinyexec": "^0.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read/node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@commitlint/read/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.5.0.tgz", + "integrity": "sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.5.0", + "@commitlint/types": "^19.5.0", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.5.0.tgz", + "integrity": "sha512-hDW5TPyf/h1/EufSHEKSp6Hs+YVsDMHazfJ2azIk9tHPXS6UqSz1dIRs1gpqS3eMXgtkT7JH6TW4IShdqOwhAw==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^19.5.0", + "@commitlint/message": "^19.5.0", + "@commitlint/to-lines": "^19.5.0", + "@commitlint/types": "^19.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.5.0.tgz", + "integrity": "sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.5.0.tgz", + "integrity": "sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==", + "dev": true, + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@commitlint/types": { + "version": "19.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.5.0.tgz", + "integrity": "sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==", + "dev": true, + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.3.1.tgz", + "integrity": "sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/wasi-threads": "1.0.1", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.3.1.tgz", + "integrity": "sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", + "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.4.0.tgz", + "integrity": "sha512-yljsWl5Qv3IkIRmJ38h3NrHXFCm4EUl55M8doGTF6hvzvFF8kRpextgSrg2dwHev9lzBZyafCr9RelGIyQm6fw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^4.0.0", + "ignore": "^5.2.4" + }, + "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 || ^9.0.0" + } + }, + "node_modules/@eslint-community/eslint-plugin-eslint-comments/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", + "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.4", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", + "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz", + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", + "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@hutson/parse-repository-url": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/@isaacs/string-locale-compare": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz", + "integrity": "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kwsites/file-exists": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", + "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==", + "dependencies": { + "debug": "^4.1.1" + } + }, + "node_modules/@kwsites/promise-deferred": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", + "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" + }, + "node_modules/@lerna/create": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-8.1.9.tgz", + "integrity": "sha512-DPnl5lPX4v49eVxEbJnAizrpMdMTBz1qykZrAbBul9rfgk531v8oAt+Pm6O/rpAleRombNM7FJb5rYGzBJatOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@npmcli/arborist": "7.5.4", + "@npmcli/package-json": "5.2.0", + "@npmcli/run-script": "8.1.0", + "@nx/devkit": ">=17.1.2 < 21", + "@octokit/plugin-enterprise-rest": "6.0.1", + "@octokit/rest": "19.0.11", + "aproba": "2.0.0", + "byte-size": "8.1.1", + "chalk": "4.1.0", + "clone-deep": "4.0.1", + "cmd-shim": "6.0.3", + "color-support": "1.1.3", + "columnify": "1.6.0", + "console-control-strings": "^1.1.0", + "conventional-changelog-core": "5.0.1", + "conventional-recommended-bump": "7.0.1", + "cosmiconfig": "9.0.0", + "dedent": "1.5.3", + "execa": "5.0.0", + "fs-extra": "^11.2.0", + "get-stream": "6.0.0", + "git-url-parse": "14.0.0", + "glob-parent": "6.0.2", + "globby": "11.1.0", + "graceful-fs": "4.2.11", + "has-unicode": "2.0.1", + "ini": "^1.3.8", + "init-package-json": "6.0.3", + "inquirer": "^8.2.4", + "is-ci": "3.0.1", + "is-stream": "2.0.0", + "js-yaml": "4.1.0", + "libnpmpublish": "9.0.9", + "load-json-file": "6.2.0", + "lodash": "^4.17.21", + "make-dir": "4.0.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "node-fetch": "2.6.7", + "npm-package-arg": "11.0.2", + "npm-packlist": "8.0.2", + "npm-registry-fetch": "^17.1.0", + "nx": ">=17.1.2 < 21", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-queue": "6.6.2", + "p-reduce": "^2.1.0", + "pacote": "^18.0.6", + "pify": "5.0.0", + "read-cmd-shim": "4.0.0", + "resolve-from": "5.0.0", + "rimraf": "^4.4.1", + "semver": "^7.3.4", + "set-blocking": "^2.0.0", + "signal-exit": "3.0.7", + "slash": "^3.0.0", + "ssri": "^10.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "strong-log-transformer": "2.1.0", + "tar": "6.2.1", + "temp-dir": "1.0.0", + "upath": "2.0.1", + "uuid": "^10.0.0", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "5.0.1", + "wide-align": "1.1.5", + "write-file-atomic": "5.0.1", + "write-pkg": "4.0.0", + "yargs": "17.7.2", + "yargs-parser": "21.1.1" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@lerna/create/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@lerna/create/node_modules/chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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/@lerna/create/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@lerna/create/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@lerna/create/node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/@lerna/create/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@lerna/create/node_modules/glob": { + "version": "9.3.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz", + "integrity": "sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/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/@lerna/create/node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz", + "integrity": "sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/@lerna/create/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@lerna/create/node_modules/minipass": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", + "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/@lerna/create/node_modules/rimraf": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz", + "integrity": "sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@lerna/create/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@lerna/create/node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@lerna/create/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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/@lerna/create/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@microsoft/api-documenter": { + "version": "7.25.12", + "resolved": "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.25.12.tgz", + "integrity": "sha512-iGucfnoJsbNcMeUZgODvA91sYG9uNy/pnyDiVHjO8++A91Fp1vECAEd1qaqqeCP3ImgJ9HcJuUnwlRvS93QNXw==", + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.29.6", + "@microsoft/tsdoc": "~0.15.0", + "@rushstack/node-core-library": "5.7.0", + "@rushstack/terminal": "0.14.0", + "@rushstack/ts-command-line": "4.22.6", + "js-yaml": "~3.13.1", + "resolve": "~1.22.1" + }, + "bin": { + "api-documenter": "bin/api-documenter" + } + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.47.7", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.47.7.tgz", + "integrity": "sha512-fNiD3G55ZJGhPOBPMKD/enozj8yxJSYyVJWxRWdcUtw842rvthDHJgUWq9gXQTensFlMHv2wGuCjjivPv53j0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.29.6", + "@microsoft/tsdoc": "~0.15.0", + "@microsoft/tsdoc-config": "~0.17.0", + "@rushstack/node-core-library": "5.7.0", + "@rushstack/rig-package": "0.5.3", + "@rushstack/terminal": "0.14.0", + "@rushstack/ts-command-line": "4.22.6", + "lodash": "~4.17.15", + "minimatch": "~3.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.4.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.29.6", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.29.6.tgz", + "integrity": "sha512-gC0KGtrZvxzf/Rt9oMYD2dHvtN/1KPEYsrQPyMKhLHnlVuO/f4AFN3E4toqZzD2pt4LhkKoYmL2H9tX3yCOyRw==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.15.0", + "@microsoft/tsdoc-config": "~0.17.0", + "@rushstack/node-core-library": "5.7.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", + "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.0.tgz", + "integrity": "sha512-HZpPoABogPvjeJOdzCOSJsXeL/SMCBgBZMVC3X3d7YYp2gf31MfxhUoYUNwf1ERPJOnQc0wkFn9trqI6ZEdZuA==", + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.0.tgz", + "integrity": "sha512-v/EYRXnCAIHxOHW+Plb6OWuUoMotxTN0GLatnpOb1xq0KuTNw/WI3pamJx/UbsoJP5k9MCw1QxvvhPcF9pH3Zg==", + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.15.0", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@microsoft/tsdoc-config/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", + "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@emnapi/core": "^1.1.0", + "@emnapi/runtime": "^1.1.0", + "@tybys/wasm-util": "^0.9.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", + "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "dev": true, + "license": "ISC", + "dependencies": { + "agent-base": "^7.1.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.1", + "lru-cache": "^10.0.1", + "socks-proxy-agent": "^8.0.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/https-proxy-agent": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@npmcli/agent/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/arborist": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz", + "integrity": "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/string-locale-compare": "^1.1.0", + "@npmcli/fs": "^3.1.1", + "@npmcli/installed-package-contents": "^2.1.0", + "@npmcli/map-workspaces": "^3.0.2", + "@npmcli/metavuln-calculator": "^7.1.1", + "@npmcli/name-from-folder": "^2.0.0", + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.1.0", + "@npmcli/query": "^3.1.0", + "@npmcli/redact": "^2.0.0", + "@npmcli/run-script": "^8.1.0", + "bin-links": "^4.0.4", + "cacache": "^18.0.3", + "common-ancestor-path": "^1.0.1", + "hosted-git-info": "^7.0.2", + "json-parse-even-better-errors": "^3.0.2", + "json-stringify-nice": "^1.1.4", + "lru-cache": "^10.2.2", + "minimatch": "^9.0.4", + "nopt": "^7.2.1", + "npm-install-checks": "^6.2.0", + "npm-package-arg": "^11.0.2", + "npm-pick-manifest": "^9.0.1", + "npm-registry-fetch": "^17.0.1", + "pacote": "^18.0.6", + "parse-conflict-json": "^3.0.0", + "proc-log": "^4.2.0", + "proggy": "^2.0.0", + "promise-all-reject-late": "^1.0.0", + "promise-call-limit": "^3.0.1", + "read-package-json-fast": "^3.0.2", + "semver": "^7.3.7", + "ssri": "^10.0.6", + "treeverse": "^3.0.0", + "walk-up-path": "^3.0.1" + }, + "bin": { + "arborist": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/arborist/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/arborist/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/fs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "dev": true, + "license": "ISC", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz", + "integrity": "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/promise-spawn": "^7.0.0", + "ini": "^4.1.3", + "lru-cache": "^10.0.1", + "npm-pick-manifest": "^9.0.0", + "proc-log": "^4.0.0", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/ini": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz", + "integrity": "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/git/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/git/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-bundled": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "bin": { + "installed-package-contents": "bin/index.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz", + "integrity": "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/name-from-folder": "^2.0.0", + "glob": "^10.2.2", + "minimatch": "^9.0.0", + "read-package-json-fast": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/map-workspaces/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/metavuln-calculator": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz", + "integrity": "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==", + "dev": true, + "license": "ISC", + "dependencies": { + "cacache": "^18.0.0", + "json-parse-even-better-errors": "^3.0.0", + "pacote": "^18.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/metavuln-calculator/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/name-from-folder": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz", + "integrity": "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", + "integrity": "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.0.tgz", + "integrity": "sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "glob": "^10.2.2", + "hosted-git-info": "^7.0.0", + "json-parse-even-better-errors": "^3.0.0", + "normalize-package-data": "^6.0.0", + "proc-log": "^4.0.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/package-json/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@npmcli/package-json/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz", + "integrity": "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/promise-spawn/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/query": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz", + "integrity": "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/redact": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz", + "integrity": "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz", + "integrity": "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/node-gyp": "^3.0.0", + "@npmcli/package-json": "^5.0.0", + "@npmcli/promise-spawn": "^7.0.0", + "node-gyp": "^10.0.0", + "proc-log": "^4.0.0", + "which": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@npmcli/run-script/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/@npmcli/run-script/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/@nx/devkit": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-20.1.4.tgz", + "integrity": "sha512-Opz7eRPmpt3e4SGkbwZbE9Bg3MhKeivh1QTNCj4tQVAB4gucz0lW/F3mdtRDFdj6gUbqIc5rRrbO/DGlNaEzYw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ejs": "^3.1.7", + "enquirer": "~2.3.6", + "ignore": "^5.0.4", + "minimatch": "9.0.3", + "semver": "^7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0", + "yargs-parser": "21.1.1" + }, + "peerDependencies": { + "nx": ">= 19 <= 21" + } + }, + "node_modules/@nx/devkit/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@nx/devkit/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@nx/devkit/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-20.1.4.tgz", + "integrity": "sha512-afyDOZbIyHi6BgKk+Bb4RI1t8dZ6/oIbOY89z4mBPNNevZkbGqUfMwO2vjKnaOoThcjT93SEMJfCLGL8i857ww==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-20.1.4.tgz", + "integrity": "sha512-aiYklAt95aX0EinepJRryMna8K53G52ngYOFuac1G8iLlguinJvg/YgSKCf7GOAzec8b7Hm7KauPjSJE/P3/iw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-20.1.4.tgz", + "integrity": "sha512-WUh4bsLK+e7wuN3lE3ZQUj+xQKdWU4P4RymutfLQQnPYiilCMtFwITcvDmazmOHFWI2vPhzSyYJRbOu+YMIR3A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-20.1.4.tgz", + "integrity": "sha512-9vPMw5s89v3od7aw3enTWjdMSCAmQ0tIA89Uz7xbbjB2kX2mAdihSzAKd9woi/cj+ROnY+ynNXzU9UjqhfxdBg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-20.1.4.tgz", + "integrity": "sha512-JUE4l8utr9KmQSG9tO2Qw5R5i/bZ16s1+J5xnEar7UfcSOfOLqxGHS7HCBUZcfr46dmtv6KjIC83uHMs19AwDQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-20.1.4.tgz", + "integrity": "sha512-EaPUDqXvnPc/ure0x7N+5lRYvk5zqOQ3LzFOTRPWdqnFXejyTkGjZEYWbLFIJTFrvyEdpfaPTHyNmCHUrEz9TQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-20.1.4.tgz", + "integrity": "sha512-vaWV37ZayfyckVI/faWdQWIV9XQb06ZT8jHQnwgSd9tKbGz37vN30eYtgZlFL0P4bHfhjtmMXnLvADmfyO/KOw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-20.1.4.tgz", + "integrity": "sha512-wjq4Ea1oweBsIA9jq+jDT6BALxv/uac0aFykwoN23dOiwwSMFWMxbXUuBrxp0LjMFGV49S62kVDoRezukvkiZA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-20.1.4.tgz", + "integrity": "sha512-d9jN8biyEJh4Mjdc3RU1j/+WIOjrO9mCDxYuERXP2ELaNsOk0tJgcXE1xsa9AF88AHGpOkCOS2rxy61DKBtFKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-20.1.4.tgz", + "integrity": "sha512-s3RwOkkWKzOflbTmc5MRc4EH2mk1AkJ/V8Gu3Qi2QncF9r1GrR7hDxROpu0MEoHfIhRG+d+n8OGX31nC9GZWUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.1.1.tgz", + "integrity": "sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-enterprise-rest": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request/node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@phenomnomnominal/commitlint-plugin": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@phenomnomnominal/debug": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/debug/-/debug-0.2.5.tgz", + "integrity": "sha512-5yAKsIqcvKUiTYfsEXTt6wiNW2jWVEpa6ej8RSPSRV681av1APBK+2BpEIdOo9DAmq2bwq45Ry3zi/wxBjndaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsite": "^1.0.0", + "esprima": "^4.0.1", + "esquery": "^1.3.1", + "tslib": "^2.0.3" + } + }, + "node_modules/@phenomnomnominal/tsquery": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-6.1.3.tgz", + "integrity": "sha512-CEqpJ872StsxRmwv9ePCZ4BCisrJSlREUC5XxIRYxhvODt4aQoJFFmjTgaP6meyKiiXxxN/VWPZ58j4yHXRkmw==", + "dependencies": { + "@types/esquery": "^1.5.0", + "esquery": "^1.5.0" + }, + "peerDependencies": { + "typescript": "^3 || ^4 || ^5" + } + }, + "node_modules/@phenomnomnominal/tstemplate": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tstemplate/-/tstemplate-0.1.0.tgz", + "integrity": "sha512-/v+GIVNFHAz4+nQtgy9e5ZAXK3xj6TbP5s9JTpnFuqkcLB+gB2lJ6x/nsDhkKhzR6o4REuzhsYoWYnXqKC/UnQ==" + }, + "node_modules/@phenomnomnominal/worker-require": { + "version": "0.0.34", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/worker-require/-/worker-require-0.0.34.tgz", + "integrity": "sha512-2GoVa1PRjrCjOpbMdzsZMQzkx/yFKqWizZc+ZNYSWE+Ym8BG+qAGDcWehUmUmGqy22wS13qitdVt6sR/DAWkIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsite": "^1.0.0", + "comlink": "^4.3.0", + "tslib": "^1.10.0" + } + }, + "node_modules/@phenomnomnominal/worker-require/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@rollup/plugin-commonjs": { + "version": "25.0.7", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-25.0.7.tgz", + "integrity": "sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "glob": "^8.0.3", + "is-reference": "1.2.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", + "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "15.2.3", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", + "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "@types/resolve": "1.20.2", + "deepmerge": "^4.2.2", + "is-builtin-module": "^3.2.1", + "is-module": "^1.0.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.78.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.5.tgz", + "integrity": "sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "magic-string": "^0.30.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "11.1.6", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", + "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "dev": true, + "dependencies": { + "@rollup/pluginutils": "^5.1.0", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0||^4.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.3.tgz", + "integrity": "sha512-X9alQ3XM6I9IlSlmC8ddAvMSyG1WuHk5oUnXGw+yUBs3BFoTizmG1La/Gr8fVJvDWAq+zlYTZ9DBgrlKRVY06g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.3.tgz", + "integrity": "sha512-eQK5JIi+POhFpzk+LnjKIy4Ks+pwJ+NXmPxOCSvOKSNRPONzKuUvWE+P9JxGZVxrtzm6BAYMaL50FFuPe0oWMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.3.tgz", + "integrity": "sha512-Od4vE6f6CTT53yM1jgcLqNfItTsLt5zE46fdPaEmeFHvPs5SjZYlLpHrSiHEKR1+HdRfxuzXHjDOIxQyC3ptBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.3.tgz", + "integrity": "sha512-0IMAO21axJeNIrvS9lSe/PGthc8ZUS+zC53O0VhF5gMxfmcKAP4ESkKOCwEi6u2asUrt4mQv2rjY8QseIEb1aw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.3.tgz", + "integrity": "sha512-ge2DC7tHRHa3caVEoSbPRJpq7azhG+xYsd6u2MEnJ6XzPSzQsTKyXvh6iWjXRf7Rt9ykIUWHtl0Uz3T6yXPpKw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.14.3.tgz", + "integrity": "sha512-ljcuiDI4V3ySuc7eSk4lQ9wU8J8r8KrOUvB2U+TtK0TiW6OFDmJ+DdIjjwZHIw9CNxzbmXY39wwpzYuFDwNXuw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.3.tgz", + "integrity": "sha512-Eci2us9VTHm1eSyn5/eEpaC7eP/mp5n46gTRB3Aar3BgSvDQGJZuicyq6TsH4HngNBgVqC5sDYxOzTExSU+NjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.3.tgz", + "integrity": "sha512-UrBoMLCq4E92/LCqlh+blpqMz5h1tJttPIniwUgOFJyjWI1qrtrDhhpHPuFxULlUmjFHfloWdixtDhSxJt5iKw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.3.tgz", + "integrity": "sha512-5aRjvsS8q1nWN8AoRfrq5+9IflC3P1leMoy4r2WjXyFqf3qcqsxRCfxtZIV58tCxd+Yv7WELPcO9mY9aeQyAmw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.3.tgz", + "integrity": "sha512-sk/Qh1j2/RJSX7FhEpJn8n0ndxy/uf0kI/9Zc4b1ELhqULVdTfN6HL31CDaTChiBAOgLcsJ1sgVZjWv8XNEsAQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.3.tgz", + "integrity": "sha512-jOO/PEaDitOmY9TgkxF/TQIjXySQe5KVYB57H/8LRP/ux0ZoO8cSHCX17asMSv3ruwslXW/TLBcxyaUzGRHcqg==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.3.tgz", + "integrity": "sha512-8ybV4Xjy59xLMyWo3GCfEGqtKV5M5gCSrZlxkPGvEPCGDLNla7v48S662HSGwRd6/2cSneMQWiv+QzcttLrrOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.3.tgz", + "integrity": "sha512-s+xf1I46trOY10OqAtZ5Rm6lzHre/UiLA1J2uOhCFXWkbZrJRkYBPO6FhvGfHmdtQ3Bx793MNa7LvoWFAm93bg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.3.tgz", + "integrity": "sha512-+4h2WrGOYsOumDQ5S2sYNyhVfrue+9tc9XcLWLh+Kw3UOxAvrfOrSMFon60KspcDdytkNDh7K2Vs6eMaYImAZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.3.tgz", + "integrity": "sha512-T1l7y/bCeL/kUwh9OD4PQT4aM7Bq43vX05htPJJ46RTI4r5KNt6qJRzAfNfM+OYMNEVBWQzR2Gyk+FXLZfogGw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.3.tgz", + "integrity": "sha512-/BypzV0H1y1HzgYpxqRaXGBRqfodgoBBCcsrujT6QRcakDQdfU+Lq9PENPh5jB4I44YWq+0C2eHsHya+nZY1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.7.0.tgz", + "integrity": "sha512-Ff9Cz/YlWu9ce4dmqNBZpA45AEya04XaBFIjV7xTVeEf+y/kTjEasmozqFELXlNG4ROdevss75JrrZ5WgufDkQ==", + "license": "MIT", + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~7.0.1", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@rushstack/node-core-library/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "license": "MIT", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.5.3.tgz", + "integrity": "sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.14.0.tgz", + "integrity": "sha512-juTKMAMpTIJKudeFkG5slD8Z/LHwNwGZLtU441l/u82XdTBfsP+LbGKJLCNwP5se+DMCT55GB8x9p6+C4UL7jw==", + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.7.0", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/terminal/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "4.22.6", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.22.6.tgz", + "integrity": "sha512-QSRqHT/IfoC5nk9zn6+fgyqOPXHME0BfchII9EUPR19pocsNp/xSbeBCbD3PIR2Lg+Q5qk7OFqk1VhWPMdKHJg==", + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.14.0", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@sigstore/bundle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz", + "integrity": "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/core": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz", + "integrity": "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/protobuf-specs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.2.tgz", + "integrity": "sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz", + "integrity": "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "make-fetch-happen": "^13.0.1", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz", + "integrity": "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/protobuf-specs": "^0.3.2", + "tuf-js": "^2.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/verify": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz", + "integrity": "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.1.0", + "@sigstore/protobuf-specs": "^0.3.2" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@snyk/github-codeowners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@snyk/github-codeowners/-/github-codeowners-1.1.0.tgz", + "integrity": "sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==", + "license": "MIT", + "dependencies": { + "commander": "^4.1.1", + "ignore": "^5.1.8", + "p-map": "^4.0.0" + }, + "bin": { + "github-codeowners": "dist/cli.js" + }, + "engines": { + "node": ">=8.10" + } + }, + "node_modules/@snyk/github-codeowners/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@stylelint/postcss-css-in-js": { + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.3.tgz", + "integrity": "sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true, + "dependencies": { + "@babel/core": "^7.17.9" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, + "node_modules/@stylelint/postcss-markdown": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz", + "integrity": "sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==", + "deprecated": "Use the original unforked package instead: postcss-markdown", + "dev": true, + "dependencies": { + "remark": "^13.0.0", + "unist-util-find-all-after": "^3.0.2" + }, + "peerDependencies": { + "postcss": ">=7.0.0", + "postcss-syntax": ">=0.36.2" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true + }, + "node_modules/@tufjs/canonical-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz", + "integrity": "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz", + "integrity": "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/canonical-json": "2.0.0", + "minimatch": "^9.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/@tufjs/models/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", + "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "license": "MIT" + }, + "node_modules/@types/babel__code-frame": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.6.tgz", + "integrity": "sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/callsite": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/@types/callsite/-/callsite-1.0.34.tgz", + "integrity": "sha512-eglitkkbqiQiijtKsUvOcQm+E6qLMPcggjDJXeqNBnLxdzffRGop2+2QDN/8pHh396/jN5cmIwweNKUqKJ50mQ==", + "dev": true + }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/dedent": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@types/dedent/-/dedent-0.7.2.tgz", + "integrity": "sha512-kRiitIeUg1mPV9yH4VUJ/1uk2XjyANfeL8/7rH1tsjvHeO9PJLBHJIYsFWmAvmGj5u8rj+1TZx7PZzW2qLw3Lw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/esquery": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/esquery/-/esquery-1.5.4.tgz", + "integrity": "sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ignore-walk": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/ignore-walk/-/ignore-walk-4.0.3.tgz", + "integrity": "sha512-6V7wDsk0nz8LtRC7qeC0GfXadFLT4FdCtVbXhxoIGRdkn2kLr20iMLupRGiBhlZ79WWWqaObIdR3nkXfUrBPdQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest-cli": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/jest-cli/-/jest-cli-24.3.0.tgz", + "integrity": "sha512-1Rt38hBjSUhedce8G+0h1uNS7t/EtcsAHJzvp7w/mm0aSlt9B52WaQ5EM3dUb4BmDhobaIqJzuoGxG3FeHav4Q==", + "deprecated": "This is a stub types definition. jest-cli provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "jest-cli": "*" + } + }, + "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 + }, + "node_modules/@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==", + "dev": true + }, + "node_modules/@types/lodash.debounce": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.9.tgz", + "integrity": "sha512-Ma5JcgTREwpLRwMM+XwBR7DaWe96nC38uCBDFKZWbNKD+osjVzdpnUSwBcqCptrp16sSOLBAUb50Car5I0TCsQ==", + "dev": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/mdast": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.15.tgz", + "integrity": "sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.50", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.50.tgz", + "integrity": "sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/@types/react": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", + "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", + "integrity": "sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==", + "dev": true + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/stylelint": { + "version": "13.13.3", + "resolved": "https://registry.npmjs.org/@types/stylelint/-/stylelint-13.13.3.tgz", + "integrity": "sha512-xvYwobi9L69FXbJTimKYRNHyMwtmcJxMd1woI3U822rkW/f7wcZ6fsV1DqYPT+sNaO0qUtngiBhTQfMeItUvUA==", + "dev": true, + "dependencies": { + "globby": "11.x.x", + "postcss": "7.x.x" + } + }, + "node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true + }, + "node_modules/@types/vscode": { + "version": "1.88.0", + "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.88.0.tgz", + "integrity": "sha512-rWY+Bs6j/f1lvr8jqZTyp5arRMfovdxolcqGi+//+cPDOh8SBvzXH90e7BiSXct5HJ9HGW6jATchbRTpTJpEkw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "node_modules/@types/yoga-layout": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz", + "integrity": "sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.4.0.tgz", + "integrity": "sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/type-utils": "8.4.0", + "@typescript-eslint/utils": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.4.0.tgz", + "integrity": "sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.4.0.tgz", + "integrity": "sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.4.0.tgz", + "integrity": "sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "8.4.0", + "@typescript-eslint/utils": "8.4.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.4.0.tgz", + "integrity": "sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.4.0.tgz", + "integrity": "sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/visitor-keys": "8.4.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.4.0.tgz", + "integrity": "sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.4.0", + "@typescript-eslint/types": "8.4.0", + "@typescript-eslint/typescript-estree": "8.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.4.0.tgz", + "integrity": "sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "8.4.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitest/coverage-istanbul": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/coverage-istanbul/-/coverage-istanbul-2.0.5.tgz", + "integrity": "sha512-BvjWKtp7fiMAeYUD0mO5cuADzn1gmjTm54jm5qUEnh/O08riczun8rI4EtQlg3bWoRo2lT3FO8DmjPDX9ZthPw==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.3", + "debug": "^4.3.5", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-instrument": "^6.0.3", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magicast": "^0.3.4", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.0.5" + } + }, + "node_modules/@vitest/coverage-istanbul/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-istanbul/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vitest/coverage-istanbul/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vitest/coverage-istanbul/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-istanbul/node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/coverage-v8": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-2.0.5.tgz", + "integrity": "sha512-qeFcySCg5FLO2bHHSa0tAZAOnAUbp4L6/A5JDuj9+bt53JREl8hpLjLHEWF0e/gWc8INVpJaqA7+Ene2rclpZg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^0.2.3", + "debug": "^4.3.5", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.10", + "magicast": "^0.3.4", + "std-env": "^3.7.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.0.5" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", + "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.1.tgz", + "integrity": "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^9.0.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/expect": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.0.5.tgz", + "integrity": "sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==", + "dev": true, + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.0.5.tgz", + "integrity": "sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==", + "dev": true, + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.0.5.tgz", + "integrity": "sha512-TfRfZa6Bkk9ky4tW0z20WKXFEwwvWhRY+84CnSEtq4+3ZvDlJyY32oNTJtM7AW9ihW90tX/1Q78cb6FjoAs+ig==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.0.5", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.0.5.tgz", + "integrity": "sha512-SgCPUeDFLaM0mIUHfaArq8fD2WbaXG/zVXjRupthYfYGzc8ztbFbu6dUNOblBG7XLMR1kEhS/DNnfCZ2IhdDew==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "magic-string": "^0.30.10", + "pathe": "^1.1.2" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.0.5.tgz", + "integrity": "sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==", + "dev": true, + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/ui": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.0.5.tgz", + "integrity": "sha512-m+ZpVt/PVi/nbeRKEjdiYeoh0aOfI9zr3Ria9LO7V2PlMETtAXJS3uETEZkc8Be2oOl8mhd7Ew+5SRBXRYncNw==", + "dev": true, + "dependencies": { + "@vitest/utils": "2.0.5", + "fast-glob": "^3.3.2", + "fflate": "^0.8.2", + "flatted": "^3.3.1", + "pathe": "^1.1.2", + "sirv": "^2.0.4", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "vitest": "2.0.5" + } + }, + "node_modules/@vitest/utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.0.5.tgz", + "integrity": "sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==", + "dev": true, + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "dev": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "dev": true, + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", + "dev": true, + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.2.tgz", + "integrity": "sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.7.tgz", + "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/abab": { + "version": "2.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/abbrev": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", + "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "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, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-loose": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/acorn-loose/-/acorn-loose-8.4.0.tgz", + "integrity": "sha512-M0EUka6rb+QC4l9Z3T0nJEzNOO7JcoJlYMrBlyBCiFSXRyxjLKayd4TbQs2FDRWQU1h9FR7QVNHt+PEaoNL5rQ==", + "dev": true, + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-loose/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "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/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "dev": true, + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/auto-bind": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz", + "integrity": "sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/axios": { + "version": "1.7.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.8.tgz", + "integrity": "sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dev": true, + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "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/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/betterer-vscode": { + "resolved": "packages/extension", + "link": true + }, + "node_modules/big-integer": { + "version": "1.6.52", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", + "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/bin-links": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz", + "integrity": "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cmd-shim": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "read-cmd-shim": "^4.0.0", + "write-file-atomic": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/bin-links/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/bin-links/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "dev": true, + "dependencies": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", + "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/buffer-indexof-polyfill": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", + "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", + "dev": true, + "engines": { + "node": ">=0.2.0" + } + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/byte-size": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-8.1.1.tgz", + "integrity": "sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.17" + } + }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacache": { + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz", + "integrity": "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^10.0.1", + "minipass": "^7.0.3", + "minipass-collect": "^2.0.1", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/cacache/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/cacache/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chai": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", + "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "dev": true, + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "dev": true, + "dependencies": { + "traverse": ">=0.3.0 <0.4" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "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/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true, + "license": "MIT" + }, + "node_modules/check-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", + "dev": true, + "engines": { + "node": ">= 16" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-regexp": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", + "dev": true, + "dependencies": { + "is-regexp": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cmd-shim": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz", + "integrity": "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-excerpt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", + "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "dev": true, + "dependencies": { + "convert-to-spaces": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "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/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "license": "ISC", + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/comlink": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz", + "integrity": "sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q==" + }, + "node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/common-ancestor-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz", + "integrity": "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==", + "dev": true, + "license": "ISC" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/compare-func/node_modules/dot-prop": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/console-grid": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/console-grid/-/console-grid-2.2.2.tgz", + "integrity": "sha512-ohlgXexdDTKLNsZz7DSJuCAwmRc8omSS61txOk39W3NOthgKGr1a1jJpZ5BCQe4PlrwMw01OvPQ1Bl3G7Y/uFg==", + "dev": true + }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-5.0.1.tgz", + "integrity": "sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^6.0.0", + "conventional-commits-parser": "^4.0.0", + "dateformat": "^3.0.3", + "get-pkg-repo": "^4.2.1", + "git-raw-commits": "^3.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^5.0.0", + "normalize-package-data": "^3.0.3", + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-core/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-core/node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-3.0.0.tgz", + "integrity": "sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-6.0.1.tgz", + "integrity": "sha512-359t9aHorPw+U+nHzUXHS5ZnPBOizRxfQsWT5ZDHBfvfxQOAik+yfuhKXG66CN5LEWPpMNnIMHUTCKeYNprvHQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "conventional-commits-filter": "^3.0.0", + "dateformat": "^3.0.3", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^8.1.2", + "semver": "^7.0.0", + "split": "^1.0.1" + }, + "bin": { + "conventional-changelog-writer": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-commits-filter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-3.0.0.tgz", + "integrity": "sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-commits-parser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz", + "integrity": "sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.3.5", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-7.0.1.tgz", + "integrity": "sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^3.0.0", + "conventional-commits-filter": "^3.0.0", + "conventional-commits-parser": "^4.0.0", + "git-raw-commits": "^3.0.0", + "git-semver-tags": "^5.0.0", + "meow": "^8.1.2" + }, + "bin": { + "conventional-recommended-bump": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/convert-to-spaces": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", + "integrity": "sha512-cj09EBuObp9gZNQCzc7hByQyrs6jVGE+o9kSJmeUoj+GiPiJvi5LYqEH/Hmme4+MTLHM+Ejtq+FChpjjEnsPdQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "0.7.0", + "license": "MIT" + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "devOptional": true, + "license": "MIT", + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/djb2a": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/djb2a/-/djb2a-2.0.0.tgz", + "integrity": "sha512-mSkCTNSJRGjNUADzWx1ubTGxJh2IVY9uoc/WGozUIu0mgBUEvIyBn9uTs9jqFBbJxQthJMF3uDx0cnpdlAUo4Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/doc-plugin-betterer": { + "resolved": "packages/docgen", + "link": true + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domexception": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-expand": { + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", + "dev": true, + "dependencies": { + "readable-stream": "^2.0.2" + } + }, + "node_modules/duplexer2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/easy-table": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.2.0.tgz", + "integrity": "sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "optionalDependencies": { + "wcwidth": "^1.0.1" + } + }, + "node_modules/eight-colors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/eight-colors/-/eight-colors-1.3.1.tgz", + "integrity": "sha512-7nXPYDeKh6DgJDR/mpt2G7N/hCNSGwwoPVmoI3+4TEwOb07VFN1WMPG0DFf6nMEjrkgdj8Og7l7IaEEk3VE6Zg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "dev": true + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.13.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz", + "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/environment": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/environment/-/environment-1.1.0.tgz", + "integrity": "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true, + "license": "MIT" + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.0.tgz", + "integrity": "sha512-pqrTKmwEIgafsYZAGw9kszYzmagcE/n4dbgwGWLEXg7J4QFJVQRBld8j3Q3GNez79jzxZshq0bcT962QHOghjw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/eslint": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.18.0", + "@eslint/core": "^0.7.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "9.14.0", + "@eslint/plugin-kit": "^0.2.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.0", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "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", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-require-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-require-extensions/-/eslint-plugin-require-extensions-0.1.3.tgz", + "integrity": "sha512-T3c1PZ9PIdI3hjV8LdunfYI8gj017UQjzAnCrxuo3wAjneDbTPHdE3oNWInOjMA+z/aBkUtlW5vC0YepYMZIug==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/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/node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/eslint/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, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/eslint/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, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "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==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "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/execall": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", + "dev": true, + "dependencies": { + "clone-regexp": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "license": "MIT", + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "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.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-memoize": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz", + "integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "license": "MIT" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.8.0", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==", + "dev": true + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up/node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/find-yarn-workspace-root": { + "version": "2.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "micromatch": "^4.0.2" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "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/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/front-matter": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/front-matter/-/front-matter-4.0.2.tgz", + "integrity": "sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true, + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/fs-minipass": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/fstream/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/fstream/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-east-asian-width": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.2.0.tgz", + "integrity": "sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-pkg-repo": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz", + "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@hutson/parse-repository-url": "^3.0.0", + "hosted-git-info": "^4.0.0", + "through2": "^2.0.0", + "yargs": "^16.2.0" + }, + "bin": { + "get-pkg-repo": "src/cli.js" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-pkg-repo/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.0.tgz", + "integrity": "sha512-Pgba6TExTZ0FJAn1qkJAjIeKoDJ3CsI2ChuLohJnZl/tTU8MVrq3b+2t5UOPfRa4RMsorClBjJALkJUMjG1PAw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/git-raw-commits": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-3.0.0.tgz", + "integrity": "sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dargs": "^7.0.0", + "meow": "^8.1.2", + "split2": "^3.2.2" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-remote-origin-url/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/git-semver-tags": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-5.0.1.tgz", + "integrity": "sha512-hIvOeZwRbQ+7YEUmCkHqo8FOLQZCEn18yevLHADlFPZY02KJGsu5FZt9YW/lybfK2uhWFI7Qg/07LekJiTv7iA==", + "dev": true, + "license": "MIT", + "dependencies": { + "meow": "^8.1.2", + "semver": "^7.0.0" + }, + "bin": { + "git-semver-tags": "cli.js" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-14.0.0.tgz", + "integrity": "sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "license": "BSD", + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true + }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true + }, + "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 + }, + "node_modules/gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "gonzales": "bin/gonzales.js" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hosted-git-info": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz", + "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/husky": { + "version": "9.1.5", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.5.tgz", + "integrity": "sha512-rowAVRUBfI0b4+niA4SJMhfQwc107VLkBUgEYYAOQAbqDCnra1nYh83hF/MDmhYs9t9n1E3DuKOrs2LYNC+0Ag==", + "dev": true, + "bin": { + "husky": "bin.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/typicode" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "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": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/init-package-json": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-6.0.3.tgz", + "integrity": "sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/package-json": "^5.0.0", + "npm-package-arg": "^11.0.0", + "promzard": "^1.0.0", + "read": "^3.0.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/ink": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz", + "integrity": "sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "auto-bind": "4.0.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.0", + "cli-cursor": "^3.1.0", + "cli-truncate": "^2.1.0", + "code-excerpt": "^3.0.0", + "indent-string": "^4.0.0", + "is-ci": "^2.0.0", + "lodash": "^4.17.20", + "patch-console": "^1.0.0", + "react-devtools-core": "^4.19.1", + "react-reconciler": "^0.26.2", + "scheduler": "^0.20.2", + "signal-exit": "^3.0.2", + "slice-ansi": "^3.0.0", + "stack-utils": "^2.0.2", + "string-width": "^4.2.2", + "type-fest": "^0.12.0", + "widest-line": "^3.1.0", + "wrap-ansi": "^6.2.0", + "ws": "^7.5.5", + "yoga-layout-prebuilt": "^1.9.6" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": ">=16.8.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/ink-link": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ink-link/-/ink-link-2.0.1.tgz", + "integrity": "sha512-244mypIguXjMz+vW9F0fMrgFJyDy8ZEoMUYTMW7FOB2Vlb9IqkVZOtDL7sLaeOSQj28L9of591FJR6JpvsF4lA==", + "dev": true, + "license": "MIT", + "dependencies": { + "prop-types": "^15.7.2", + "terminal-link": "^2.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "ink": ">=3.0.0", + "react": ">=16.8.0" + } + }, + "node_modules/ink-text-input": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/ink-text-input/-/ink-text-input-4.0.3.tgz", + "integrity": "sha512-eQD01ik9ltmNoHmkeQ2t8LszYkv2XwuPSUz3ie/85qer6Ll/j0QSlSaLNl6ENHZakBHdCBVZY04iOXcLLXA0PQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "type-fest": "^0.15.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ink": "^3.0.0-3", + "react": "^16.5.2 || ^17.0.0" + } + }, + "node_modules/ink-text-input/node_modules/type-fest": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.15.1.tgz", + "integrity": "sha512-n+UXrN8i5ioo7kqT/nF8xsEzLaqFra7k32SEsSPwvXVGyAcRgV/FUQN/sgfptJTR1oRmmq7z4IXMFSM7im7C9A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink/node_modules/type-fest": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz", + "integrity": "sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ink/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz", + "integrity": "sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dev": true, + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "dev": true, + "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", + "engines": { + "node": ">=4" + } + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jake": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz", + "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dev": true, + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dev": true, + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "dev": true, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dev": true, + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dev": true, + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dev": true, + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", + "dev": true + }, + "node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dev": true, + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "16.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.5", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.2.tgz", + "integrity": "sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "jsonify": "^0.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stringify-nice": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz", + "integrity": "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true, + "license": "ISC" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonfile/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/jsonify": { + "version": "0.0.1", + "dev": true, + "license": "Public Domain", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "dev": true, + "engines": [ + "node >= 0.2.0" + ], + "license": "MIT" + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "dev": true, + "license": "(MIT OR Apache-2.0)", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-diff": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz", + "integrity": "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==", + "dev": true, + "license": "MIT" + }, + "node_modules/just-diff-apply": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz", + "integrity": "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==", + "dev": true, + "license": "MIT" + }, + "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, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klaw-sync": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/knip": { + "version": "5.36.2", + "resolved": "https://registry.npmjs.org/knip/-/knip-5.36.2.tgz", + "integrity": "sha512-MudNTKBSqThAFAV29GuRPSKSebByZeQCFeNgXVRVSd+sXcubehTgQHTGqqiwlXGCt4WBP7vuVekp0ZehfZtHuw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/webpro" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/knip" + }, + { + "type": "polar", + "url": "https://polar.sh/webpro-nl" + } + ], + "license": "ISC", + "dependencies": { + "@nodelib/fs.walk": "1.2.8", + "@snyk/github-codeowners": "1.1.0", + "easy-table": "1.2.0", + "enhanced-resolve": "^5.17.1", + "fast-glob": "^3.3.2", + "jiti": "^2.4.0", + "js-yaml": "^4.1.0", + "minimist": "^1.2.8", + "picocolors": "^1.1.0", + "picomatch": "^4.0.1", + "pretty-ms": "^9.0.0", + "smol-toml": "^1.3.0", + "strip-json-comments": "5.0.1", + "summary": "2.1.0", + "zod": "^3.22.4", + "zod-validation-error": "^3.0.3" + }, + "bin": { + "knip": "bin/knip.js", + "knip-bun": "bin/knip-bun.js" + }, + "engines": { + "node": ">=18.6.0" + }, + "peerDependencies": { + "@types/node": ">=18", + "typescript": ">=5.0.4" + } + }, + "node_modules/knip/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/knip/node_modules/jiti": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.0.tgz", + "integrity": "sha512-H5UpaUI+aHOqZXlYOaFP/8AzKsg+guWu+Pr3Y8i7+Y3zr1aXAvCvTAQ1RxSc6oVD8R8c7brgNtTVP91E7upH/g==", + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/knip/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/knip/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/knip/node_modules/strip-json-comments": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/known-css-properties": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz", + "integrity": "sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==", + "dev": true + }, + "node_modules/lerna": { + "version": "8.1.9", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-8.1.9.tgz", + "integrity": "sha512-ZRFlRUBB2obm+GkbTR7EbgTMuAdni6iwtTQTMy7LIrQ4UInG44LyfRepljtgUxh4HA0ltzsvWfPkd5J1DKGCeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@lerna/create": "8.1.9", + "@npmcli/arborist": "7.5.4", + "@npmcli/package-json": "5.2.0", + "@npmcli/run-script": "8.1.0", + "@nx/devkit": ">=17.1.2 < 21", + "@octokit/plugin-enterprise-rest": "6.0.1", + "@octokit/rest": "19.0.11", + "aproba": "2.0.0", + "byte-size": "8.1.1", + "chalk": "4.1.0", + "clone-deep": "4.0.1", + "cmd-shim": "6.0.3", + "color-support": "1.1.3", + "columnify": "1.6.0", + "console-control-strings": "^1.1.0", + "conventional-changelog-angular": "7.0.0", + "conventional-changelog-core": "5.0.1", + "conventional-recommended-bump": "7.0.1", + "cosmiconfig": "9.0.0", + "dedent": "1.5.3", + "envinfo": "7.13.0", + "execa": "5.0.0", + "fs-extra": "^11.2.0", + "get-port": "5.1.1", + "get-stream": "6.0.0", + "git-url-parse": "14.0.0", + "glob-parent": "6.0.2", + "globby": "11.1.0", + "graceful-fs": "4.2.11", + "has-unicode": "2.0.1", + "import-local": "3.1.0", + "ini": "^1.3.8", + "init-package-json": "6.0.3", + "inquirer": "^8.2.4", + "is-ci": "3.0.1", + "is-stream": "2.0.0", + "jest-diff": ">=29.4.3 < 30", + "js-yaml": "4.1.0", + "libnpmaccess": "8.0.6", + "libnpmpublish": "9.0.9", + "load-json-file": "6.2.0", + "lodash": "^4.17.21", + "make-dir": "4.0.0", + "minimatch": "3.0.5", + "multimatch": "5.0.0", + "node-fetch": "2.6.7", + "npm-package-arg": "11.0.2", + "npm-packlist": "8.0.2", + "npm-registry-fetch": "^17.1.0", + "nx": ">=17.1.2 < 21", + "p-map": "4.0.0", + "p-map-series": "2.1.0", + "p-pipe": "3.1.0", + "p-queue": "6.6.2", + "p-reduce": "2.1.0", + "p-waterfall": "2.1.1", + "pacote": "^18.0.6", + "pify": "5.0.0", + "read-cmd-shim": "4.0.0", + "resolve-from": "5.0.0", + "rimraf": "^4.4.1", + "semver": "^7.3.8", + "set-blocking": "^2.0.0", + "signal-exit": "3.0.7", + "slash": "3.0.0", + "ssri": "^10.0.6", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "strong-log-transformer": "2.1.0", + "tar": "6.2.1", + "temp-dir": "1.0.0", + "typescript": ">=3 < 6", + "upath": "2.0.1", + "uuid": "^10.0.0", + "validate-npm-package-license": "3.0.4", + "validate-npm-package-name": "5.0.1", + "wide-align": "1.1.5", + "write-file-atomic": "5.0.1", + "write-pkg": "4.0.0", + "yargs": "17.7.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "lerna": "dist/cli.js" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/lerna/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/lerna/node_modules/chalk": { + "version": "4.1.0", + "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/lerna/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/lerna/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/lerna/node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/lerna/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/lerna/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/lerna/node_modules/glob": { + "version": "9.3.5", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "minimatch": "^8.0.2", + "minipass": "^4.2.4", + "path-scurry": "^1.6.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lerna/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/lerna/node_modules/glob/node_modules/minimatch": { + "version": "8.0.4", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lerna/node_modules/glob/node_modules/minipass": { + "version": "4.2.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/lerna/node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/lerna/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/lerna/node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/lerna/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/lerna/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/lerna/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/lerna/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lerna/node_modules/rimraf": { + "version": "4.4.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^9.2.0" + }, + "bin": { + "rimraf": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lerna/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/lerna/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/lerna/node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lerna/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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/lerna/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libnpmaccess": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-8.0.6.tgz", + "integrity": "sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/libnpmpublish": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-9.0.9.tgz", + "integrity": "sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==", + "dev": true, + "license": "ISC", + "dependencies": { + "ci-info": "^4.0.0", + "normalize-package-data": "^6.0.1", + "npm-package-arg": "^11.0.2", + "npm-registry-fetch": "^17.0.1", + "proc-log": "^4.2.0", + "semver": "^7.3.7", + "sigstore": "^2.2.0", + "ssri": "^10.0.6" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/libnpmpublish/node_modules/ci-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/libnpmpublish/node_modules/normalize-package-data": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz", + "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^7.0.0", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/lint-staged": { + "version": "15.2.10", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.10.tgz", + "integrity": "sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.6", + "execa": "~8.0.1", + "lilconfig": "~3.1.2", + "listr2": "~8.2.4", + "micromatch": "~4.0.8", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.5.0" + }, + "bin": { + "lint-staged": "bin/lint-staged.js" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://opencollective.com/lint-staged" + } + }, + "node_modules/lint-staged/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/lint-staged/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/lint-staged/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/lint-staged/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/listenercount": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", + "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", + "dev": true + }, + "node_modules/listr2": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.4.tgz", + "integrity": "sha512-opevsywziHd3zHCVQGAj8zu+Z3yHNkkoYhWIGnq54RrCVwLz0MozotJEDnKsIBLvkfLGN6BLOyAeRrYI0pKA4g==", + "dev": true, + "dependencies": { + "cli-truncate": "^4.0.0", + "colorette": "^2.0.20", + "eventemitter3": "^5.0.1", + "log-update": "^6.1.0", + "rfdc": "^1.4.1", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/listr2/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/listr2/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/listr2/node_modules/cli-truncate": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", + "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/listr2/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "dev": true + }, + "node_modules/listr2/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/load-json-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz", + "integrity": "sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^5.0.0", + "strip-bom": "^4.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/load-json-file/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-6.1.0.tgz", + "integrity": "sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==", + "dev": true, + "dependencies": { + "ansi-escapes": "^7.0.0", + "cli-cursor": "^5.0.0", + "slice-ansi": "^7.1.0", + "strip-ansi": "^7.1.0", + "wrap-ansi": "^9.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", + "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "dev": true, + "dependencies": { + "environment": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/cli-cursor": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", + "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "dev": true, + "dependencies": { + "restore-cursor": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/log-update/node_modules/is-fullwidth-code-point": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", + "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", + "dev": true, + "dependencies": { + "get-east-asian-width": "^1.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/onetime": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz", + "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==", + "dev": true, + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/restore-cursor": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz", + "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==", + "dev": true, + "dependencies": { + "onetime": "^7.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", + "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "is-fullwidth-code-point": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, + "dependencies": { + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", + "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.2.1", + "string-width": "^7.0.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/longest-streak": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lz-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lz-utils/-/lz-utils-2.1.0.tgz", + "integrity": "sha512-CMkfimAypidTtWjNDxY8a1bc1mJdyEh04V2FfEQ5Zh8Nx4v7k850EYa+dOWGn9hKG5xOyHP5MkuduAZCTHRvJw==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.11", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", + "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/magicast": { + "version": "0.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.24.4", + "@babel/types": "^7.24.0", + "source-map-js": "^1.2.0" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/make-fetch-happen": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", + "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/agent": "^2.0.0", + "cacache": "^18.0.0", + "http-cache-semantics": "^4.1.1", + "is-lambda": "^1.0.1", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "proc-log": "^4.2.0", + "promise-retry": "^2.0.1", + "ssri": "^10.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz", + "integrity": "sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^3.0.0", + "mdast-util-to-string": "^2.0.0", + "micromark": "~2.11.0", + "parse-entities": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz", + "integrity": "sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "longest-streak": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromark": { + "version": "2.11.4", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz", + "integrity": "sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "debug": "^4.0.0", + "parse-entities": "^2.0.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-collect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", + "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minipass-fetch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.0.3", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-pipeline/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/monocart-coverage-reports": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/monocart-coverage-reports/-/monocart-coverage-reports-2.11.1.tgz", + "integrity": "sha512-h4rc2i/A/aKuQ66EpswJ4y/dxXO6GDt0yuU9dt4MUsbbEXD1EoldFWvHszdo8M2dwVbAjDcAzHrQKBCs2ydfzA==", + "dev": true, + "license": "MIT", + "workspaces": [ + "test" + ], + "dependencies": { + "acorn": "^8.12.1", + "acorn-loose": "^8.4.0", + "acorn-walk": "^8.3.4", + "commander": "^12.1.0", + "console-grid": "^2.2.2", + "eight-colors": "^1.3.1", + "foreground-child": "^3.3.0", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.7", + "lz-utils": "^2.1.0", + "monocart-locator": "^1.0.2" + }, + "bin": { + "mcr": "lib/cli.js" + } + }, + "node_modules/monocart-coverage-reports/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/monocart-coverage-reports/node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/monocart-coverage-reports/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/monocart-locator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/monocart-locator/-/monocart-locator-1.0.2.tgz", + "integrity": "sha512-v8W5hJLcWMIxLCcSi/MHh+VeefI+ycFmGz23Froer9QzWjrbg4J3gFJBuI/T1VLNoYxF47bVPPxq8ZlNX4gVCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/multimatch/node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true, + "license": "ISC" + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.2.0.tgz", + "integrity": "sha512-sp3FonBAaFe4aYTcFdZUn2NYkbP7xroPGYvQmP4Nl5PxamznItBnNCgjrVTKrEfQynInMsJvZrdmqUnysCJ8rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "glob": "^10.3.10", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^13.0.0", + "nopt": "^7.0.0", + "proc-log": "^4.1.0", + "semver": "^7.3.5", + "tar": "^6.2.1", + "which": "^4.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/node-gyp/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/node-gyp/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", + "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^16.13.0 || >=18.0.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-machine-id": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz", + "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "dev": true + }, + "node_modules/nopt": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", + "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^2.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-selector": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz", + "integrity": "sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==", + "dev": true + }, + "node_modules/npm-bundled": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-install-checks": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz", + "integrity": "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz", + "integrity": "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-package-arg": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.2.tgz", + "integrity": "sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==", + "dev": true, + "license": "ISC", + "dependencies": { + "hosted-git-info": "^7.0.0", + "proc-log": "^4.0.0", + "semver": "^7.3.5", + "validate-npm-package-name": "^5.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-packlist": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz", + "integrity": "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==", + "dev": true, + "license": "ISC", + "dependencies": { + "ignore-walk": "^6.0.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/npm-pick-manifest": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz", + "integrity": "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA==", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-install-checks": "^6.0.0", + "npm-normalize-package-bin": "^3.0.0", + "npm-package-arg": "^11.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-registry-fetch": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz", + "integrity": "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/redact": "^2.0.0", + "jsonparse": "^1.3.1", + "make-fetch-happen": "^13.0.0", + "minipass": "^7.0.2", + "minipass-fetch": "^3.0.0", + "minizlib": "^2.1.2", + "npm-package-arg": "^11.0.0", + "proc-log": "^4.0.0" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==", + "dev": true + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/nx": { + "version": "20.1.4", + "resolved": "https://registry.npmjs.org/nx/-/nx-20.1.4.tgz", + "integrity": "sha512-hyvGYxTzBkPxSXAB2tuqdv9TpVde5xOdGalsIdhF7j7PI3nwPpqtc3y28YTgRgpxtOE1Y6BfDNkXMO1SW0xu2w==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@napi-rs/wasm-runtime": "0.2.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.2", + "@zkochan/js-yaml": "0.0.7", + "axios": "^1.7.4", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^8.0.1", + "dotenv": "~16.4.5", + "dotenv-expand": "~11.0.6", + "enquirer": "~2.3.6", + "figures": "3.2.0", + "flat": "^5.0.2", + "front-matter": "^4.0.2", + "ignore": "^5.0.4", + "jest-diff": "^29.4.1", + "jsonc-parser": "3.2.0", + "lines-and-columns": "2.0.3", + "minimatch": "9.0.3", + "node-machine-id": "1.1.12", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "ora": "5.3.0", + "semver": "^7.5.3", + "string-width": "^4.2.3", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js", + "nx-cloud": "bin/nx-cloud.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "20.1.4", + "@nx/nx-darwin-x64": "20.1.4", + "@nx/nx-freebsd-x64": "20.1.4", + "@nx/nx-linux-arm-gnueabihf": "20.1.4", + "@nx/nx-linux-arm64-gnu": "20.1.4", + "@nx/nx-linux-arm64-musl": "20.1.4", + "@nx/nx-linux-x64-gnu": "20.1.4", + "@nx/nx-linux-x64-musl": "20.1.4", + "@nx/nx-win32-arm64-msvc": "20.1.4", + "@nx/nx-win32-x64-msvc": "20.1.4" + }, + "peerDependencies": { + "@swc-node/register": "^1.8.0", + "@swc/core": "^1.3.85" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/nx/node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/nx/node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/nx/node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/nx/node_modules/lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nx/node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/ora": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.3.0.tgz", + "integrity": "sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "log-symbols": "^4.0.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nx/node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/nx/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nx/node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/nx/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "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/nx/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "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/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map-series": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz", + "integrity": "sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-pipe": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", + "integrity": "sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.4", + "p-timeout": "^3.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-reduce": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz", + "integrity": "sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-waterfall": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz", + "integrity": "sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-reduce": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, + "node_modules/pacote": { + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz", + "integrity": "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@npmcli/git": "^5.0.0", + "@npmcli/installed-package-contents": "^2.0.1", + "@npmcli/package-json": "^5.1.0", + "@npmcli/promise-spawn": "^7.0.0", + "@npmcli/run-script": "^8.0.0", + "cacache": "^18.0.0", + "fs-minipass": "^3.0.0", + "minipass": "^7.0.2", + "npm-package-arg": "^11.0.0", + "npm-packlist": "^8.0.0", + "npm-pick-manifest": "^9.0.0", + "npm-registry-fetch": "^17.0.0", + "proc-log": "^4.0.0", + "promise-retry": "^2.0.1", + "sigstore": "^2.2.0", + "ssri": "^10.0.0", + "tar": "^6.1.11" + }, + "bin": { + "pacote": "bin/index.js" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-conflict-json": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz", + "integrity": "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "just-diff": "^6.0.0", + "just-diff-apply": "^5.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/parse-conflict-json/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dev": true, + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-json/node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dev": true, + "license": "MIT", + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/patch-console": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz", + "integrity": "sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/patch-package": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@yarnpkg/lockfile": "^1.1.0", + "chalk": "^4.1.2", + "ci-info": "^3.7.0", + "cross-spawn": "^7.0.3", + "find-yarn-workspace-root": "^2.0.0", + "fs-extra": "^9.0.0", + "json-stable-stringify": "^1.0.2", + "klaw-sync": "^6.0.0", + "minimist": "^1.2.6", + "open": "^7.4.2", + "rimraf": "^2.6.3", + "semver": "^7.5.3", + "slash": "^2.0.0", + "tmp": "^0.0.33", + "yaml": "^2.2.2" + }, + "bin": { + "patch-package": "index.js" + }, + "engines": { + "node": ">=14", + "npm": ">5" + } + }, + "node_modules/patch-package/node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/patch-package/node_modules/slash": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/patch-package/node_modules/yaml": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz", + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/pathval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", + "dev": true, + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz", + "integrity": "sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.10.0" + }, + "peerDependencies": { + "postcss": ">=5.0.0", + "postcss-syntax": ">=0.36.0" + } + }, + "node_modules/postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.14" + }, + "engines": { + "node": ">=6.14.4" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "dev": true + }, + "node_modules/postcss-safe-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "dependencies": { + "postcss": "^7.0.26" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", + "dev": true, + "dependencies": { + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" + } + }, + "node_modules/postcss-scss": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz", + "integrity": "sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==", + "dev": true, + "dependencies": { + "postcss": "^7.0.6" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sorting": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-5.0.1.tgz", + "integrity": "sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14", + "postcss": "^7.0.17" + }, + "engines": { + "node": ">=8.7.0" + } + }, + "node_modules/postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true, + "peerDependencies": { + "postcss": ">=5.0.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-ms": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.1.0.tgz", + "integrity": "sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==", + "license": "MIT", + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proc-log": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", + "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proggy": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz", + "integrity": "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/promise-all-reject-late": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz", + "integrity": "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-call-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz", + "integrity": "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==", + "dev": true, + "license": "ISC", + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/promzard": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-1.0.2.tgz", + "integrity": "sha512-2FPputGL+mP3jJ3UZg/Dl9YOkovB7DX0oOr+ck5QbZ5MtORtds8k/BZdn+02peDLI8/YWbmzx34k5fA+fHvCVQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "read": "^3.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dev": true, + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-devtools-core": { + "version": "4.28.5", + "resolved": "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.28.5.tgz", + "integrity": "sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA==", + "dev": true, + "dependencies": { + "shell-quote": "^1.6.1", + "ws": "^7" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/react-reconciler": { + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz", + "integrity": "sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "engines": { + "node": ">=0.10.0" + }, + "peerDependencies": { + "react": "^17.0.2" + } + }, + "node_modules/read": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", + "integrity": "sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==", + "dev": true, + "license": "ISC", + "dependencies": { + "mute-stream": "^1.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-cmd-shim": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz", + "integrity": "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz", + "integrity": "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^3.0.0", + "npm-normalize-package-bin": "^3.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "license": "MIT", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/read/node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true + }, + "node_modules/remark": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz", + "integrity": "sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==", + "dev": true, + "dependencies": { + "remark-parse": "^9.0.0", + "remark-stringify": "^9.0.0", + "unified": "^9.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz", + "integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^0.8.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz", + "integrity": "sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==", + "dev": true, + "dependencies": { + "mdast-util-to-markdown": "^0.6.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.14.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.3.tgz", + "integrity": "sha512-ag5tTQKYsj1bhrFC9+OEWqb5O6VYgtQDO9hPDBMmIbePwhfSr+ExlcU741t8Dhw5DkPCQf6noz0jb36D6W9/hw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.14.3", + "@rollup/rollup-android-arm64": "4.14.3", + "@rollup/rollup-darwin-arm64": "4.14.3", + "@rollup/rollup-darwin-x64": "4.14.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.3", + "@rollup/rollup-linux-arm-musleabihf": "4.14.3", + "@rollup/rollup-linux-arm64-gnu": "4.14.3", + "@rollup/rollup-linux-arm64-musl": "4.14.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.3", + "@rollup/rollup-linux-riscv64-gnu": "4.14.3", + "@rollup/rollup-linux-s390x-gnu": "4.14.3", + "@rollup/rollup-linux-x64-gnu": "4.14.3", + "@rollup/rollup-linux-x64-musl": "4.14.3", + "@rollup/rollup-win32-arm64-msvc": "4.14.3", + "@rollup/rollup-win32-ia32-msvc": "4.14.3", + "@rollup/rollup-win32-x64-msvc": "4.14.3", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/saxes": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dev": true, + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sigstore": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz", + "integrity": "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@sigstore/bundle": "^2.3.2", + "@sigstore/core": "^1.0.0", + "@sigstore/protobuf-specs": "^0.3.2", + "@sigstore/sign": "^2.3.2", + "@sigstore/tuf": "^2.3.4", + "@sigstore/verify": "^1.2.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/simple-git": { + "version": "3.24.0", + "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.24.0.tgz", + "integrity": "sha512-QqAKee9Twv+3k8IFOFfPB2hnk6as6Y6ACUpwCtQvRYBAes23Wv3SZlHVobAzqcE8gfsisCvPw3HGW3HYM+VYYw==", + "dependencies": { + "@kwsites/file-exists": "^1.1.1", + "@kwsites/promise-deferred": "^1.1.1", + "debug": "^4.3.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/steveukx/git-js?sponsor=1" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/smol-toml": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.3.0.tgz", + "integrity": "sha512-tWpi2TsODPScmi48b/OQZGi2lgUmBCHy6SZrhi/FdnnHiU1GwebbCfuQuxsC3nHaLwtYeJGPrDZDIeodDOc4pA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 18" + }, + "funding": { + "url": "https://github.com/sponsors/cyyynthia" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", + "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spdx-correct": { + "version": "3.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.5", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/specificity": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", + "dev": true, + "bin": { + "specificity": "bin/specificity" + } + }, + "node_modules/split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "license": "ISC", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/ssri": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.3" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", + "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", + "dev": true + }, + "node_modules/stylelint": { + "version": "13.13.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz", + "integrity": "sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==", + "dev": true, + "dependencies": { + "@stylelint/postcss-css-in-js": "^0.37.2", + "@stylelint/postcss-markdown": "^0.36.2", + "autoprefixer": "^9.8.6", + "balanced-match": "^2.0.0", + "chalk": "^4.1.1", + "cosmiconfig": "^7.0.0", + "debug": "^4.3.1", + "execall": "^2.0.0", + "fast-glob": "^3.2.5", + "fastest-levenshtein": "^1.0.12", + "file-entry-cache": "^6.0.1", + "get-stdin": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.0.3", + "globjoin": "^0.1.4", + "html-tags": "^3.1.0", + "ignore": "^5.1.8", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.21.0", + "lodash": "^4.17.21", + "log-symbols": "^4.1.0", + "mathml-tag-names": "^2.1.3", + "meow": "^9.0.0", + "micromatch": "^4.0.4", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.35", + "postcss-html": "^0.36.0", + "postcss-less": "^3.1.4", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.2", + "postcss-sass": "^0.4.4", + "postcss-scss": "^2.1.1", + "postcss-selector-parser": "^6.0.5", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.1.0", + "resolve-from": "^5.0.0", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.2.2", + "strip-ansi": "^6.0.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^6.6.0", + "v8-compile-cache": "^2.3.0", + "write-file-atomic": "^3.0.3" + }, + "bin": { + "stylelint": "bin/stylelint.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-order": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.1.0.tgz", + "integrity": "sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw==", + "dev": true, + "dependencies": { + "lodash": "^4.17.15", + "postcss": "^7.0.31", + "postcss-sorting": "^5.0.1" + }, + "peerDependencies": { + "stylelint": "^10.0.1 || ^11.0.0 || ^12.0.0 || ^13.0.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/sugarss": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^7.0.2" + } + }, + "node_modules/summary": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/summary/-/summary-2.1.0.tgz", + "integrity": "sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==", + "license": "MIT" + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/table": { + "version": "6.7.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "dev": true, + "license": "ISC", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar/node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar/node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=8" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.30.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.30.3.tgz", + "integrity": "sha512-STdUgOUx8rLbMGO9IOwHLpCqolkDITFFQSMYYwKE1N2lY6MVSaeoi10z/EhWxRc6ybqoVmKSkhKYH/XUpl7vSA==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true + }, + "node_modules/tinyexec": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.0.tgz", + "integrity": "sha512-tVGE0mVJPGb0chKhqmsoosjsS+qUnJVGJpZgsHYQcGoPlG3B51R3PouqTgEGH2Dc9jjFyOqOpix6ZHNMXp1FZg==", + "dev": true + }, + "node_modules/tinypool": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", + "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-1.2.0.tgz", + "integrity": "sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dev": true, + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/treeverse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz", + "integrity": "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-loader": { + "version": "9.5.1", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", + "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "enhanced-resolve": "^5.0.0", + "micromatch": "^4.0.0", + "semver": "^7.3.4", + "source-map": "^0.7.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "typescript": "*", + "webpack": "^5.0.0" + } + }, + "node_modules/ts-loader/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tuf-js": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz", + "integrity": "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tufjs/models": "2.0.1", + "debug": "^4.3.4", + "make-fetch-happen": "^13.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.4.0.tgz", + "integrity": "sha512-67qoc3zQZe3CAkO0ua17+7aCLI0dU+sSQd1eKPGq06QE4rfQjstVXR6woHO5qQvGUa550NfGckT4tzh3b3c8Pw==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.4.0", + "@typescript-eslint/parser": "8.4.0", + "@typescript-eslint/utils": "8.4.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/uglify-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unified": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz", + "integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==", + "dev": true, + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/unique-filename": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", + "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "dev": true, + "license": "ISC", + "dependencies": { + "unique-slug": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unique-slug": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", + "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/unist-util-find-all-after": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz", + "integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==", + "dev": true, + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.1.tgz", + "integrity": "sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unzipper": { + "version": "0.10.14", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", + "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.17", + "binary": "~0.3.0", + "bluebird": "~3.4.1", + "buffer-indexof-polyfill": "~1.0.0", + "duplexer2": "~0.1.4", + "fstream": "^1.0.12", + "graceful-fs": "^4.2.2", + "listenercount": "~1.0.1", + "readable-stream": "~2.3.6", + "setimmediate": "~1.0.4" + } + }, + "node_modules/unzipper/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz", + "integrity": "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vite": { + "version": "5.2.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz", + "integrity": "sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.0.5.tgz", + "integrity": "sha512-LdsW4pxj0Ot69FAoXZ1yTnA9bjGohr2yNBU7QKRxpz8ITSkhuDl6h3zS/tvgz4qrNjeRnvrWeXQ8ZF7Um4W00Q==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.5", + "pathe": "^1.1.2", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-4.3.2.tgz", + "integrity": "sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite-tsconfig-paths/node_modules/tsconfck": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.0.3.tgz", + "integrity": "sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==", + "dev": true, + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.4.47", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", + "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.0", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitest": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.0.5.tgz", + "integrity": "sha512-8GUxONfauuIdeSl5f9GTgVEpg5BTOlplET4WEDaeY2QBiN8wSm68vxN/tb5z405OwppfoCavnwXafiaYBC/xOA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@vitest/expect": "2.0.5", + "@vitest/pretty-format": "^2.0.5", + "@vitest/runner": "2.0.5", + "@vitest/snapshot": "2.0.5", + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "debug": "^4.3.5", + "execa": "^8.0.1", + "magic-string": "^0.30.10", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "tinybench": "^2.8.0", + "tinypool": "^1.0.0", + "tinyrainbow": "^1.2.0", + "vite": "^5.0.0", + "vite-node": "2.0.5", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/node": "^18.0.0 || >=20.0.0", + "@vitest/browser": "2.0.5", + "@vitest/ui": "2.0.5", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest-monocart-coverage": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vitest-monocart-coverage/-/vitest-monocart-coverage-2.1.2.tgz", + "integrity": "sha512-bBH00f6Z+8RHQBHmsmFWjha5+IMQXSFrbt3ackjVdzN/Jz55o96h2tuVoNTtXfoCdbfb6bi9PPB6Mtcx91HvwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/coverage-istanbul": "^2.0.5", + "@vitest/coverage-v8": "^2.0.5", + "monocart-coverage-reports": "^2.10.3" + } + }, + "node_modules/vitest/node_modules/execa": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/vitest/node_modules/get-stream": { + "version": "8.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/human-signals": { + "version": "5.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/vitest/node_modules/is-stream": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/mimic-fn": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/npm-run-path": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/onetime": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/path-key": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vitest/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/vitest/node_modules/strip-final-newline": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz", + "integrity": "sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA==" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==" + }, + "node_modules/vscode-test": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", + "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", + "deprecated": "This package has been renamed to @vscode/test-electron, please update to the new name", + "dev": true, + "dependencies": { + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "rimraf": "^3.0.2", + "unzipper": "^0.10.11" + }, + "engines": { + "node": ">=8.9.3" + } + }, + "node_modules/vscode-uri": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz", + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==" + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true, + "license": "ISC" + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", + "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.91.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.91.0.tgz", + "integrity": "sha512-rzVwlLeBWHJbmgTC/8TvAcu5vpJNII+MelQpylD4jNERPwpBJOE2lEcko1zJX3QJeLjTTAnQxn/OJ8bjDzVQaw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.16.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-cli": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "dev": true, + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-node-externals": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", + "integrity": "sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack/node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/whatwg-url/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dev": true, + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "dev": true + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "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/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/write-json-file": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz", + "integrity": "sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.15", + "make-dir": "^2.1.0", + "pify": "^4.0.1", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.4.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/write-json-file/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/write-json-file/node_modules/write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "node_modules/write-pkg": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz", + "integrity": "sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==", + "dev": true, + "license": "MIT", + "dependencies": { + "sort-keys": "^2.0.0", + "type-fest": "^0.4.1", + "write-json-file": "^3.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/write-pkg/node_modules/type-fest": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz", + "integrity": "sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=6" + } + }, + "node_modules/ws": { + "version": "7.5.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.4", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", + "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoga-layout-prebuilt": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz", + "integrity": "sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g==", + "dev": true, + "dependencies": { + "@types/yoga-layout": "1.9.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-3.3.1.tgz", + "integrity": "sha512-uFzCZz7FQis256dqw4AhPQgD6f3pzNca/Zh62RNELavlumQB3nDIUFbF5JQfFLcMbO1s02Q7Xg/gpcOBlEnYZA==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.18.0" + } + }, + "node_modules/zone.js": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.14.10.tgz", + "integrity": "sha512-YGAhaO7J5ywOXW6InXNlLmfU194F8lVgu7bRntUF3TiG8Y3nBK0x1UJJuHUP/e8IyihkjCYqhCScpSwnlaSRkQ==", + "dev": true + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "packages/angular": { + "name": "@betterer/angular", + "version": "5.4.0", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.0", + "@betterer/errors": "^6.0.0-alpha.0" + }, + "devDependencies": { + "@angular/common": "^18", + "@angular/compiler": "^18", + "@angular/compiler-cli": "^18", + "@angular/core": "^18", + "@angular/platform-browser": "^18", + "@angular/platform-browser-dynamic": "^18", + "rxjs": "^7.8.1", + "zone.js": "^0.14.10" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@angular/compiler": "*", + "@angular/compiler-cli": "*", + "typescript": "*" + } + }, + "packages/betterer": { + "name": "@betterer/betterer", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/constraints": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/reporter": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1", + "@betterer/worker": "^6.0.0-alpha.1", + "chokidar": "^3.6.0", + "core-js": "^3.38.1", + "djb2a": "^2.0.0", + "fast-memoize": "^2.5.2", + "ignore-walk": "^7.0.0", + "lines-and-columns": "^2.0.3", + "minimatch": "^5.0.1", + "prettier": "^3.2.5", + "simple-git": "^3.6.0" + }, + "engines": { + "node": ">=16" + }, + "optionalDependencies": { + "esbuild": "*" + } + }, + "packages/betterer/node_modules/ignore-walk": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz", + "integrity": "sha512-T4gbf83A4NH95zvhVYZc+qWocBBGlpzUXLPGurJggw/WIOwicfXJChLDP/iBZnN5WqROSu5Bm3hhle4z8a8YGQ==", + "dependencies": { + "minimatch": "^9.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "packages/betterer/node_modules/ignore-walk/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "packages/betterer/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/cli": { + "name": "@betterer/cli", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/tasks": "^6.0.0-alpha.1", + "@betterer/worker": "^6.0.0-alpha.1", + "@phenomnomnominal/tsquery": "^6.1.3", + "@phenomnomnominal/tstemplate": "^0.1.0", + "chalk": "^5.3.0", + "commander": "^8.3.0", + "find-up": "^7.0.0", + "prettier": "^3.2.5" + }, + "bin": { + "betterer": "bin/betterer.js" + }, + "engines": { + "node": ">=16" + } + }, + "packages/cli/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/cli/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "packages/cli/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/cli/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/cli/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/cli/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/cli/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "packages/constraints": { + "name": "@betterer/constraints", + "version": "6.0.0-alpha.1", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "packages/coverage": { + "name": "@betterer/coverage", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/constraints": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1" + }, + "devDependencies": { + "@types/istanbul-lib-coverage": "2.0.4" + }, + "engines": { + "node": ">=16" + } + }, + "packages/docgen": { + "name": "doc-plugin-betterer", + "version": "5.3.0", + "license": "MIT", + "dependencies": { + "@microsoft/api-documenter": "^7.25.12", + "dedent": "^0.7.0", + "tslib": "^2.7.0" + }, + "devDependencies": { + "@types/dedent": "^0.7.0" + }, + "engines": { + "node": ">=16" + } + }, + "packages/errors": { + "name": "@betterer/errors", + "version": "6.0.0-alpha.1", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "packages/eslint": { + "name": "@betterer/eslint", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" + }, + "devDependencies": { + "eslint": ">=9.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "packages/extension": { + "name": "betterer-vscode", + "version": "5.4.0", + "dependencies": { + "lodash.debounce": "^4.0.8", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.3", + "vscode-uri": "^3.0.2" + }, + "devDependencies": { + "@betterer/betterer": "^5.4.0", + "@betterer/cli": "^5.4.0", + "@betterer/errors": "^5.3.0", + "@betterer/logger": "^5.3.4", + "@types/jest-cli": "^24.3.0", + "@types/lodash.debounce": "^4.0.6", + "@types/vscode": "^1.62.0", + "jest-cli": "^27.4.3", + "ts-loader": "^9.4.2", + "vscode-test": "^1.6.1", + "webpack": "^5.82.1", + "webpack-cli": "^5.1.1", + "webpack-node-externals": "^3.0.0" + }, + "engines": { + "vscode": "^1.62.0" + } + }, + "packages/extension/node_modules/@betterer/betterer": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@betterer/betterer/-/betterer-5.4.0.tgz", + "integrity": "sha512-t91JDLdUv5t70TPn1rzTiYA2WhtehDV23/KKkePMDo2Q/7QaHyHiTDG40+BnDh9LB7bW0Q4jOZXClf0tupOXNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/constraints": "^5.3.0", + "@betterer/errors": "^5.3.0", + "@betterer/logger": "^5.3.4", + "@betterer/reporter": "^5.4.0", + "@phenomnomnominal/debug": "^0.2.5", + "@phenomnomnominal/worker-require": "^0.0.34", + "chokidar": "^3.3.1", + "djb2a": "^1.2.0", + "fast-memoize": "^2.5.2", + "lines-and-columns": "^2.0.3", + "minimatch": "^5.0.1", + "prettier": "^2.3.2", + "simple-git": "^3.6.0", + "ts-node": "^10.2.1", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "typescript": ">=2.7" + } + }, + "packages/extension/node_modules/@betterer/cli": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@betterer/cli/-/cli-5.4.0.tgz", + "integrity": "sha512-FtXbNLoxsg54w9LQWngXNuGNZj8BHG9qPv6r2Hvr5FYw1ZblAsTW9Vya9NlbOtSxIVrVf/aM9FVTIltTPhFHfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^5.4.0", + "@betterer/errors": "^5.3.0", + "@betterer/render": "^5.3.4", + "@betterer/tasks": "^5.3.6", + "@phenomnomnominal/tsquery": "^4.1.1", + "@phenomnomnominal/tstemplate": "^0.1.0", + "@phenomnomnominal/worker-require": "^0.0.34", + "chalk": "^4.1.2", + "commander": "^8.3.0", + "find-up": "^5.0.0", + "jest-diff": "^27.1.0", + "prettier": "^2.3.2", + "tslib": "^2.3.1" + }, + "bin": { + "betterer": "bin/betterer" + }, + "engines": { + "node": ">=12" + } + }, + "packages/extension/node_modules/@betterer/constraints": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@betterer/constraints/-/constraints-5.3.0.tgz", + "integrity": "sha512-YmaX30/S4PoYDqGspRmUBeBE1KkLbnSQCndqPar7ZH6sWOIo29d67B7as6ODEmwpJf+GGYfmrGtTJd5c69hTng==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12" + } + }, + "packages/extension/node_modules/@betterer/errors": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@betterer/errors/-/errors-5.3.0.tgz", + "integrity": "sha512-Z4uCvA2oSuyEHNgIgMUo+WqIP/xwy40mGmkM/cJXLWWQOTOfzELa5CNgyz4t4XNebojko2bja8n2zaXlTUzViw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "packages/extension/node_modules/@betterer/logger": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@betterer/logger/-/logger-5.3.4.tgz", + "integrity": "sha512-Ns4KsZ5G0F5BsBF8K0VkmAUfEGKhgog9kv8QCKuZQQNcPAX5cESIYSeEs5H4bcMDqsk0dW/sQRt/7rZWGlrFSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.3", + "jest-diff": "^27.0.6", + "lines-and-columns": "^2.0.3", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12" + } + }, + "packages/extension/node_modules/@betterer/render": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/@betterer/render/-/render-5.3.4.tgz", + "integrity": "sha512-zc91zlLxWafGxG25/kUsCDmxLvQhUb4PNIq4MRU/VpnncyhdelMY5OxaIAxu9IXhJFoC6FRJhL3I7eGdND64zQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "packages/extension/node_modules/@betterer/reporter": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@betterer/reporter/-/reporter-5.4.0.tgz", + "integrity": "sha512-+NB/zDkPv4q4oObWhvVpKghskf0K520NIm8rjfoBPAm75Y/PHWh2JSBeTSo6li25HRdvF5wZ+8tIJr1UAennmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^5.4.0", + "@betterer/errors": "^5.3.0", + "@betterer/logger": "^5.3.4", + "@betterer/render": "^5.3.4", + "@betterer/tasks": "^5.3.6", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12" + } + }, + "packages/extension/node_modules/@betterer/tasks": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@betterer/tasks/-/tasks-5.3.6.tgz", + "integrity": "sha512-UBx+My23z/q4deq5WPGNPDO/8OoK7epPpQftgaD8r1UXeD10aaV8BmjQ70Yjw/EQWDqVBBkDdbwmwspMOHjoMA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@betterer/errors": "^5.3.0", + "@betterer/logger": "^5.3.4", + "@betterer/render": "^5.3.4", + "chalk": "^4.1.2", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=12" + } + }, + "packages/extension/node_modules/@phenomnomnominal/tsquery": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-4.2.0.tgz", + "integrity": "sha512-hR2U3uVcrrdkuG30ItQ+uFDs4ncZAybxWG0OjTE8ptPzVoU7GVeXpy+vMU8zX9EbmjGeITPw/su5HjYQyAH8bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.0.1" + }, + "peerDependencies": { + "typescript": "^3 || ^4" + } + }, + "packages/extension/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "packages/extension/node_modules/djb2a": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/djb2a/-/djb2a-1.2.0.tgz", + "integrity": "sha512-rXrJYOPCGvHPYw8R2u/zczFTG3xXNqklrtT17vTPm8n/4a16PKEhrfgMwJ9Zyuz96PJwZzHuK2ChQO/SSChuKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "packages/extension/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" + } + }, + "packages/extension/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/extension/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "packages/extension/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/extension/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/extension/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "packages/extension/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "packages/extension/node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "packages/extension/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "packages/fixture": { + "name": "@betterer/fixture", + "version": "5.4.0", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.0", + "ansi-regex": "^5.0.0" + }, + "devDependencies": { + "core-js": "^3.38.1" + }, + "engines": { + "node": ">=16" + } + }, + "packages/knip": { + "name": "@betterer/knip", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "change-case": "^5.4.4" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "knip": "^5" + } + }, + "packages/logger": { + "name": "@betterer/logger", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.3", + "jest-diff": "^27.0.6", + "lines-and-columns": "^2.0.3" + }, + "devDependencies": { + "@types/babel__code-frame": "^7.0.1" + }, + "engines": { + "node": ">=16" + } + }, + "packages/regexp": { + "name": "@betterer/regexp", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" + }, + "engines": { + "node": ">=16" + } + }, + "packages/render": { + "name": "@betterer/render", + "version": "6.0.0-alpha.1", + "license": "MIT", + "devDependencies": { + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.5", + "@rollup/plugin-typescript": "^11.1.6", + "ink": "^3.0.9", + "ink-link": "^2.0.0", + "ink-text-input": "^4.0.1", + "rollup": "^4.14.3" + }, + "engines": { + "node": ">=16" + } + }, + "packages/reporter": { + "name": "@betterer/reporter", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/tasks": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1" + }, + "engines": { + "node": ">=16" + } + }, + "packages/stylelint": { + "name": "@betterer/stylelint", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" + }, + "devDependencies": { + "@types/stylelint": "^13.13.1", + "stylelint": "^13.11.0", + "stylelint-order": "^4.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "stylelint": "^13.0.0" + } + }, + "packages/tasks": { + "name": "@betterer/tasks", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=16" + } + }, + "packages/tasks/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "packages/time": { + "name": "@betterer/time", + "version": "6.0.0-alpha.1", + "license": "MIT", + "engines": { + "node": ">=16" + } + }, + "packages/tsquery": { + "name": "@betterer/tsquery", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@phenomnomnominal/tsquery": "^6.1.3" + }, + "engines": { + "node": ">=16" + } + }, + "packages/typescript": { + "name": "@betterer/typescript", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "packages/worker": { + "name": "@betterer/worker", + "version": "6.0.0-alpha.1", + "license": "MIT", + "dependencies": { + "@betterer/errors": "^6.0.0-alpha.1", + "callsite": "^1.0.0", + "comlink": "^4.4.1" + }, + "devDependencies": { + "@types/callsite": "^1.0.32" + }, + "engines": { + "node": ">=16" + } + }, + "website": { + "version": "0.0.0", + "extraneous": true, + "dependencies": { + "@algolia/client-search": "^5.2.4", + "@docusaurus/core": "^3.5.2", + "@docusaurus/plugin-client-redirects": "^3.5.2", + "@docusaurus/preset-classic": "^3.5.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-loadable": "^5.5.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.0.0", + "@docusaurus/tsconfig": "^3.0.0", + "@docusaurus/types": "^3.0.0", + "@types/react": "^18.3.5" + } + } + } +} diff --git a/package.json b/package.json index 2c7eedf07..e1a2a8bc6 100644 --- a/package.json +++ b/package.json @@ -5,87 +5,79 @@ "author": "Craig Spence ", "license": "MIT", "description": "Betterer makes it easier to make incremental improvements to your codebase", - "workspaces": { - "packages": [ - "packages/*" - ] - }, + "type": "module", + "workspaces": [ + "packages/*", + "test" + ], "scripts": { - "api": "yarn compile && lerna run api", - "betterer": "node ./packages/cli/bin/betterer", + "api": "npm run compile:packages && lerna run api", + "betterer": "node ./packages/cli/bin/betterer --cache", "betterer:ci": "node ./packages/cli/bin/betterer ci", "betterer:precommit": "node ./packages/cli/bin/betterer precommit --cache", - "build": "yarn compile:packages && yarn test:api && yarn test:dependencies && yarn format && yarn lint && yarn test && yarn test:workers && yarn test:e2e", - "build:ci": "yarn compile:packages && yarn test:api && yarn test:dependencies && yarn format && yarn lint && yarn test && yarn test:workers && yarn betterer:ci", - "build:extension": "lerna run build:extension", - "build:publish": "yarn compile:packages && yarn test:api && yarn test:dependencies && yarn test", - "clean": "yarn clean:tests && yarn clean:compile && yarn clean:modules && yarn clean:rollup", + "build": "npm run compile:packages && npm run test:api && npm run test:dependencies && npm run format && npm run lint && npm run test:e2e && npm run test", + "build:ci": "npm run clean && npm run build && npm run betterer:ci", + "build:extension": "npm run clean && lerna run build:extension", + "build:publish": "npm run clean && npm run api && npm run test:api && npm run test:dependencies && npm run test", + "clean": "npm run clean:tests && npm run clean:compile && npm run clean:modules", "clean:tests": "rimraf fixtures && rimraf reports", - "clean:compile": "lerna exec \"rimraf dist\" && rimraf ./**/tsconfig.tsbuildinfo", - "clean:modules": "lerna exec \"rimraf node_modules\" && rimraf website/node_modules && rimraf node_modules && yarn", + "clean:compile": "lerna exec \"rimraf dist\" && rimraf ./**/tsconfig.tsbuildinfo && npm run clean:rollup", + "clean:modules": "lerna exec \"rimraf node_modules\" && rimraf website/node_modules && rimraf node_modules && npm install", "clean:rollup": "lerna exec \"rimraf .rollup.cache\"", - "commit": "git cz", - "compile": "yarn compile:packages && yarn compile:api-test && yarn compile:dependencies-test", + "compile": "npm run compile:packages && npm run compile:api-test && npm run compile:dependencies-test", "compile:api-test": "tsc -b test/api", "compile:dependencies-test": "tsc -b test/dependencies", - "compile:docs": "yarn api && yarn docs", - "compile:packages": "yarn compile:render && tsc -b packages", + "compile:docs": "npm run api && npm run docs", + "compile:packages": "npm run compile:render && tsc -b packages", "compile:render": "lerna run compile --scope @betterer/render", "compile:watch": "tsc -b packages -w", - "docs": "ts-node ./tools/docs-filter.ts && api-documenter generate -i ./goldens/models -o ./website/docs/api/", - "lint": "eslint \"./packages/**/src/**/*.{js,ts}\" \"./test/**/*.{ts,tsx}\" \"./*.{js,ts}\" --fix", - "format": "prettier \"**/!(*.snap)\" --write --loglevel=error", - "test": "yarn clean:tests && node node_modules/jest-cli/bin/jest.js", - "test:api": "yarn compile:api-test && node ./test/api/dist", - "test:dependencies": "yarn compile:dependencies-test && node ./test/dependencies/dist", - "test:debug": "yarn clean:tests && node --inspect-brk node_modules/jest-cli/bin/jest.js --runInBand --collectCoverage=false", - "test:e2e": "yarn clean:tests && jest --runInBand --config ./jest.e2e.config.js", - "test:workers": "yarn clean:tests && jest --runInBand --config ./jest.workers.config.js", + "docs": "tsx ./tools/docs-filter.ts && api-documenter generate -i ./goldens/models -o ./website/docs/api/", + "lint": "eslint --cache --cache-location \"./node_modules/.cache/eslint/\" --fix", + "format": "prettier \"**/*\" --write --log-level=error", + "format:staged": "prettier --write --log-level=error", + "knip": "knip --no-exit-code --production --strict --tags=-knipignore,-internal", + "test": "npm run clean:tests && vitest --config vitest.config.ts", + "test:e2e": "npm run clean:tests && vitest --config ./vitest.e2e.config.js", + "test:api": "npm run compile:api-test && node ./test/api/dist", + "test:dependencies": "npm run compile:dependencies-test && node ./test/dependencies/dist && npm run knip", "test:extension": "lerna run test:extension", - "prepublishOnly": "yarn run build:publish", + "prepublishOnly": "npm run build:publish", "publish": "lerna publish --conventional-commits --no-commit-hooks --yes", - "prepare": "patch-package && ngcc && husky install" + "prepare": "patch-package && husky" }, "engines": { - "node": ">=16" + "node": ">=18" }, - "types": "test/betterer-public-api.d.ts", "devDependencies": { - "@betterer/cli": "^5.3.6", - "@betterer/regexp": "^5.3.6", - "@commitlint/cli": "^16.2.3", - "@commitlint/config-conventional": "^16.2.1", - "@microsoft/api-documenter": "^7.13.54", - "@microsoft/api-extractor": "^7.18.11", + "@betterer/cli": "./packages/betterer", + "@commitlint/cli": "^19.5.0", + "@commitlint/config-conventional": "^19.5.0", + "@eslint-community/eslint-plugin-eslint-comments": "^4.4.0", + "@eslint/eslintrc": "^3.1.0", + "@eslint/js": "^9.9.1", + "@microsoft/api-extractor": "^7.47.7", "@phenomnomnominal/commitlint-plugin": "^1.1.1", - "@types/eslint": "^7.28.0", - "@types/jest": "^27.0.1", - "@types/node": "^17.0.23", - "@typescript-eslint/eslint-plugin": "^5.16.0", - "@typescript-eslint/parser": "^5.16.0", - "cz-conventional-changelog": "^3.3.0", - "dependency-check": "^4.1.0", - "eslint": "^7.32.0", - "eslint-config-prettier": "^8.1.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-require-extensions": "^0.1.3", - "eslint-plugin-import": "^2.27.5", - "eslint-plugin-jest": "^24.4.0", + "@types/eslint": "^9.6.1", + "@types/ignore-walk": "^4.0.3", + "@types/node": "^18.19.50", + "@vitest/ui": "^2.0.5", + "eslint": "^9.9.1", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-prettier": "^4.0.0", - "husky": "^7.0.4", - "jest": "^27.0.4", - "lerna": "^6.6.2", - "lint-staged": ">=11.1.2", + "eslint-plugin-require-extensions": "^0.1.3", + "globals": "^15.9.0", + "husky": "^9.1.5", + "knip": "^5.29.2", + "lerna": "^8.1.9", + "lint-staged": "^15.2.10", "patch-package": "^8.0.0", - "prettier": "^2.2.1", - "ts-jest": "^27.0.5", - "ts-node": "^10.2.1", - "typescript": "^4.4.2" - }, - "config": { - "commitizen": { - "path": "cz-conventional-changelog" - } + "prettier": "^3.2.5", + "tsx": "^4.19.2", + "typescript": "^5.5.4", + "typescript-eslint": "^8.4.0", + "vite": "^5.2.9", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^2.0.5", + "vitest-monocart-coverage": "^2.1.2" } -} +} \ No newline at end of file diff --git a/packages/angular/package.json b/packages/angular/package.json index d651e4482..677e0b8a0 100644 --- a/packages/angular/package.json +++ b/packages/angular/package.json @@ -8,6 +8,7 @@ }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,26 +26,25 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "tslib": "^2.3.1" + "@betterer/betterer": "^6.0.0-alpha.0", + "@betterer/errors": "^6.0.0-alpha.0" }, "devDependencies": { - "@angular/common": "^12.1.0", - "@angular/compiler": "^12.1.0", - "@angular/compiler-cli": "^12.1.0", - "@angular/core": "^12.1.0", - "@angular/platform-browser": "^12.1.0", - "@angular/platform-browser-dynamic": "^12.1.0", - "rxjs": "^7.1.0", - "zone.js": "^0.11.4" + "@angular/common": "^18", + "@angular/compiler": "^18", + "@angular/compiler-cli": "^18", + "@angular/core": "^18", + "@angular/platform-browser": "^18", + "@angular/platform-browser-dynamic": "^18", + "rxjs": "^7.8.1", + "zone.js": "^0.14.10" }, "peerDependencies": { "@angular/compiler": "*", "@angular/compiler-cli": "*", "typescript": "*" } -} +} \ No newline at end of file diff --git a/packages/angular/src/angular.ts b/packages/angular/src/angular.ts index 6fbf8190d..5b743dd31 100644 --- a/packages/angular/src/angular.ts +++ b/packages/angular/src/angular.ts @@ -1,18 +1,19 @@ import type { CompilerOptions } from '@angular/compiler-cli'; -import type { DiagnosticWithLocation } from 'typescript'; import { performCompilation, readConfiguration } from '@angular/compiler-cli'; -import { BettererFileTest } from '@betterer/betterer'; +import { BettererFileTest, BettererCacheStrategy } from '@betterer/betterer'; import { BettererError } from '@betterer/errors'; -import { flattenDiagnosticMessageText } from 'typescript'; +import ts from 'typescript'; + +const NEW_LINE = '\n'; /** * @public Use this test to incrementally introduce {@link https://angular.io/guide/angular-compiler-options | **Angular** compiler configuration } * to your codebase. * * @remarks {@link angular | `angular`} is a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, - * so you can use {@link @betterer/betterer#BettererFileTest.include | `include()`}, {@link @betterer/betterer#BettererFileTest.exclude | `exclude()`}, - * {@link @betterer/betterer#BettererFileTest.only | `only()`}, and {@link @betterer/betterer#BettererFileTest.skip | `skip()`}. + * so you can use {@link @betterer/betterer#BettererResolverTest.include | `include()`}, {@link @betterer/betterer#BettererResolverTest.exclude | `exclude()`}, + * {@link @betterer/betterer#BettererTest.only | `only()`}, and {@link @betterer/betterer#BettererTest.skip | `skip()`}. * * @example * ```typescript @@ -35,11 +36,20 @@ import { flattenDiagnosticMessageText } from 'typescript'; * Will throw if the user doesn't pass `configFilePath` or `extraCompilerOptions`. */ export function angular(configFilePath: string, extraCompilerOptions: CompilerOptions): BettererFileTest { - if (!configFilePath) { + // The `angular` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `configFilePath?: string`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (configFilePath == null || !configFilePath) { throw new BettererError( "For `@betterer/angular` to work, you need to provide the path to a tsconfig.json file, e.g. `'./tsconfig.json'`. ❌" ); } + + // The `angular` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `extraCompilerOptions?: CompilerOptions`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! if (!extraCompilerOptions) { throw new BettererError( 'For `@betterer/angular` to work, you need to provide compiler options, e.g. `{ strictTemplates: true }`. ❌' @@ -47,7 +57,11 @@ export function angular(configFilePath: string, extraCompilerOptions: CompilerOp } // Always has to do the full compile since a .component.html file needs to know about the module it lives in: - return new BettererFileTest((_, fileTestResult, resolver) => { + return new BettererFileTest((filePaths, fileTestResult, resolver) => { + if (filePaths.length === 0) { + return; + } + const absoluteConfigFilePath = resolver.resolve(configFilePath); const { rootNames, options } = readConfiguration(absoluteConfigFilePath, extraCompilerOptions); @@ -57,12 +71,23 @@ export function angular(configFilePath: string, extraCompilerOptions: CompilerOp options }); - diagnostics.forEach((diagnostic) => { - const { file, start, length } = diagnostic as DiagnosticWithLocation; - const { fileName } = file; - const result = fileTestResult.addFile(fileName, file.getFullText()); - const message = flattenDiagnosticMessageText(diagnostic.messageText, '\n'); - result.addIssue(start, start + length, message); - }); - }); + diagnostics + .filter((diagnostic): diagnostic is ts.DiagnosticWithLocation => { + const { file, start, length } = diagnostic; + return file != null && start != null && length != null; + }) + .filter(({ file }) => filePaths.includes(file.fileName)) + .forEach(({ file, start, length, source, messageText }) => { + const { fileName } = file; + const resultFile = fileTestResult.addFile(fileName, file.getFullText()); + const message = ts.flattenDiagnosticMessageText(messageText, NEW_LINE); + resultFile.addIssue(start, start + length, angularIssueMessage(source, message)); + }); + }).cache(BettererCacheStrategy.FilePaths); +} + +function angularIssueMessage(source = 'ng', message: string) { + let issueMessage = source ? `${source}: ` : ''; + issueMessage = `${issueMessage}${message}`; + return issueMessage; } diff --git a/packages/betterer/CHANGELOG.md b/packages/betterer/CHANGELOG.md index c0734ce9b..8306fea5a 100644 --- a/packages/betterer/CHANGELOG.md +++ b/packages/betterer/CHANGELOG.md @@ -3,6 +3,45 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/betterer + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) +* **betterer 🐛:** handle -1 column fixes [#1202](https://github.com/phenomnomnominal/betterer/issues/1202) ([#1214](https://github.com/phenomnomnominal/betterer/issues/1214)) ([d26c395](https://github.com/phenomnomnominal/betterer/commit/d26c3958219a87168d21afbca53656fb0082d109)) +* **betterer 🐛:** handles more paths in results file, and some TypeScript error message fun ([#1226](https://github.com/phenomnomnominal/betterer/issues/1226)) ([ae555e6](https://github.com/phenomnomnominal/betterer/commit/ae555e60eb20b4d3f8ca7625d34e0eda210da011)) +* **betterer 🐛:** just use the string as the memoize key ([#1225](https://github.com/phenomnomnominal/betterer/issues/1225)) ([d897782](https://github.com/phenomnomnominal/betterer/commit/d8977824c2c66190d233dbf773aaf6294c3389d4)) +* **betterer 🐛:** remove printed from api ([#1233](https://github.com/phenomnomnominal/betterer/issues/1233)) ([e452b5e](https://github.com/phenomnomnominal/betterer/commit/e452b5e32358af2fc1c9f42684161f4990f17f9f)) + + +* feat(betterer ✨)!: allow cache in CI mode (#1218) ([8cf8207](https://github.com/phenomnomnominal/betterer/commit/8cf8207ff3e23c7fd439b067e2c2981c0e4fae44)), closes [#1218](https://github.com/phenomnomnominal/betterer/issues/1218) [#1164](https://github.com/phenomnomnominal/betterer/issues/1164) + + +### Features + +* **beterer ✨:** make logo optional ([#1137](https://github.com/phenomnomnominal/betterer/issues/1137)) ([b3d9cac](https://github.com/phenomnomnominal/betterer/commit/b3d9cac3633aa2e6365f196d06e4acd5937d4dbe)) +* **betterer ✨:** no more git hashes for cache ([#1228](https://github.com/phenomnomnominal/betterer/issues/1228)) ([1b117d7](https://github.com/phenomnomnominal/betterer/commit/1b117d7fb3326defe5ae4dc7d16074fc2c42976e)) +* **betterer ✨:** no more weird completed then new tests ([#1213](https://github.com/phenomnomnominal/betterer/issues/1213)) ([da704f2](https://github.com/phenomnomnominal/betterer/commit/da704f2e91b3b26a7f1cd6953a21bd623b3cb9c8)) +* **betterer ✨:** specify different cache strategies ([#1232](https://github.com/phenomnomnominal/betterer/issues/1232)) ([df77035](https://github.com/phenomnomnominal/betterer/commit/df7703537910c320c0444e26582e8436947ff00d)) + + +### BREAKING CHANGES + +* ci: true no longer disables the cache + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) **Note:** Version bump only for package @betterer/betterer diff --git a/packages/betterer/LICENSE.md b/packages/betterer/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/betterer/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/betterer/api-extractor.json b/packages/betterer/api-extractor.json index dae7b1544..6923858f4 100644 --- a/packages/betterer/api-extractor.json +++ b/packages/betterer/api-extractor.json @@ -4,7 +4,7 @@ "messages": { "extractorMessageReporting": { - // We add a suffix __ instead + // We add a suffix Δ instead "ae-internal-missing-underscore": { "logLevel": "none", "addToApiReportFile": false diff --git a/packages/betterer/package.json b/packages/betterer/package.json index 0c63066ab..b39f1dfaf 100644 --- a/packages/betterer/package.json +++ b/packages/betterer/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/betterer", - "description": "Main engine for runing betterer tests", - "version": "5.4.0", + "description": "Main engine for running betterer tests", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,30 +26,27 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/constraints": "^5.3.0", - "@betterer/errors": "^5.3.0", - "@betterer/logger": "^5.3.4", - "@betterer/reporter": "^5.4.0", - "@betterer/time": "^5.3.4", - "@betterer/worker": "^5.3.4", - "@phenomnomnominal/debug": "^0.2.5", - "chokidar": "^3.3.1", - "djb2a": "^1.2.0", + "@betterer/constraints": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/reporter": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1", + "@betterer/worker": "^6.0.0-alpha.1", + "chokidar": "^3.6.0", + "core-js": "^3.38.1", + "djb2a": "^2.0.0", "fast-memoize": "^2.5.2", + "ignore-walk": "^7.0.0", "lines-and-columns": "^2.0.3", "minimatch": "^5.0.1", - "prettier": "^2.3.2", - "simple-git": "^3.6.0", - "ts-node": "^10.2.1", - "tslib": "^2.3.1" + "prettier": "^3.2.5", + "simple-git": "^3.6.0" }, "optionalDependencies": { - "typescript": ">=2.7" + "esbuild": "*" }, - "devDependencies": { - "@types/prettier": "^2.3.2" - } + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/betterer/src/api/betterer.ts b/packages/betterer/src/api/betterer.ts new file mode 100644 index 000000000..c8828ffcf --- /dev/null +++ b/packages/betterer/src/api/betterer.ts @@ -0,0 +1,33 @@ +import type { BettererSuiteSummary } from '../suite/index.js'; +import type { BettererOptions } from './types.js'; + +import { BettererRunnerΩ } from '../runner/index.js'; +import { merge } from './merge.js'; +import { results } from './results.js'; +import { runner } from './runner.js'; +import { watch } from './watch.js'; + +/** + * @public Run **Betterer** with the given options. + * + * @example + * ```typescript + * import { betterer } from '@betterer/betterer'; + * + * const suiteSummary = await betterer(options); + * ``` + * + * @param options - Options for running **Betterer**. + * @throws {@link @betterer/errors#BettererError | `BettererError` } + * Will throw if something goes wrong while running **Betterer**. + */ +export const betterer = async function betterer(options: BettererOptions = {}): Promise { + const runner = await BettererRunnerΩ.create(options); + const contextSummary = await runner.run(); + return contextSummary.lastSuite; +}; + +betterer.merge = merge; +betterer.results = results; +betterer.runner = runner; +betterer.watch = watch; diff --git a/packages/betterer/src/api/index.ts b/packages/betterer/src/api/index.ts new file mode 100644 index 000000000..746821de6 --- /dev/null +++ b/packages/betterer/src/api/index.ts @@ -0,0 +1,13 @@ +export type { + BettererAPI, + BettererOptions, + BettererOptionsResults, + BettererOptionsRunner, + BettererOptionsWatch +} from './types.js'; + +export { betterer } from './betterer.js'; +export { merge } from './merge.js'; +export { results } from './results.js'; +export { runner } from './runner.js'; +export { watch } from './watch.js'; diff --git a/packages/betterer/src/api/merge.ts b/packages/betterer/src/api/merge.ts new file mode 100644 index 000000000..8c0961647 --- /dev/null +++ b/packages/betterer/src/api/merge.ts @@ -0,0 +1,27 @@ +import type { BettererOptionsMerge } from '../results/index.js'; + +import { BettererResultsMergerΩ } from '../results/index.js'; + +/** + * @public Resolve any merge conflicts in the specified results file. + * + * @example + * ```typescript + * import { betterer } from '@betterer/betterer'; + * + * await betterer.merge(options); + * ``` + * + * @param options - Options for merging conflicts in the results file. + * @throws {@link @betterer/errors#BettererError | `BettererError` } + * Will throw if something goes wrong while merging conflicts in the results file. + */ +export async function merge(options: BettererOptionsMerge = {}): Promise { + try { + const merger = await BettererResultsMergerΩ.create(options); + await merger.merge(); + } catch (error) { + process.exitCode = 1; + throw error; + } +} diff --git a/packages/betterer/src/api/results.ts b/packages/betterer/src/api/results.ts new file mode 100644 index 000000000..06e8fc046 --- /dev/null +++ b/packages/betterer/src/api/results.ts @@ -0,0 +1,32 @@ +import type { BettererResultsSummary } from '../results/index.js'; +import type { BettererOptionsResults } from './types.js'; + +import { BettererResultsSummaryΩ } from '../results/index.js'; +import { createGlobals } from '../globals.js'; + +/** + * @public Get a summary of the results of the defined {@link @betterer/betterer#BettererTest | `BettererTest`s}. + * + * **Betterer** will read the {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file } + * and the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file} and return a summary of the results. + * + * @example + * ```typescript + * import { betterer } from '@betterer/betterer'; + * + * const resultsSummary = await betterer.results(options); + * ``` + * + * @param options - Options for getting the summary of the results. + * @throws {@link @betterer/errors#BettererError | `BettererError` } + * Will throw if something goes wrong while getting the summary of the results. + */ +export async function results(options: BettererOptionsResults = {}): Promise { + try { + await createGlobals(options); + return await BettererResultsSummaryΩ.create(); + } catch (error) { + process.exitCode = 1; + throw error; + } +} diff --git a/packages/betterer/src/api/runner.ts b/packages/betterer/src/api/runner.ts new file mode 100644 index 000000000..80f99b233 --- /dev/null +++ b/packages/betterer/src/api/runner.ts @@ -0,0 +1,22 @@ +import type { BettererRunner } from '../runner/index.js'; +import type { BettererOptionsRunner } from './types.js'; + +import { BettererRunnerΩ } from '../runner/index.js'; + +/** + * @public Create a **BettererRunner** with the given options. + * + * @example + * ```typescript + * import { betterer } from '@betterer/betterer'; + * + * const runner = await betterer.runner(options); + * ``` + * + * @param options - Options for creating the runner. + * @throws {@link @betterer/errors#BettererError | `BettererError` } + * Will throw if something goes wrong while creating the runner. + */ +export function runner(options: BettererOptionsRunner = {}): Promise { + return BettererRunnerΩ.create(options); +} diff --git a/packages/betterer/src/api/types.ts b/packages/betterer/src/api/types.ts new file mode 100644 index 000000000..2f5cc629f --- /dev/null +++ b/packages/betterer/src/api/types.ts @@ -0,0 +1,49 @@ +import type { BettererOptionsContext, BettererOptionsMode, BettererOptionsModeWatch } from '../context/index.js'; +import type { BettererOptionsFS, BettererOptionsWatcher } from '../fs/index.js'; +import type { BettererOptionsReporter } from '../reporters/index.js'; +import type { betterer } from './betterer.js'; + +/** + * @public Public API for **Betterer**. The types are a bit funky, but it's nice to + * have the base `betterer()` function with the more specific functions attached. + */ +export type BettererAPI = typeof betterer; + +/** + * @public Options for when you run **Betterer** via the {@link @betterer/betterer#betterer | `betterer()` API}. + * + * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export type BettererOptions = BettererOptionsContext & + BettererOptionsFS & + BettererOptionsMode & + BettererOptionsReporter; + +/** + * @public Options for when you create a {@link @betterer/betterer#BettererRunner | `BettererRunner` } + * via the {@link @betterer/betterer#runner | `betterer.runner()` JS API}. + * + * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export type BettererOptionsRunner = BettererOptions; + +/** + * @public Options for when you create a {@link @betterer/betterer#BettererResultsSummary | `BettererResultsSummary` } + * via the {@link @betterer/betterer#results | `betterer.results()` API}. + * + * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export type BettererOptionsResults = Pick & + Pick; + +/** + * @public Options for when you create a {@link @betterer/betterer#BettererRunner | `BettererRunner` } + * via the {@link @betterer/betterer#watch | `betterer.watch()` JS API}. + * + * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export type BettererOptionsWatch = BettererOptionsContext & + BettererOptionsFS & + BettererOptionsModeWatch & + BettererOptionsReporter & + BettererOptionsWatcher; diff --git a/packages/betterer/src/api/watch.ts b/packages/betterer/src/api/watch.ts new file mode 100644 index 000000000..826aad55b --- /dev/null +++ b/packages/betterer/src/api/watch.ts @@ -0,0 +1,25 @@ +import type { BettererRunner } from '../runner/index.js'; +import type { BettererOptionsWatch } from './types.js'; + +import { BettererRunnerΩ } from '../runner/index.js'; + +/** + * @public Create a **BettererRunner** with the given options. Also starts up a file watcher + * for tracked files in the current working directory. + * + * @example + * ```typescript + * import { betterer } from '@betterer/betterer'; + * + * const runner = await betterer.watch(options); + * ``` + * + * @param options - Options for creating the runner. + * @throws {@link @betterer/errors#BettererError | `BettererError` } + * Will throw if something goes wrong while creating the runner or watcher. + */ +export function watch(options: BettererOptionsWatch = {}): Promise { + const { ignores } = options; + delete options.ignores; + return BettererRunnerΩ.create({ ...options }, { ignores, watch: true }); +} diff --git a/packages/betterer/src/betterer.ts b/packages/betterer/src/betterer.ts deleted file mode 100644 index 95414798e..000000000 --- a/packages/betterer/src/betterer.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { debug } from '@phenomnomnominal/debug'; - -import type { - BettererOptionsRunner, - BettererOptionsStart, - BettererOptionsResults, - BettererOptionsWatch, - BettererOptionsMerge -} from './config/index.js'; -import type { BettererRunner } from './runner/index.js'; -import type { BettererResultsSummary } from './results/index.js'; -import type { BettererSuiteSummary } from './suite/index.js'; - -import { BettererRunnerΩ } from './runner/index.js'; -import { BettererMergerΩ, BettererResultsSummaryΩ } from './results/index.js'; - -/** - * @public Run **Betterer** with the given options. - * - * @example - * ```typescript - * import { betterer } from '@betterer/betterer'; - * - * const suiteSummary = await betterer(options); - * ``` - * - * @param options - Options for running **Betterer**. - * @throws {@link @betterer/errors#BettererError | `BettererError` } - * Will throw if something goes wrong while running **Betterer**. - */ -export async function betterer(options: BettererOptionsStart = {}): Promise { - initDebug(); - const runner = await BettererRunnerΩ.create(options); - return await runner.run(); -} - -/** - * @public Resolve any merge conflicts in the specified results file. - * - * @example - * ```typescript - * import { betterer } from '@betterer/betterer'; - * - * await betterer.merge(options); - * ``` - * - * @param options - Options for merging conflicts in the results file. - * @throws {@link @betterer/errors#BettererError | `BettererError` } - * Will throw if something goes wrong while merging conflicts in the results file. - */ -export async function merge(options: BettererOptionsMerge = {}): Promise { - const merger = await BettererMergerΩ.create(options); - return await merger.merge(); -} -betterer.merge = merge; - -/** - * @public Get a summary of the results of the defined {@link @betterer/betterer#BettererTest | `BettererTest`s}. - * - * **Betterer** will read the {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file } - * and the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file} and return a summary of the results. - * - * @example - * ```typescript - * import { betterer } from '@betterer/betterer'; - * - * const resultsSummary = await betterer.results(options); - * ``` - * - * @param options - Options for getting the summary of the results. - * @throws {@link @betterer/errors#BettererError | `BettererError` } - * Will throw if something goes wrong while getting the summary of the results. - */ -export function results(options: BettererOptionsResults = {}): Promise { - initDebug(); - return BettererResultsSummaryΩ.create(options); -} -betterer.results = results; - -/** - * @public Create a **BettererRunner** with the given options. - * - * @example - * ```typescript - * import { betterer } from '@betterer/betterer'; - * - * const runner = await betterer.runner(options); - * ``` - * - * @param options - Options for creating the runner. - * @throws {@link @betterer/errors#BettererError | `BettererError` } - * Will throw if something goes wrong while creating the runner. - */ -export function runner(options: BettererOptionsRunner = {}): Promise { - initDebug(); - return BettererRunnerΩ.create(options); -} -betterer.runner = runner; - -/** - * @public Create a **BettererRunner** with the given options. Also starts up a file watcher - * for tracked files in the current working directory. - * - * @example - * ```typescript - * import { betterer } from '@betterer/betterer'; - * - * const runner = await betterer.watch(options); - * ``` - * - * @param options - Options for creating the runner. - * @throws {@link @betterer/errors#BettererError | `BettererError` } - * Will throw if something goes wrong while creating the runner or watcher. - */ -export function watch(options: BettererOptionsWatch = {}): Promise { - initDebug(); - return BettererRunnerΩ.create({ ...options, watch: true }); -} -betterer.watch = watch; - -function initDebug(): void { - const enabled = !!process.env.BETTERER_DEBUG; - if (enabled) { - debug({ - header: 'betterer', - include: [/@betterer\//], - ignore: [require.resolve('./utils'), require.resolve('./register')], - enabled, - time: !!process.env.BETTERER_DEBUG_TIME, - values: !!process.env.BETTERER_DEBUG_VALUES, - logPath: process.env.BETTERER_DEBUG_LOG - }); - } -} diff --git a/packages/betterer/src/config/cast.ts b/packages/betterer/src/config/cast.ts new file mode 100644 index 000000000..1aea19ba5 --- /dev/null +++ b/packages/betterer/src/config/cast.ts @@ -0,0 +1,9 @@ +import { isString, isUndefined } from '../utils.js'; + +export function toArray(value?: ReadonlyArray | Array | T): Array { + return Array.isArray(value) ? value : isUndefined(value) ? [] : [value as T]; +} + +export function toRegExps(value: ReadonlyArray): ReadonlyArray { + return value.map((v: string | RegExp) => (isString(v) ? new RegExp(v, 'i') : v)); +} diff --git a/packages/betterer/src/config/config.ts b/packages/betterer/src/config/config.ts deleted file mode 100644 index b25086d42..000000000 --- a/packages/betterer/src/config/config.ts +++ /dev/null @@ -1,337 +0,0 @@ -import type { BettererVersionControlWorker } from '../fs/index.js'; -import type { BettererReporter } from '../reporters/index.js'; -import type { - BettererConfig, - BettererConfigBase, - BettererConfigMerge, - BettererConfigStart, - BettererConfigWatch, - BettererOptionsAll, - BettererOptionsBase, - BettererOptionsMerge, - BettererOptionsOverride, - BettererOptionsStart, - BettererOptionsWatch, - BettererWorkerRunConfig -} from './types.js'; - -import { BettererError } from '@betterer/errors'; -import assert from 'node:assert'; -import os from 'node:os'; -import path from 'node:path'; - -import { read } from '../fs/index.js'; -import { registerExtensions } from './register.js'; -import { loadReporters, loadSilentReporter } from '../reporters/index.js'; -import { isBoolean, isNumber, isRegExp, isString, isUndefined } from '../utils.js'; - -const TOTAL_CPUS = os.cpus().length; - -export async function createConfig( - options: BettererOptionsAll = {}, - versionControl: BettererVersionControlWorker -): Promise { - const tsconfigPath = resolveTsConfigPath(options as BettererOptionsBase); - await registerExtensions(tsconfigPath); - - const baseConfig = await createBaseConfig(options as BettererOptionsBase, tsconfigPath, versionControl); - const startConfig = createStartConfig(options as BettererOptionsStart); - const watchConfig = createWatchConfig(options as BettererOptionsWatch); - - const config = { ...baseConfig, ...startConfig, ...watchConfig }; - - modeConfig(config); - - if (config.tsconfigPath) { - await validateFilePath({ tsconfigPath: config.tsconfigPath }); - } - - return config; -} - -export function overrideConfig(config: BettererConfig, optionsOverride: BettererOptionsOverride): void { - if (optionsOverride.filters) { - validateStringRegExpArray({ filters: optionsOverride.filters }); - config.filters = toRegExps(toArray(optionsOverride.filters)); - } - - if (optionsOverride.ignores) { - validateStringArray({ ignores: optionsOverride.ignores }); - config.ignores = toArray(optionsOverride.ignores); - } - - if (optionsOverride.reporters) { - const reporters = toArray(optionsOverride.reporters); - config.reporter = loadReporters(reporters, config.cwd); - } -} - -function resolveTsConfigPath(options: BettererOptionsBase): string | null { - const cwd = options.cwd || process.cwd(); - const tsconfigPath = options.tsconfigPath || null; - return tsconfigPath ? path.resolve(cwd, tsconfigPath) : null; -} - -async function createBaseConfig( - options: BettererOptionsBase, - tsconfigPath: string | null, - versionControl: BettererVersionControlWorker -): Promise { - const cwd = options.cwd || process.cwd(); - const configPaths = options.configPaths ? toArray(options.configPaths) : ['./.betterer']; - - validateStringArray({ configPaths }); - - const isDebug = !!process.env.BETTERER_DEBUG; - const cache = !!options.cachePath || options.cache || false; - const cachePath = options.cachePath || './.betterer.cache'; - const filters = toRegExps(toArray(options.filters)); - const logo = options.logo || false; - const reporters = toArray(options.reporters); - const silent = isDebug || options.silent || false; - const reporter = silent ? loadSilentReporter() : loadReporters(reporters, cwd); - const resultsPath = options.resultsPath || './.betterer.results'; - - validateBool({ cache }); - validateString({ cachePath }); - validateString({ cwd }); - validateStringRegExpArray({ filters }); - validateBool({ logo }); - validateString({ resultsPath }); - validateBool({ silent }); - const workers = validateWorkers(options); - - const validatedConfigPaths = validateConfigPaths(cwd, configPaths); - const versionControlPath = await versionControl.api.init(validatedConfigPaths, cwd); - - return { - cache, - cachePath: path.resolve(cwd, cachePath), - cwd, - configPaths: validatedConfigPaths, - filters, - logo, - reporter, - resultsPath: path.resolve(cwd, resultsPath), - tsconfigPath, - versionControlPath, - workers - }; -} - -export async function createMergeConfig(options: BettererOptionsMerge): Promise { - const contents = toArray(options.contents); - const cwd = options.cwd || process.cwd(); - const resultsPath = path.resolve(cwd, options.resultsPath || './.betterer.results'); - - validateStringArray({ contents }); - await validateFilePath({ resultsPath }); - - return { - contents, - resultsPath: path.resolve(cwd, resultsPath) - }; -} - -export async function createWorkerConfig(config: BettererWorkerRunConfig): Promise { - await registerExtensions(config.tsconfigPath); - - return { - ...config, - reporter: loadSilentReporter(), - workers: 1 - }; -} - -function createStartConfig(options: BettererOptionsStart): BettererConfigStart { - const ci = options.ci || false; - const excludes = toRegExps(toArray(options.excludes)) || []; - const includes = toArray(options.includes) || []; - const precommit = options.precommit || false; - const strict = options.strict || false; - const update = options.update || false; - - validateBool({ ci }); - validateStringRegExpArray({ excludes }); - validateStringArray({ includes }); - validateBool({ precommit }); - validateBool({ strict }); - validateBool({ update }); - - return { - ci, - excludes, - includes, - precommit, - strict, - update - }; -} - -function createWatchConfig(options: BettererOptionsWatch): BettererConfigWatch { - const ignores = toArray(options.ignores); - const watch = options.watch || false; - - validateStringArray({ ignores }); - validateBool({ watch }); - - return { - ignores, - watch - }; -} - -function modeConfig(config: BettererConfig) { - // CI mode: - if (config.ci) { - config.precommit = false; - config.strict = true; - config.update = false; - config.watch = false; - return; - } - // Precommit mode: - if (config.precommit) { - config.ci = false; - config.strict = true; - config.update = false; - config.watch = false; - return; - } - // Strict mode: - if (config.strict) { - config.ci = false; - config.precommit = false; - config.update = false; - config.watch = false; - return; - } - // Update mode: - if (config.update) { - config.ci = false; - config.precommit = false; - config.strict = false; - config.watch = false; - return; - } - // Watch mode: - if (config.watch) { - config.ci = false; - config.precommit = false; - config.strict = true; - config.update = false; - return; - } -} - -function validateBool(config: Config): void { - const [propertyName] = Object.keys(config); - const value = config[propertyName as PropertyName]; - validate(isBoolean(value), `"${propertyName.toString()}" must be \`true\` or \`false\`. ${received(value)}`); -} - -function validateNumber(config: Config): void { - const [propertyName] = Object.keys(config); - const value = config[propertyName as PropertyName]; - validate(isNumber(value), `"${propertyName.toString()}" must be a number. ${received(value)}`); -} - -function validateString(config: Config): void { - const [propertyName] = Object.keys(config); - const value = config[propertyName as PropertyName]; - validate(isString(value), `"${propertyName.toString()}" must be a string. ${received(value)}`); -} - -function validateStringOrArray(config: Config): void { - const [propertyName] = Object.keys(config); - const value = config[propertyName as PropertyName]; - validate( - isString(value) || Array.isArray(value), - `"${propertyName.toString()}" must be a string or an array. ${received(value)}` - ); -} - -function validateStringArray(config: Config): void { - const [propertyName] = Object.keys(config); - const value = config[propertyName as PropertyName]; - validateStringOrArray(config); - validate( - !Array.isArray(value) || value.every((item) => isString(item)), - `"${propertyName.toString()}" must be an array of strings. ${received(value)}` - ); -} - -function validateStringRegExpArray(config: Config): void { - const [propertyName] = Object.keys(config); - const value = config[propertyName as PropertyName]; - validateStringOrArray(config); - validate( - !Array.isArray(value) || value.every((item) => isString(item) || isRegExp(item)), - `"${propertyName.toString()}" must be an array of strings or RegExps. ${received(value)}` - ); -} - -function validateConfigPaths(cwd: string, configPaths: Array): Array { - return configPaths.map((configPath) => { - const absoluteConfigPath = path.resolve(cwd, configPath); - try { - return require.resolve(absoluteConfigPath); - } catch (error) { - throw new BettererError(`could not find config file at "${absoluteConfigPath}". 😔`, error as Error); - } - }); -} - -async function validateFilePath( - config: Config -): Promise { - const [propertyName] = Object.keys(config); - const value = config[propertyName as PropertyName]; - validate( - value == null || (isString(value) && (await read(value)) !== null), - `"${propertyName.toString()}" must be a path to a file. ${received(value)}` - ); -} - -function validateWorkers(options: BettererOptionsBase = {}): number { - if (options.workers === true || isUndefined(options.workers)) { - options.workers = TOTAL_CPUS >= 4 ? TOTAL_CPUS - 2 : false; - } - if (options.workers === false || options.workers === 0) { - // When disabled, set workers to 1 so that the BettererWorkerPool - // can be instantiated correctly: - options.workers = 1; - } - - const { workers } = options; - - validateNumber({ workers }); - validate( - isNumber(workers) && workers > 0 && workers <= TOTAL_CPUS, - `"workers" must be more than zero and not more than the number of available CPUs (${TOTAL_CPUS}). To disable workers, set to \`false\`. ${received( - workers - )}` - ); - return workers; -} - -function validate(value: unknown, message: string): asserts value is boolean { - // Wrap the AssertionError in a BettererError for logging: - try { - assert(value); - } catch { - throw new BettererError(message); - } -} - -function received(value: unknown): string { - return `Received \`${JSON.stringify(value)}\`.`; -} - -function toArray(value?: ReadonlyArray | Array | T): Array { - return Array.isArray(value) ? value : isUndefined(value) ? [] : [value as T]; -} - -function toRegExps(value: ReadonlyArray): ReadonlyArray { - return value.map((v: string | RegExp) => (isString(v) ? new RegExp(v, 'i') : v)); -} diff --git a/packages/betterer/src/config/index.ts b/packages/betterer/src/config/index.ts index 0d22440c9..bb9b42d40 100644 --- a/packages/betterer/src/config/index.ts +++ b/packages/betterer/src/config/index.ts @@ -1,34 +1,12 @@ -export { createConfig, createMergeConfig, createWorkerConfig, overrideConfig } from './config.js'; +export type { BettererConfig, BettererOptionsOverride } from './types.js'; + +export { toArray, toRegExps } from './cast.js'; export { - BettererConfig, - BettererConfigBase, - BettererConfigMerge, - BettererConfigStart, - BettererConfigWatch, - BettererConfigExcludes, - BettererConfigFilters, - BettererConfigIgnores, - BettererConfigIncludes, - BettererConfigPaths, - BettererOptionsAll, - BettererOptionsBase, - BettererOptionsExcludes, - BettererOptionsFilters, - BettererOptionsIgnores, - BettererOptionsIncludes, - BettererOptionsMerge, - BettererOptionsOverride, - BettererOptionsPaths, - BettererOptionsReporters, - BettererOptionsResults, - BettererOptionsRunner, - BettererOptionsStartBase, - BettererOptionsStartCI, - BettererOptionsStartDefault, - BettererOptionsStartPrecommit, - BettererOptionsStartStrict, - BettererOptionsStartUpdate, - BettererOptionsStart, - BettererOptionsWatch, - BettererWorkerRunConfig -} from './types.js'; + validateBool, + validateDirectory, + validateFilePath, + validateString, + validateStringArray, + validateStringRegExpArray, + validateWorkers +} from './validate.js'; diff --git a/packages/betterer/src/config/public.ts b/packages/betterer/src/config/public.ts deleted file mode 100644 index e2690beb1..000000000 --- a/packages/betterer/src/config/public.ts +++ /dev/null @@ -1,30 +0,0 @@ -export { - BettererConfig, - BettererConfigBase, - BettererConfigStart, - BettererConfigWatch, - BettererConfigExcludes, - BettererConfigFilters, - BettererConfigIgnores, - BettererConfigIncludes, - BettererConfigPaths, - BettererOptionsBase, - BettererOptionsExcludes, - BettererOptionsFilters, - BettererOptionsIgnores, - BettererOptionsIncludes, - BettererOptionsMerge, - BettererOptionsOverride, - BettererOptionsPaths, - BettererOptionsReporters, - BettererOptionsResults, - BettererOptionsRunner, - BettererOptionsStartBase, - BettererOptionsStartCI, - BettererOptionsStartDefault, - BettererOptionsStartPrecommit, - BettererOptionsStartStrict, - BettererOptionsStartUpdate, - BettererOptionsStart, - BettererOptionsWatch -} from './types.js'; diff --git a/packages/betterer/src/config/register.ts b/packages/betterer/src/config/register.ts deleted file mode 100644 index 6a7a28bb4..000000000 --- a/packages/betterer/src/config/register.ts +++ /dev/null @@ -1,55 +0,0 @@ -import type { RegisterOptions } from 'ts-node'; - -export const JS_EXTENSION = '.js'; -export const RESULTS_EXTENSION = '.results'; -export const TS_EXTENSION = '.ts'; - -type Extensions = typeof require.extensions; - -let isRegistered = false; -export async function registerExtensions(tsconfigPath: string | null): Promise { - if (isRegistered) { - return; - } - isRegistered = true; - - // Need to do this so that webpack doesn't remove it - // during the extension bundle... - const EXTENSIONS: Extensions = eval(`require.extensions`) as Extensions; - - // Get the original JS module require: - const JS = EXTENSIONS[JS_EXTENSION]; - - if (!EXTENSIONS[TS_EXTENSION]) { - await registerTypeScript(tsconfigPath); - } - - // Force `.betterer.results` files to be loaded as JS: - EXTENSIONS[RESULTS_EXTENSION] = (m: NodeModule, filePath: string): void => { - JS(m, filePath); - }; -} - -async function registerTypeScript(tsconfigPath: string | null): Promise { - let tsNode: typeof import('ts-node'); - try { - await import('typescript'); - tsNode = await import('ts-node'); - } catch { - // Environment doesn't have TypeScript available, move on! - return; - } - - // Use TS-Node register to allow `.betterer.ts` config files: - const tsRegisterOptions: RegisterOptions = { - transpileOnly: true, - compilerOptions: { - module: 'commonjs' - }, - pretty: true - }; - if (tsconfigPath) { - tsRegisterOptions.project = tsconfigPath; - } - tsNode.register(tsRegisterOptions); -} diff --git a/packages/betterer/src/config/types.ts b/packages/betterer/src/config/types.ts index 017e158f2..02445f1d2 100644 --- a/packages/betterer/src/config/types.ts +++ b/packages/betterer/src/config/types.ts @@ -1,527 +1,18 @@ -import type { BettererReporter } from '../reporters/index.js'; - -/** - * @public An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } - * that match file paths that will be excluded from an operation. - */ -export type BettererConfigExcludes = ReadonlyArray; - -/** - * @public An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } - * that match names of relevant tests. - */ -export type BettererConfigFilters = ReadonlyArray; - -/** - * @public An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } - * patterns that match file paths that will be ignored by the file watcher in watch mode. - */ -export type BettererConfigIgnores = ReadonlyArray; - -/** - * @public An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } - * patterns that match file paths that will be included in an operation. - */ -export type BettererConfigIncludes = ReadonlyArray; - -/** - * @public An array of absolute {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file paths } - * containing **Betterer** tests. - */ -export type BettererConfigPaths = ReadonlyArray; +import type { BettererConfigContext, BettererOptionsContextOverride } from '../context/index.js'; +import type { BettererConfigFS, BettererOptionsWatcherOverride } from '../fs/index.js'; +import type { BettererConfigReporter, BettererOptionsReporterOverride } from '../reporters/index.js'; /** * @public Full validated config object for **Betterer**. */ -export interface BettererConfig extends BettererConfigBase, BettererConfigStart, BettererConfigWatch {} - -export type BettererWorkerRunConfig = Omit; - -/** - * @internal This could change at any point! Please don't use! - * - * Base configuration for all **Betterer** running modes. - */ -export interface BettererConfigBase { - /** - * When `true`, caching will be enabled for {@link @betterer/betterer#BettererFileTest | `BettererFileTest`s }. - * **Betterer** will only check files that have changes since the last test run. **Betterer** - * will create a cache file at the `configPath`. - */ - cache: boolean; - /** - * The absolute path to where the **Betterer** cache file will be saved. Only used when `cache` - * is `true`. - */ - cachePath: string; - /** - * An array of absolute {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file paths } - * containing **Betterer** tests. - */ - configPaths: BettererConfigPaths; - /** - * The current working directory. - */ - cwd: string; - /** - * An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } - * that match names of relevant tests. - */ - filters: BettererConfigFilters; - /** - * When `true`, the default reporter will render the Betterer logo. - */ - logo: boolean; - /** - * The reporter instance. All reporter hooks will be a noop if `silent` is `true`. - */ - reporter: BettererReporter; - /** - * The absolute path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. - */ - resultsPath: string; - /** - * The absolute path to the {@link https://phenomnomnominal.github.io/betterer/docs/betterer-and-typescript | TypeScript configuration file}. - */ - tsconfigPath: string | null; - /** - * The absolute path to the root directory of the repository. - */ - versionControlPath: string; - /** - * The number of {@link https://nodejs.org/api/worker_threads.html | worker threads} to use when - * running **Betterer**. - */ - workers: number; -} - -/** - * @internal This could change at any point! Please don't use! - * - * Configuration for the default **Betterer** running mode. - */ -export interface BettererConfigStart { - /** - * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#ci-mode-run-your-tests-and-throw-on-changes | CI mode } - * is enabled. In CI mode, **Betterer** will throw an error if there is any difference between - * the test results and the expected results. - * - * When `ci` is `true`, `strict` will be `true` and `precommit`, `update` and `watch` will be - * `false`. - */ - ci: boolean; - /** - * An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } - * that match file paths that will be excluded from {@link @betterer/betterer#BettererFileTest | `BettererFileTest` } - * runs. - */ - excludes: BettererConfigExcludes; - /** - * An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } - * patterns that match file paths that will be included in {@link @betterer/betterer#BettererFileTest | `BettererFileTest` } - * runs. - */ - includes: BettererConfigIncludes; - /** - * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#precommit-mode | precommit mode } - * is enabled. In precommit mode, **Betterer** will automatically add the results file to the - * current commit if it contains any changes. - * - * If `ci` is `true`, `precommit` will be `false`. When `precommit` is `true`, `update` and - * `watch` will be `false`. - */ - precommit: boolean; - /** - * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#strict-mode | strict mode } - * is enabled. In strict mode, **Betterer** will force `update` to be `false` and will not show the message - * reminding the user about update mode. - * - * If `ci` or `precommit` is `true`, `strict` will be `false`. When `strict` is `true`, `update` - * and `watch` will be `false`. - */ - strict: boolean; - /** - * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#update-mode | update mode } - * is enabled. In update mode, **Betterer** will {@link https://phenomnomnominal.github.io/betterer/docs/updating-results | update the results file}, - * even if the latest test results are worse than the current results. - * - * If `ci`, `precommit` or `strict` is `true`, `update` will be `false`. When `update` is `true`, - * `watch` will be `false`. - */ - update: boolean; -} - -/** - * @internal This could change at any point! Please don't use! - * - * Configuration for the **Betterer** watch mode. - */ -export interface BettererConfigWatch { - /** - * An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } - * patterns that match file paths that will be ignored by the file watcher in watch mode. - */ - ignores: BettererConfigIgnores; - /** - * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#watch-mode | watch mode } - * is enabled. In watch mode, **Betterer** will run all {@link @betterer/betterer#BettererFileTest | `BettererFileTest`s } - * whenever a file changes. Only files that are tracked by version control will be watched by - * default. You can ignore additional files using `ignores`. - * - * If `ci`, `precommit`, `strict`, or `update` is `true`, `watch` will be `false`. - */ - watch: boolean; -} - -export interface BettererConfigMerge { - contents: Array; - resultsPath: string; -} - -/** - * @public A path to a {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file } - * containing **Betterer** tests, or an array of them. - */ -export type BettererOptionsPaths = Array | string; - -/** - * @public A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } - * to match file paths that should be excluded from an operation, or an array of them. - */ -export type BettererOptionsExcludes = Array | string | RegExp; - -/** - * @public A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } - * to match the names of relevant tests, or an array of them. - */ -export type BettererOptionsFilters = Array | string | RegExp; - -/** - * @public A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern - * to match file paths that should be ignored by the file watcher in watch mode, or an array of - * them. - */ -export type BettererOptionsIgnores = Array; - -/** - * @public A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern - * to match file paths that should be included in an operation, or an array of them. - */ -export type BettererOptionsIncludes = Array | string; - -/** - * @public An array of names of npm packages that export a {@link @betterer/betterer#BettererReporter | `BettererReporter`}, - * or `object`s that implement {@link @betterer/betterer#BettererReporter | `BettererReporter`}. - */ -export type BettererOptionsReporters = Array; - -/** - * @public Options for when you create a {@link @betterer/betterer#BettererResultsSummary | `BettererResultsSummary` } - * via the {@link @betterer/betterer#results | `betterer.results()` API}. - * - * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. - */ -export interface BettererOptionsResults { - /** - * A path to a {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file } - * containing **Betterer** tests, or an array of them. All `configPaths` should be relative to the `cwd`. - * @defaultValue `['./.betterer']` - */ - configPaths?: BettererOptionsPaths; - /** - * The current working directory. - * @defaultValue {@link https://nodejs.org/api/process.html#process_process_cwd | `process.cwd()` } - */ - cwd?: string; - /** - * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } - * to match file paths that should be excluded from the {@link @betterer/betterer#BettererResultsSummary | `BettererResultsSummary`}, - * or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigExcludes | `BettererConfigExcludes`}. - * @defaultValue `[]` - */ - excludes?: BettererOptionsExcludes; - /** - * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } - * to match the names of relevant tests, or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigFilters | `BettererConfigFilters`}. - * @defaultValue `[]` - */ - filters?: BettererOptionsFilters; - /** - * A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern to match - * file paths that should be included in the {@link @betterer/betterer#BettererResultsSummary | `BettererResultsSummary`}, - * or an array of them. - * @defaultValue `[]` - */ - includes?: BettererOptionsIncludes; - /** - * The path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. - * The `resultsPath` should be relative to the `cwd`. - * @defaultValue `'./.betterer.results'` - */ - resultsPath?: string; -} - -/** - * @public Options for when merging conflicts in the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file} - * via the {@link @betterer/betterer#merge | `betterer.merge()` API}. - * - * @remarks The options object will be validated by **Betterer**. - */ -export interface BettererOptionsMerge { - /** - * File contents for merging. If omitted, the `resultsPath` will be read and merged. - */ - contents?: Array; - /** - * The current working directory. - * @defaultValue {@link https://nodejs.org/api/process.html#process_process_cwd | `process.cwd()` } - */ - cwd?: string; - /** - * The path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. - * The `resultsPath` should be relative to the `cwd`. - * @defaultValue `'./.betterer.results'` - */ - resultsPath?: string; -} - -/** - * @internal This could change at any point! Please don't use! - * - * Base options for **Betterer** all running modes. - */ -export interface BettererOptionsBase { - /** - * When `true`, caching will be enabled for {@link @betterer/betterer#BettererFileTest | `BettererFileTest`s}. - * Betterer will only check files that have changes since the last test run. **Betterer** will - * create a cache file at the `configPath`. - * @defaultValue `false` - */ - cache?: boolean; - /** - * The path to where the **Betterer** cache file will be saved. Only used when `cache` is `true`. - * The `cachePath` should be relative to the `cwd`. - * @defaultValue `'./.betterer.cache'` - */ - cachePath?: string; - /** - * A path to a {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file } - * containing **Betterer** tests, or an array of them. All `configPaths` should be relative to - * the `cwd`. - * @defaultValue `['./.betterer']` - */ - configPaths?: BettererOptionsPaths; - /** - * The current working directory. - * @defaultValue {@link https://nodejs.org/api/process.html#process_process_cwd | `process.cwd()`} - */ - cwd?: string; - /** - * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } - * to match the names of tests that should be run, or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigFilters | `BettererConfigFilters`}. - * @defaultValue `[]` - */ - filters?: BettererOptionsFilters; - /** - * When `true`, the default reporter will render the Betterer logo. - * @defaultValue `false` - */ - logo?: boolean; - /** - * An array of names of npm packages that export a {@link @betterer/betterer#BettererReporter | `BettererReporter` } - * or `object`s that implement {@link @betterer/betterer#BettererReporter | `BettererReporter`}. - * Ignored when `silent` is `true`. - * @defaultValue `['@betterer/reporter']` - */ - reporters?: BettererOptionsReporters; - /** - * The path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. - * The `resultsPath` should be relative to the `cwd`. - * @defaultValue `'./.betterer.results'` - */ - resultsPath?: string; - /** - * When `true`, all reporters will be disabled. - * @defaultValue `false` - */ - silent?: boolean; - /** - * The path to the {@link https://phenomnomnominal.github.io/betterer/docs/betterer-and-typescript | TypeScript configuration}. - * The `tsconfigPath` should be relative to the `cwd`. - * @defaultValue `null` - */ - tsconfigPath?: string; - /** - * The number of {@link https://nodejs.org/api/worker_threads.html | worker threads } to use when - * running tests. When `workers` is `true`, **Betterer** will pick a sensible default. - * When `workers` is `false` **Betterer** will run in a single thread. - * @defaultValue `true` - */ - workers?: number | boolean; -} - -/** - * @internal This could change at any point! Please don't use! - * - * Base options for the default **Betterer** running mode. - */ -export interface BettererOptionsStartBase extends BettererOptionsBase { - /** - * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } - * to match file paths that should be excluded from {@link @betterer/betterer#BettererFileTest | `BettererFileTest` } - * runs, or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigExcludes | `BettererConfigExcludes`}. - * @defaultValue `[]` - */ - excludes?: BettererOptionsExcludes; - /** - * A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern to - * match file paths that should be included in {@link @betterer/betterer#BettererFileTest | `BettererFileTest` } - * runs, or an array of them. All `includes` should be relative to the `cwd`. - * @defaultValue `[]` - */ - includes?: BettererOptionsIncludes; -} - -/** - * @internal This could change at any point! Please don't use! - * - * **Betterer** options for when running in CI mode. When `ci` is `true`, `strict` must also be - * `true` and `precommit`, `update` and `watch` must be falsey. - */ -export interface BettererOptionsStartCI extends BettererOptionsStartBase { - ci?: true; - precommit?: false; - strict?: true; - update?: false; - watch?: false; -} - -/** - * @internal This could change at any point! Please don't use! - * - * **Betterer** options for when running in the default mode. By default `ci`, `precommit`, - * `strict`, `update` and `watch` are all falsey. - */ -export interface BettererOptionsStartDefault extends BettererOptionsStartBase { - ci?: false; - precommit?: false; - strict?: false; - update?: false; - watch?: false; -} - -/** - * @internal This could change at any point! Please don't use! - * - * **Betterer** options for when running in precommit mode. When `precommit` is `true`, `ci`, - * `update` and `watch` must be falsey. - */ -export interface BettererOptionsStartPrecommit extends BettererOptionsStartBase { - ci?: false; - precommit?: true; - strict?: boolean; - update?: false; - watch?: false; -} - -/** - * @internal This could change at any point! Please don't use! - * - * **Betterer** options for when running in strict mode. When `strict` is `true`, `ci`, - * `precommit`, `update` and `watch` must be falsey. - */ -export interface BettererOptionsStartStrict extends BettererOptionsStartBase { - ci?: false; - precommit?: false; - strict?: true; - update?: false; - watch?: false; -} - -/** - * @internal This could change at any point! Please don't use! - * - * **Betterer** options for when running in update mode. When `update` is `true`, `ci`, - * `precommit`, `strict` and `watch` must be falsey. - */ -export interface BettererOptionsStartUpdate extends BettererOptionsStartBase { - ci?: false; - precommit?: false; - strict?: false; - update?: true; - watch?: false; -} - -/** - * @public Options for when you run **Betterer** via the {@link @betterer/betterer#(betterer:function) | JS API}. - * - * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. - * - * This is the union of valid possible options for a single **Betterer** run. This type should - * prevent {@link @betterer/betterer#(betterer:function) | `betterer()` } from being called with invalid - * options, as some combinations do not make sense. - */ -export type BettererOptionsStart = - | BettererOptionsStartCI - | BettererOptionsStartDefault - | BettererOptionsStartPrecommit - | BettererOptionsStartStrict - | BettererOptionsStartUpdate; - -/** - * @public Options for when you create a {@link @betterer/betterer#BettererRunner | `BettererRunner` } - * via the {@link @betterer/betterer#runner | `betterer.runner()` API}. - * - * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. - */ -export type BettererOptionsRunner = BettererOptionsBase; - -/** - * @public Options for when you create a {@link @betterer/betterer#BettererRunner | `BettererRunner` } - * via the {@link @betterer/betterer#watch | `betterer.watch()` JS API}. - * - * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. - */ -export interface BettererOptionsWatch extends BettererOptionsRunner { - /** - * A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern to match - * file paths that should be ignored by the file watcher in watch mode, or an array of them. - * All `ignores` should be relative to the `cwd`. - * @defaultValue `[]` - */ - ignores?: BettererOptionsIgnores; - /** - * Must be `true` when using Watch mode. - */ - watch?: true; -} - -export type BettererOptionsAll = BettererOptionsStart | BettererOptionsWatch | BettererOptionsResults; +export interface BettererConfig extends BettererConfigFS, BettererConfigReporter, BettererConfigContext {} /** * @public Options for when you override the config via the {@link @betterer/betterer#BettererContext.options | `BettererContext.options()` API}. * * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererConfig | `BettererConfig`}. */ -export interface BettererOptionsOverride { - /** - * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } - * to match the names of tests that should be run, or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigFilters | `BettererConfigFilters`}. - * @defaultValue `[]` - */ - filters?: BettererOptionsFilters; - /** - * A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern to match - * file paths that should be ignored by the file watcher in watch mode, or an array of them. All - * `ignores` should be relative to the `cwd`. - * @defaultValue `[]` - */ - ignores?: BettererOptionsIgnores; - /** - * An array of names of npm packages that export a {@link @betterer/betterer#BettererReporter | `BettererReporter` } - * or `object`s that implement {@link @betterer/betterer#BettererReporter | `BettererReporter`}. - * Ignored when `silent` is `true`. - * @defaultValue `['@betterer/reporter']` - */ - reporters?: BettererOptionsReporters; -} +export interface BettererOptionsOverride + extends BettererOptionsContextOverride, + BettererOptionsReporterOverride, + BettererOptionsWatcherOverride {} diff --git a/packages/betterer/src/config/validate.ts b/packages/betterer/src/config/validate.ts new file mode 100644 index 000000000..0a632cb59 --- /dev/null +++ b/packages/betterer/src/config/validate.ts @@ -0,0 +1,107 @@ +import assert from 'node:assert'; + +import { BettererError, invariantΔ } from '@betterer/errors'; + +import { read, readdir } from '../fs/index.js'; +import { isBoolean, isNumber, isRegExp, isString, isUndefined } from '../utils.js'; + +function getKeyValue(config: object): [string, unknown] { + const [key] = Object.keys(config); + invariantΔ(key, `No keys found on validation config!`, config); + const value = config[key as keyof typeof config]; + return [key, value]; +} + +export function validateBool(config: Config): Config { + const [key, value] = getKeyValue(config); + validate(isBoolean(value), `"${key}" must be \`true\` or \`false\`. ${received(value)}`); + return config; +} + +export function validateString(config: Config): Config { + const [key, value] = getKeyValue(config); + validate(isString(value), `"${key}" must be a string. ${received(value)}`); + return config; +} + +export async function validateFilePath(config: Config): Promise { + const [key, value] = getKeyValue(config); + validate( + value == null || (isString(value) && (await read(value)) !== null), + `"${key}" must be a path to a file. ${received(value)}` + ); + return config; +} + +export async function validateDirectory(config: Config): Promise { + const [key, value] = getKeyValue(config); + validate( + value == null || (isString(value) && (await readdir(value)) !== null), + `"${key}" must be a path to a directory. ${received(value)}` + ); + return config; +} + +function validateNumber(config: Config): Config { + const [key, value] = getKeyValue(config); + validate(isNumber(value), `"${key}" must be a number. ${received(value)}`); + return config; +} + +export function validateStringArray(config: Config): Config { + const [key, value] = getKeyValue(config); + validateStringOrArray(config); + validate( + !Array.isArray(value) || value.every((item) => isString(item)), + `"${key}" must be an array of strings. ${received(value)}` + ); + return config; +} + +function validateStringOrArray(config: Config): Config { + const [key, value] = getKeyValue(config); + validate(isString(value) || Array.isArray(value), `"${key}" must be a string or an array. ${received(value)}`); + return config; +} + +export function validateStringRegExpArray(config: Config): Config { + const [key, value] = getKeyValue(config); + validateStringOrArray(config); + validate( + !Array.isArray(value) || value.every((item) => isString(item) || isRegExp(item)), + `"${key}" must be an array of strings or RegExps. ${received(value)}` + ); + return config; +} + +export async function validateWorkers(workers: number | boolean = true): Promise { + const { cpus } = await import('node:os'); + const totalCPUs = cpus().length; + + if (workers === true || isUndefined(workers)) { + workers = totalCPUs >= 4 ? totalCPUs - 2 : false; + } + if (workers === false || workers === 0) { + process.env.BETTERER_WORKER = 'false'; + // When disabled, set workers to 1 so that the BettererWorkerPool + // can be instantiated correctly: + workers = 1; + } + + validateNumber({ workers }); + validate( + isNumber(workers) && workers > 0 && workers <= totalCPUs, + `"workers" must be more than zero and not more than the number of available CPUs (${String(totalCPUs)}). To disable workers, set to \`false\`. ${received( + workers + )}` + ); + return workers; +} + +function validate(value: unknown, message: string): asserts value { + assert(value, new BettererError(message)); +} + +function received(value: unknown): string { + return `Received \`${JSON.stringify(value)}\`.`; +} diff --git a/packages/betterer/src/context/config.ts b/packages/betterer/src/context/config.ts new file mode 100644 index 000000000..ddfd2a3fa --- /dev/null +++ b/packages/betterer/src/context/config.ts @@ -0,0 +1,107 @@ +import type { BettererConfig } from '../config/index.js'; +import type { BettererConfigContext, BettererOptionsContext, BettererOptionsContextOverride } from './types.js'; + +import { + toArray, + toRegExps, + validateBool, + validateStringArray, + validateStringRegExpArray, + validateWorkers +} from '../config/index.js'; +import { getGlobals } from '../globals.js'; + +export async function createContextConfig(options: BettererOptionsContext): Promise { + const ci = options.ci ?? false; + const filters = toRegExps(toArray(options.filters)); + const excludes = toRegExps(toArray(options.excludes)); + const includes = toArray(options.includes); + const precommit = options.precommit ?? false; + const strict = options.strict ?? false; + const strictDeadlines = options.strictDeadlines ?? false; + const update = options.update ?? false; + + if (ci) { + process.env.CI = 'true'; + } + + validateBool({ ci }); + validateBool({ precommit }); + validateBool({ strict }); + validateBool({ strictDeadlines }); + validateBool({ update }); + validateStringRegExpArray({ excludes }); + validateStringRegExpArray({ filters }); + validateStringArray({ includes }); + + const workers = await validateWorkers(options.workers); + + return { + ci, + excludes, + filters, + includes, + precommit, + strict, + strictDeadlines, + update, + workers + }; +} + +export function overrideContextConfig(optionsOverride: BettererOptionsContextOverride): void { + if (optionsOverride.filters) { + const { config } = getGlobals(); + validateStringRegExpArray({ filters: optionsOverride.filters }); + config.filters = toRegExps(toArray(optionsOverride.filters)); + } +} + +export function enableMode(config: BettererConfig): BettererConfig { + // CI mode: + if (config.ci) { + config.precommit = false; + config.strict = true; + config.update = false; + config.watch = false; + return config; + } + + // Precommit mode: + if (config.precommit) { + config.ci = false; + config.strict = true; + config.update = false; + config.watch = false; + return config; + } + + // Strict mode: + if (config.strict) { + config.ci = false; + config.precommit = false; + config.update = false; + config.watch = false; + return config; + } + + // Update mode: + if (config.update) { + config.ci = false; + config.precommit = false; + config.strict = false; + config.watch = false; + return config; + } + + // Watch mode: + if (config.watch) { + config.ci = false; + config.precommit = false; + config.strict = false; + config.update = false; + return config; + } + + return config; +} diff --git a/packages/betterer/src/context/context-summary.ts b/packages/betterer/src/context/context-summary.ts index 677be34b0..d3768ff30 100644 --- a/packages/betterer/src/context/context-summary.ts +++ b/packages/betterer/src/context/context-summary.ts @@ -2,10 +2,23 @@ import type { BettererConfig } from '../config/index.js'; import type { BettererSuiteSummaries, BettererSuiteSummary } from '../suite/index.js'; import type { BettererContextSummary } from './types.js'; +import { BettererError } from '@betterer/errors'; + +import { getGlobals } from '../globals.js'; + export class BettererContextSummaryΩ implements BettererContextSummary { - constructor(public readonly config: BettererConfig, public readonly suites: BettererSuiteSummaries) {} + public readonly config: BettererConfig; + + constructor(public readonly suites: BettererSuiteSummaries) { + const { config } = getGlobals(); + this.config = config; + } public get lastSuite(): BettererSuiteSummary { - return this.suites[this.suites.length - 1]; + const suite = this.suites[this.suites.length - 1]; + if (!suite) { + throw new BettererError(`Context has not completed a suite run yet! ❌`); + } + return suite; } } diff --git a/packages/betterer/src/context/context.ts b/packages/betterer/src/context/context.ts index 8ee15a745..1f5cb70b2 100644 --- a/packages/betterer/src/context/context.ts +++ b/packages/betterer/src/context/context.ts @@ -1,182 +1,125 @@ -import type { BettererError } from '@betterer/errors'; -import type { FSWatcher } from 'chokidar'; +import { BettererError } from '@betterer/errors'; import type { BettererConfig, BettererOptionsOverride } from '../config/index.js'; -import type { BettererFilePaths, BettererVersionControlWorker } from '../fs/index.js'; +import type { BettererFilePaths, BettererFileResolverΩ } from '../fs/index.js'; import type { BettererReporterΩ } from '../reporters/index.js'; -import type { BettererResultsFileΩ } from '../results/index.js'; -import type { BettererRunWorkerPool } from '../run/index.js'; -import type { BettererSuiteSummaries, BettererSuiteSummary } from '../suite/index.js'; -import type { BettererTestLoaderWorker } from '../test/index.js'; -import type { BettererGlobals } from '../types.js'; -import type { BettererContext, BettererContextStarted, BettererContextSummary } from './types.js'; - -import { importWorker__ } from '@betterer/worker'; - -import { overrideConfig } from '../config/index.js'; -import { BettererFileResolverΩ } from '../fs/index.js'; -import { BettererRunΩ, createWorkerRunConfig, createRunWorkerPool } from '../run/index.js'; +import type { + BettererSuite, + BettererSuites, + BettererSuiteSummaries, + BettererSuiteSummary, + BettererSuiteSummaryΩ +} from '../suite/index.js'; +import type { BettererContext, BettererContextSummary } from './types.js'; + +import { overrideContextConfig } from '../context/index.js'; +import { overrideReporterConfig } from '../reporters/index.js'; +import { overrideWatchConfig } from '../fs/index.js'; import { BettererSuiteΩ } from '../suite/index.js'; -import { defer } from '../utils.js'; +import { getGlobals } from '../globals.js'; import { BettererContextSummaryΩ } from './context-summary.js'; export class BettererContextΩ implements BettererContext { public readonly config: BettererConfig; - private _isDestroyed = false; - private _reporter: BettererReporterΩ; - private _started: BettererContextStarted; + private _suites: BettererSuites = []; private _suiteSummaries: BettererSuiteSummaries = []; - private readonly _resultsFile: BettererResultsFileΩ; - private readonly _runWorkerPool: BettererRunWorkerPool; - private readonly _testMetaLoader: BettererTestLoaderWorker = importWorker__('../test/loader.worker.js'); - private readonly _versionControl: BettererVersionControlWorker; - - constructor(private _globals: BettererGlobals, private readonly _watcher: FSWatcher | null) { - this.config = this._globals.config; - - this._runWorkerPool = createRunWorkerPool(this.config.workers); - this._resultsFile = this._globals.resultsFile; - this._reporter = this.config.reporter as BettererReporterΩ; - this._versionControl = this._globals.versionControl; - - this._started = this._start(); + constructor() { + const { config } = getGlobals(); + this.config = config; } - public get isDestroyed(): boolean { - return this._isDestroyed; + public get lastSuite(): BettererSuite { + const suite = this._suites[this._suites.length - 1]; + if (!suite) { + throw new BettererError(`Context has not started a suite run yet! ❌`); + } + return suite; } public async options(optionsOverride: BettererOptionsOverride): Promise { - // Wait for any pending run to finish, and any existing reporter to render: - await this._started.end(); // Override the config: - overrideConfig(this.config, optionsOverride); - // Start everything again, and trigger a new reporter: - this._started = this._start(); - - // eslint-disable-next-line @typescript-eslint/no-misused-promises -- SIGTERM doesn't care about Promises - process.on('SIGTERM', () => this.stop()); + overrideContextConfig(optionsOverride); + await overrideReporterConfig(optionsOverride); + overrideWatchConfig(optionsOverride); } - public async run(specifiedFilePaths: BettererFilePaths, isRunOnce = false): Promise { - try { - await this._resultsFile.sync(); - await this._versionControl.api.sync(); - - const { cwd, includes, excludes } = this.config; - - const globalResolver = new BettererFileResolverΩ(cwd, this._versionControl); - globalResolver.include(...includes); - globalResolver.exclude(...excludes); - - const hasSpecifiedFiles = specifiedFilePaths.length > 0; - const hasGlobalIncludesExcludes = includes.length || excludes.length; - - let filePaths: BettererFilePaths; - if (hasSpecifiedFiles && hasGlobalIncludesExcludes) { - // Validate specified files based on global `includes`/`excludes and gitignore rules: - filePaths = await globalResolver.validate(specifiedFilePaths); - } else if (hasSpecifiedFiles) { - // Validate specified files based on gitignore rules: - filePaths = await globalResolver.validate(specifiedFilePaths); - } else if (hasGlobalIncludesExcludes) { - // Resolve files based on global `includes`/`excludes and gitignore rules: - filePaths = await globalResolver.files(); - } else { - // When `filePaths` is `[]` the test will use its specific resolver: - filePaths = []; - } - - // Load test names in a worker so the import cache is always clean: - const testNames = await this._testMetaLoader.api.loadTestNames(this.config.tsconfigPath, this.config.configPaths); - - const workerRunConfig = createWorkerRunConfig(this.config); - - const runs = await Promise.all( - testNames.map(async (testName) => { - return await BettererRunΩ.create( - this._runWorkerPool, - testName, - workerRunConfig, - filePaths, - this._versionControl - ); - }) - ); - - const suite = new BettererSuiteΩ(this.config, this._resultsFile, filePaths, runs); - const suiteSummary = await suite.run(isRunOnce); - this._suiteSummaries = [...this._suiteSummaries, suiteSummary]; - } catch (error) { - await this._started.error(error as BettererError); - throw error; + public async run(specifiedFilePaths: BettererFilePaths, isRunOnce = false): Promise { + const configFileChange = this.config.configPaths.some((configPath) => specifiedFilePaths.includes(configPath)); + if (configFileChange) { + specifiedFilePaths = []; } - } - public async runOnce(): Promise { - try { - await this.run([], true); - const summary = await this.stop(); - return summary; - } finally { - await this._destroy(); - } - } + const { config, fs, reporter, resolvers, results } = getGlobals(); - public async stop(): Promise { - try { - const contextSummary = await this._started.end(); - return contextSummary.lastSuite; - } finally { - await this._destroy(); - } - } + await fs.api.sync(); - private async _destroy(): Promise { - if (this._isDestroyed) { - return; - } - this._isDestroyed = true; - if (this._watcher) { - await this._watcher.close(); + const resolver = resolvers.base as BettererFileResolverΩ; + + const { includes, excludes } = config; + resolver.include(...includes); + resolver.exclude(...excludes); + + const hasSpecifiedFiles = specifiedFilePaths.length > 0; + const hasGlobalIncludesExcludes = includes.length || excludes.length; + + let filePaths: BettererFilePaths; + if (hasSpecifiedFiles) { + // Validate specified files based on gitignore rules: + filePaths = await resolver.validate(specifiedFilePaths); + } else if (hasGlobalIncludesExcludes) { + // Resolve files based on global `includes`/`excludes and gitignore rules: + filePaths = await resolver.files(); + } else { + // When `filePaths` is `[]` the test will use its specific resolver: + filePaths = []; } - await this._testMetaLoader.destroy(); - await this._versionControl.destroy(); - await this._runWorkerPool.destroy(); - } - private _start(): BettererContextStarted { - // Update `this._reporterΩ` here because `this.options()` may have been called: - this._reporter = this.config.reporter as BettererReporterΩ; - const reporterΩ = this._reporter; + const suiteΩ = await BettererSuiteΩ.create(filePaths); + this._suites.push(suiteΩ); - const contextLifecycle = defer(); + const reporterΩ = reporter as BettererReporterΩ; // Don't await here! A custom reporter could be awaiting // the lifecycle promise which is unresolved right now! - const reportContextStart = reporterΩ.contextStart(this, contextLifecycle.promise); - return { - end: async (): Promise => { - const contextSummary = new BettererContextSummaryΩ(this.config, this._suiteSummaries); - contextLifecycle.resolve(contextSummary); - await reportContextStart; - await reporterΩ.contextEnd(contextSummary); - - const suiteSummaryΩ = contextSummary.lastSuite; - if (suiteSummaryΩ && !this.config.ci) { - await this._resultsFile.write(suiteSummaryΩ, this.config.precommit); - } - await this._versionControl.api.writeCache(); - - return contextSummary; - }, - error: async (error: BettererError): Promise => { - contextLifecycle.reject(error); - await reportContextStart; - await reporterΩ.contextError(this, error); - } - }; + const reportSuiteStart = reporterΩ.suiteStart(suiteΩ, suiteΩ.lifecycle.promise); + const suiteSummary = await suiteΩ.run(); + this._suiteSummaries = [...this._suiteSummaries, suiteSummary]; + + if (!isRunOnce && !config.ci) { + const suiteSummaryΩ = suiteSummary as BettererSuiteSummaryΩ; + await results.api.write(suiteSummaryΩ.result); + } + + if (suiteSummary.error) { + const { error } = suiteSummary; + suiteΩ.lifecycle.reject(error as BettererError); + + // Lifecycle promise is rejected, so it's safe to await + // the result of `reporter.suiteStart`: + await reportSuiteStart; + await reporterΩ.suiteError(suiteSummary, error as BettererError); + } else { + // Lifecycle promise is resolved, so it's safe to await + // the result of `reporter.suiteStart`: + suiteΩ.lifecycle.resolve(suiteSummary); + await reportSuiteStart; + + await reporterΩ.suiteEnd(suiteSummary); + } + + return suiteSummary; + } + + public async stop(): Promise { + try { + const lastSuiteΩ = this.lastSuite as BettererSuiteΩ; + await lastSuiteΩ.lifecycle.promise; + } catch { + // Not a problem if there hasn't been a suite run yet! + } + + return new BettererContextSummaryΩ(this._suiteSummaries); } } diff --git a/packages/betterer/src/context/index.ts b/packages/betterer/src/context/index.ts index 9aa6995c5..4ba7f7fd0 100644 --- a/packages/betterer/src/context/index.ts +++ b/packages/betterer/src/context/index.ts @@ -1,2 +1,24 @@ +export type { + BettererConfigContext, + BettererConfigExcludes, + BettererConfigFilters, + BettererConfigIncludes, + BettererContext, + BettererContextSummary, + BettererOptionsContext, + BettererOptionsContextOverride, + BettererOptionsExcludes, + BettererOptionsFilters, + BettererOptionsIncludes, + BettererOptionsMode, + BettererOptionsModeCI, + BettererOptionsModeDefault, + BettererOptionsModePrecommit, + BettererOptionsModeStrict, + BettererOptionsModeUpdate, + BettererOptionsModeWatch +} from './types.js'; + +export { createContextConfig, enableMode, overrideContextConfig } from './config.js'; +export { BettererContextSummaryΩ } from './context-summary.js'; export { BettererContextΩ } from './context.js'; -export { BettererContext, BettererContextSummary } from './types.js'; diff --git a/packages/betterer/src/context/public.ts b/packages/betterer/src/context/public.ts deleted file mode 100644 index e45e3137f..000000000 --- a/packages/betterer/src/context/public.ts +++ /dev/null @@ -1 +0,0 @@ -export { BettererContext, BettererContextSummary } from './types.js'; diff --git a/packages/betterer/src/context/types.ts b/packages/betterer/src/context/types.ts index 118f6d291..ffe160f50 100644 --- a/packages/betterer/src/context/types.ts +++ b/packages/betterer/src/context/types.ts @@ -1,8 +1,246 @@ -import type { BettererError } from '@betterer/errors'; - import type { BettererConfig, BettererOptionsOverride } from '../config/index.js'; import type { BettererSuiteSummaries, BettererSuiteSummary } from '../suite/index.js'; +/** + * @public A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } + * to match file paths that should be excluded from an operation, or an array of them. + */ +export type BettererOptionsExcludes = Array | string | RegExp; + +/** + * @public A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } + * to match the names of relevant tests, or an array of them. + */ +export type BettererOptionsFilters = Array | string | RegExp; + +/** + * @public A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern + * to match file paths that should be included in an operation, or an array of them. + */ +export type BettererOptionsIncludes = Array | string; + +/** + * @public **Betterer** options for when running in default mode. + */ +export interface BettererOptionsModeDefault { + ci?: false; + precommit?: false; + strict?: false; + update?: false; +} + +/** + * @public **Betterer** options for when running in CI mode. + * + * @remarks When `ci` is `true`, `strict` must also be `true`, and `precommit` and `update` must be false. + */ +export interface BettererOptionsModeCI { + ci?: true; + precommit?: false; + strict?: true; + update?: false; +} + +/** + * @public **Betterer** options for when running in precommit mode. + * + * @remarks When `precommit` is `true`, `strict` must also be `true`, and `ci` and `update` must be false. + */ +export interface BettererOptionsModePrecommit { + ci?: false; + precommit?: true; + strict?: true; + update?: false; +} + +/** + * @public **Betterer** options for when running in strict mode. + * + * @remarks When `strict` is `true`, `ci`, `precommit` and `update` must be false. + */ +export interface BettererOptionsModeStrict { + ci?: false; + precommit?: false; + strict?: true; + update?: false; +} + +/** + * @public **Betterer** options for when running in update mode. + * + * @remarks When `update` is `true`, `ci`, `precommit` and `strict` must be false. + */ +export interface BettererOptionsModeUpdate { + ci?: false; + precommit?: false; + strict?: false; + update?: true; +} + +/** + * @public **Betterer** options for when running in watch mode. + * + * @remarks In watch mode, `ci`, `precommit`, `strict` and `update` must be false. + */ +export interface BettererOptionsModeWatch { + ci?: false; + precommit?: false; + strict?: false; + update?: false; +} + +/** + * @public **Betterer** mode options for when running via `betterer()` or `betterer.runner()`. + */ +export type BettererOptionsMode = + | BettererOptionsModeCI + | BettererOptionsModeDefault + | BettererOptionsModePrecommit + | BettererOptionsModeStrict + | BettererOptionsModeUpdate; + +/** + * @public **Betterer** options for creating a `BettererContext`. + * + * @remarks The options object will be validated by **Betterer** and will be available on the + * {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export type BettererOptionsContext = BettererOptionsMode & { + /** + * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } + * to match file paths that should be excluded from the {@link @betterer/betterer#BettererResultsSummary | `BettererResultsSummary`}, + * or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigExcludes | `BettererConfigExcludes`}. + * @defaultValue `[]` + */ + excludes?: BettererOptionsExcludes; + /** + * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } + * to match the names of relevant tests, or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigFilters | `BettererConfigFilters`}. + * @defaultValue `[]` + */ + filters?: BettererOptionsFilters; + /** + * A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern to match + * file paths that should be included in the {@link @betterer/betterer#BettererResultsSummary | `BettererResultsSummary`}, + * or an array of them. + * @defaultValue `[]` + */ + includes?: BettererOptionsIncludes; + /** + * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/tests#test-deadline | strict deadlines } + * are enabled. With strict deadlines, **Betterer** will throw an error if there are any expired tests. + */ + strictDeadlines?: boolean; + /** + * The number of {@link https://nodejs.org/api/worker_threads.html | worker threads } to use when + * running tests. When `workers` is `true`, **Betterer** will pick a sensible default. + * When `workers` is `false` **Betterer** will run in a single thread. + * @defaultValue `true` + */ + workers?: number | boolean; +}; + +/** + * @public Options for when you override the `BettererContext` config via the {@link @betterer/betterer#BettererContext.options | `BettererContext.options()` API}. + */ +export interface BettererOptionsContextOverride { + /** + * A string or {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } + * to match the names of tests that should be run, or an array of them. Will be converted into {@link @betterer/betterer#BettererConfigFilters | `BettererConfigFilters`}. + * @defaultValue `[]` + */ + filters?: BettererOptionsFilters; +} + +/** + * @public An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } + * that match file paths that will be excluded from an operation. + */ +export type BettererConfigExcludes = ReadonlyArray; + +/** + * @public An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } + * that match names of relevant tests. + */ +export type BettererConfigFilters = ReadonlyArray; + +/** + * @public An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } + * patterns that match file paths that will be included in an operation. + */ +export type BettererConfigIncludes = ReadonlyArray; + +/** + * @public Full validated config object for a `BettererContext`. + * + * @remarks Ths config can be accessed via the {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export interface BettererConfigContext { + /** + * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#ci-mode-run-your-tests-and-throw-on-changes | CI mode } + * is enabled. In CI mode, **Betterer** will throw an error if there is any difference between + * the test results and the expected results. + * + * When `ci` is `true`, `strict` will be `true` and `precommit`, `update` and `watch` will be + * `false`. + */ + ci: boolean; + /** + * An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } + * that match file paths that will be excluded from {@link @betterer/betterer#BettererFileTest | `BettererFileTest` } + * runs. + */ + excludes: BettererConfigExcludes; + /** + * An array of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expressions } + * that match names of relevant tests. + */ + filters: BettererConfigFilters; + /** + * An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } + * patterns that match file paths that will be included in {@link @betterer/betterer#BettererFileTest | `BettererFileTest` } + * runs. + */ + includes: BettererConfigIncludes; + /** + * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#precommit-mode | precommit mode } + * is enabled. In precommit mode, **Betterer** will automatically add the results file to the + * current commit if it contains any changes. + * + * If `ci` is `true`, `precommit` will be `false`. When `precommit` is `true`, `update` and + * `watch` will be `false`. + */ + precommit: boolean; + /** + * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#strict-mode | strict mode } + * is enabled. In strict mode, **Betterer** will force `update` to be `false` and will not show the message + * reminding the user about update mode. + * + * If `ci` or `precommit` is `true`, `strict` will be `false`. When `strict` is `true`, `update` + * and `watch` will be `false`. + */ + strict: boolean; + /** + * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/tests#test-deadline | strict deadlines } + * are enabled. With strict deadlines, **Betterer** will throw an error if there are any expired tests. + */ + strictDeadlines: boolean; + /** + * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#update-mode | update mode } + * is enabled. In update mode, **Betterer** will {@link https://phenomnomnominal.github.io/betterer/docs/updating-results | update the results file}, + * even if the latest test results are worse than the current results. + * + * If `ci`, `precommit` or `strict` is `true`, `update` will be `false`. When `update` is `true`, + * `watch` will be `false`. + */ + update: boolean; + /** + * The number of {@link https://nodejs.org/api/worker_threads.html | worker threads} to use when + * running **Betterer**. + */ + workers: number; +} + /** * @public The context of a set of test suite runs. * @@ -40,15 +278,13 @@ export interface BettererContext { */ options(optionsOverride: BettererOptionsOverride): Promise; /** - * Stop the test run and clean everything up. If tests are running, waits for them to end before - * stopping. + * Stop the runner, but first wait for it to finish running the current suite. + * + * @returns the {@link @betterer/betterer#BettererContextSummary | `BettererContextSummary`} containing + * details of all successful runs. + * @throws the error if something went wrong while stopping everything. */ - stop(): Promise; -} - -export interface BettererContextStarted { - end(): Promise; - error(error: BettererError): Promise; + stop(): Promise; } /** diff --git a/packages/betterer/src/fs/config.ts b/packages/betterer/src/fs/config.ts new file mode 100644 index 000000000..53359d2c9 --- /dev/null +++ b/packages/betterer/src/fs/config.ts @@ -0,0 +1,137 @@ +import type { BettererConfigContext } from './../context/index.js'; +import type { + BettererConfigFS, + BettererConfigPaths, + BettererOptionsFS, + BettererOptionsWatcher, + BettererOptionsWatcherOverride +} from './types.js'; + +import { promises as fs } from 'node:fs'; +import path from 'node:path'; + +import { BettererError, invariantΔ } from '@betterer/errors'; + +import { + toArray, + validateBool, + validateDirectory, + validateFilePath, + validateString, + validateStringArray +} from '../config/index.js'; +import { getGlobals } from '../globals.js'; + +const BETTERER_CACHE = './.betterer.cache'; +const BETTERER_RESULTS = './.betterer.results'; +const BETTERER_TS = './.betterer.ts'; + +export async function createFSConfig( + configContext: BettererConfigContext, + options: BettererOptionsFS, + optionsWatcher: BettererOptionsWatcher +): Promise { + const cache = (!!options.cachePath || options.cache) ?? false; + const cachePath = options.cachePath ?? BETTERER_CACHE; + + const cwd = options.cwd ?? process.cwd(); + const configPaths = options.configPaths ? toArray(options.configPaths) : [BETTERER_TS]; + validateStringArray({ configPaths }); + const validatedConfigPaths = await validateConfigPaths(cwd, configPaths); + + const ignores = toArray(optionsWatcher.ignores); + const watch = optionsWatcher.watch ?? false; + + const resultsPath = options.resultsPath ?? BETTERER_RESULTS; + const [configPath] = validatedConfigPaths; + + const basePath = options.basePath ? path.resolve(cwd, options.basePath) : path.dirname(configPath); + await validateDirectory({ basePath }); + + const repoPath = options.repoPath ? path.resolve(cwd, options.repoPath) : basePath; + await validateDirectory({ repoPath }); + + validateString({ cwd }); + validateBool({ cache }); + validateStringArray({ cachePath }); + validateStringArray({ resultsPath }); + + const gitPath = configContext.precommit ? await validateGitRepo(repoPath) : null; + + validateStringArray({ ignores }); + validateBool({ watch }); + + // eslint-disable-next-line @typescript-eslint/no-deprecated -- deprecated and will be removed in V7 + const tsconfigPath = options.tsconfigPath ?? null; + + return { + basePath, + cache, + cachePath: path.resolve(cwd, cachePath), + cwd, + configPaths: validatedConfigPaths, + ignores, + repoPath, + resultsPath: path.resolve(cwd, resultsPath), + tsconfigPath: tsconfigPath != null ? path.resolve(cwd, tsconfigPath) : null, + versionControlPath: gitPath ?? null, + watch + }; +} + +export function overrideWatchConfig(optionsOverride: BettererOptionsWatcherOverride): void { + if (optionsOverride.ignores) { + const { config } = getGlobals(); + validateStringArray({ ignores: optionsOverride.ignores }); + config.ignores = toArray(optionsOverride.ignores); + } +} + +const JS_EXTENSIONS = ['.js', '.cjs', '.mjs']; +const TS_EXTENSIONS = ['.ts', '.tsx', '.cts', '.ctsx', '.mtx', '.mtsx']; +const IMPORT_EXTENSIONS = [...JS_EXTENSIONS, ...TS_EXTENSIONS]; + +async function validateConfigPaths(cwd: string, configPaths: Array): Promise { + const validatedConfigPaths = await Promise.all( + configPaths.map(async (configPath) => { + const absoluteConfigPath = path.resolve(cwd, configPath); + const { dir, name, ext } = path.parse(absoluteConfigPath); + + if (ext) { + try { + await validateFilePath({ absoluteConfigPath }); + return absoluteConfigPath; + } catch { + // Handle missing extension below + } + } + + try { + return await Promise.any( + IMPORT_EXTENSIONS.map(async (importExt) => { + const possibleConfigPath = path.join(dir, `${name}${importExt}`); + await validateFilePath({ possibleConfigPath }); + return possibleConfigPath; + }) + ); + } catch (error) { + throw new BettererError(`could not find config file at "${absoluteConfigPath}". 😔`, error as Error); + } + }) + ); + const [first, ...rest] = validatedConfigPaths.filter(Boolean); + invariantΔ(first, 'the existence of at least one config path should have been validated!'); + return [first, ...rest]; +} + +async function validateGitRepo(repoPath: string): Promise { + try { + const gitPath = path.join(repoPath, '.git'); + await fs.access(gitPath); + return repoPath; + } catch { + throw new BettererError( + `".git" directory not found in "${repoPath}". Precommit mode only works within a Git repository.` + ); + } +} diff --git a/packages/betterer/src/fs/file-cache-strategy.ts b/packages/betterer/src/fs/file-cache-strategy.ts new file mode 100644 index 000000000..2703b8f56 --- /dev/null +++ b/packages/betterer/src/fs/file-cache-strategy.ts @@ -0,0 +1,13 @@ +/** + * @public Different possible cache strategies to use for a {@link @betterer/betterer#BettererResolverTest | `BettererResolverTest`}. + */ +export enum BettererCacheStrategy { + /** + * Used when changes to one file cannot impact the results of other files, e.g. linting, syntax. Individual files results can be re-used if a file is unchanged. + */ + FilePath = 'FilePath', + /** + * Used when changes in one file *can* impact the results of other files, e.g. full compilation. Full test results can be re-used if all files are unchanged. + */ + FilePaths = 'FilePaths' +} diff --git a/packages/betterer/src/fs/file-cache.ts b/packages/betterer/src/fs/file-cache.ts index 3c64fe67a..c1bf32e25 100644 --- a/packages/betterer/src/fs/file-cache.ts +++ b/packages/betterer/src/fs/file-cache.ts @@ -1,16 +1,21 @@ +import type { BettererTestMeta } from '../test/index.js'; import type { - BettererFilePaths, - BettererTestCacheMap, + BettererCacheFile, BettererFileCache, + BettererFilePaths, BettererFileHashMap, - BettererCacheFile + BettererFileHashMapSerialised, + BettererTestCacheMap, + BettererTestCacheMapSerialised, + BettererFilePath } from './types.js'; -import assert from 'node:assert'; +import { invariantΔ } from '@betterer/errors'; import path from 'node:path'; -import { normalisedPath } from '../utils.js'; +import { normalisedPath, sortEntriesKeys } from '../utils.js'; import { read } from './reader.js'; import { write } from './writer.js'; +import { createCacheHash } from '../hasher.js'; const BETTERER_CACHE_VERSION = 2; @@ -28,57 +33,56 @@ const BETTERER_CACHE_VERSION = 2; // } // } // -// Each stored hash is the concatenated hash of the Betterer config files -// and the file at that path at the point it is written. It is written each -// time a test runs on a given file and the file gets better, stays the same, -// or gets updated. If the hash hasn't changed, then the config file hasn't -// changed, and the file hasn't changed, so running the test on the file again +// Each stored hash is the hash of contents of that path at the point it is written. +// It is written each time a test runs on a given file and the file gets better, stays the same, +// or gets updated. If the hash hasn't changed, then the file hasn't changed, so running the test on the file again // *should* have the same result. // // Of course the actual test itself could have changed so ... 🤷‍♂️ export class BettererFileCacheΩ implements BettererFileCache { - private _cachePath: string | null = null; - private _fileHashMap: BettererFileHashMap = {}; - private _memoryCacheMap: BettererTestCacheMap = {}; - private _reading: Promise | null = null; - - constructor(private _configPaths: BettererFilePaths) {} + private _fileHashMap: BettererFileHashMap = new Map(); + private _memoryCacheMap: BettererTestCacheMap = new Map(); + + private constructor( + private _cachePath: string, + cacheJson: string | null + ) { + this._memoryCacheMap = this._readCache(cacheJson); + } - public clearCache(testName: string): void { - delete this._memoryCacheMap[testName]; + public static async create(cachePath: string): Promise { + return new BettererFileCacheΩ(cachePath, await read(cachePath)); } - public async enableCache(cachePath: string): Promise { - this._cachePath = cachePath; - this._memoryCacheMap = await this._readCache(this._cachePath); + public clearCache(testName: string): void { + this._memoryCacheMap.delete(testName); } public async writeCache(): Promise { - if (!this._cachePath) { - return; - } - // Clean up any expired cache entries before writing to disk: - Object.keys(this._memoryCacheMap).forEach((testName) => { - const testCache = this._memoryCacheMap[testName]; - Object.keys(testCache).forEach((filePath) => { - const hash = this._fileHashMap[filePath]; - if (hash === null) { - delete this._memoryCacheMap[filePath]; + [...this._memoryCacheMap.entries()].forEach(([, fileHashMap]) => { + [...fileHashMap.entries()].forEach(([filePath]) => { + const hash = this._fileHashMap.get(filePath); + if (hash == null) { + this._memoryCacheMap.delete(filePath); } }); }); - const relativeTestCache: BettererTestCacheMap = {}; - Object.keys(this._memoryCacheMap).forEach((testName) => { - const absoluteFileHashMap = this._memoryCacheMap[testName]; - const relativeFileHashMap: BettererFileHashMap = {}; - Object.keys(absoluteFileHashMap).forEach((absoluteFilePath) => { - assert(this._cachePath); - const relativePath = normalisedPath(path.relative(path.dirname(this._cachePath), absoluteFilePath)); - relativeFileHashMap[relativePath] = absoluteFileHashMap[absoluteFilePath]; - }); + // Convert Map to Record so it can be serialised to disk: + const relativeTestCache: BettererTestCacheMapSerialised = {}; + [...this._memoryCacheMap.entries()].sort(sortEntriesKeys).forEach(([testName, absoluteFileHashMap]) => { + const relativeFileHashMap: BettererFileHashMapSerialised = {}; + [...absoluteFileHashMap.entries()] + .map(([absoluteFilePath, hash]): [string, string] => { + const relativePath = normalisedPath(path.relative(path.dirname(this._cachePath), absoluteFilePath)); + return [relativePath, hash] as [string, string]; + }) + .sort(sortEntriesKeys) + .forEach(([relativePath, hash]) => { + relativeFileHashMap[relativePath] = hash; + }); relativeTestCache[testName] = relativeFileHashMap; }); const cache = { version: BETTERER_CACHE_VERSION, testCache: relativeTestCache }; @@ -86,99 +90,85 @@ export class BettererFileCacheΩ implements BettererFileCache { await write(cacheString, this._cachePath); } - public filterCached(testName: string, filePaths: BettererFilePaths): BettererFilePaths { - if (!this._cachePath) { + public async filterCached(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise { + const { name } = testMeta; + const testCache = this._memoryCacheMap.get(name) ?? (new Map() as BettererTestCacheMap); + + const configHash = testCache.get(testMeta.configPath); + if (configHash !== testMeta.configHash) { return filePaths; } - const testCache = this._memoryCacheMap[testName] || {}; - return filePaths.filter((filePath) => { - const hash = this._fileHashMap[filePath]; - - // If hash is null, then the file isn't tracked by version control *and* it can't be read, - // so it probably doesn't exist - if (hash === null) { - return true; - } - - const previousHash = testCache[filePath]; - return hash !== previousHash; - }); + const cacheMisses: Array = []; + await Promise.all( + filePaths.map(async (filePath) => { + const contents = await read(filePath); + if (contents == null) { + return; + } + const hash = createCacheHash(contents); + const previousHash = testCache.get(filePath); + if (hash !== previousHash) { + cacheMisses.push(filePath); + } + }) + ); + return cacheMisses; } - public updateCache(testName: string, filePaths: BettererFilePaths): void { - if (!this._cachePath) { - return; + public async updateCache(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise { + const { name } = testMeta; + if (!this._memoryCacheMap.get(name)) { + this._memoryCacheMap.set(name, new Map()); } - this._memoryCacheMap[testName] = this._memoryCacheMap[testName] || {}; - const testCache = this._memoryCacheMap[testName]; - - const existingFilePaths = Object.keys(testCache); + const testCache = this._memoryCacheMap.get(name); + invariantΔ(testCache, '`testCache` entry should have been validated above!', testCache); + const existingFilePaths = [...testCache.keys()]; const cacheFilePaths = Array.from(new Set([...existingFilePaths, ...filePaths])).sort(); - const updatedCache: BettererFileHashMap = {}; - cacheFilePaths.forEach((filePath) => { - const hash = this._fileHashMap[filePath]; - - // If hash is null, then the file isn't tracked by version control *and* it can't be read, - // so it probably doesn't exist - if (hash === null) { - return; - } + const updatedCache: BettererFileHashMap = new Map(); + await Promise.all( + cacheFilePaths.map(async (filePath) => { + const contents = await read(filePath); + if (contents === null) { + return; + } - updatedCache[filePath] = hash; - }); + const hash = createCacheHash(contents); + updatedCache.set(filePath, hash); + }) + ); - this._memoryCacheMap[testName] = updatedCache; - } + updatedCache.set(testMeta.configPath, testMeta.configHash); - public setHashes(newHashes: BettererFileHashMap): void { - if (!this._cachePath) { - return; - } - const configHash = this._getConfigHash(newHashes); - this._fileHashMap = {}; - Object.keys(newHashes).forEach((absolutePath) => { - this._fileHashMap[absolutePath] = `${configHash}${newHashes[absolutePath]}`; - }); + this._memoryCacheMap.set(name, updatedCache); } - private async _readCache(cachePath: string): Promise { - if (!this._reading) { - this._reading = read(cachePath); - } - const cache = await this._reading; - this._reading = null; - if (!cache) { - return {}; + private _readCache(cacheJSON: string | null): BettererTestCacheMap { + if (!cacheJSON) { + return new Map(); } - const parsedCache = JSON.parse(cache) as BettererCacheFile; - const { version } = parsedCache; + const parsed = JSON.parse(cacheJSON) as BettererCacheFile; + const { version } = parsed; if (!version) { - return {}; + return new Map(); } - const relativeTestCacheMap = parsedCache.testCache; - - // Transform relative paths back into absolute paths: - const absoluteTestCacheMap: BettererTestCacheMap = {}; - Object.keys(relativeTestCacheMap).forEach((testName) => { - const relativeFileHashMap = relativeTestCacheMap[testName]; - const absoluteFileHashMap: BettererFileHashMap = {}; - Object.keys(relativeFileHashMap).forEach((relativePath) => { - assert(this._cachePath); + // Transform serialised Record with relative paths back into + // Map with absolute paths: + const absoluteTestCacheMap: BettererTestCacheMap = new Map(); + Object.entries(parsed.testCache).forEach(([testName, serialisedEntries]) => { + const absoluteFileHashMap: BettererFileHashMap = new Map(); + Object.entries(serialisedEntries).forEach(([relativePath, hash]) => { + invariantΔ(this._cachePath, `\`this._cachePath\` should have been validated above!`, this._cachePath); const absolutePath = normalisedPath(path.resolve(path.dirname(this._cachePath), relativePath)); - absoluteFileHashMap[absolutePath] = relativeFileHashMap[relativePath]; + absoluteFileHashMap.set(absolutePath, hash); }); - absoluteTestCacheMap[testName] = absoluteFileHashMap; + absoluteTestCacheMap.set(testName, absoluteFileHashMap); }); return absoluteTestCacheMap; } - - private _getConfigHash(newFileHashMap: BettererFileHashMap): string { - return this._configPaths.map((configPath) => newFileHashMap[normalisedPath(configPath)]).join(''); - } } diff --git a/packages/betterer/src/fs/file-resolver.ts b/packages/betterer/src/fs/file-resolver.ts index 0a82b45ba..6480bf0ed 100644 --- a/packages/betterer/src/fs/file-resolver.ts +++ b/packages/betterer/src/fs/file-resolver.ts @@ -1,68 +1,81 @@ +import type { BettererTestMeta } from '../test/index.js'; import type { BettererFileGlobs, + BettererFilePath, BettererFilePaths, BettererFilePatterns, - BettererFileResolver, - BettererVersionControlWorker + BettererFileResolver } from './types.js'; -import assert from 'node:assert'; import minimatch from 'minimatch'; import path from 'node:path'; -import { flatten, normalisedPath } from '../utils.js'; +import { getGlobals } from '../globals.js'; +import { flatten, isString, normalisedPath } from '../utils.js'; +import { BettererCacheStrategy } from './file-cache-strategy.js'; +import { getTmpPath } from './temp.js'; +const INCLUDE_ALL = '**/*'; export class BettererFileResolverΩ implements BettererFileResolver { - private _excluded: Array = []; - private _included: Array = []; + private _cacheStrategy: BettererCacheStrategy | null = null; + private _excluded: Array = []; + private _excludedResolved: Array | null = null; + private _included: Array = [INCLUDE_ALL]; private _includedResolved: Array | null = null; private _validatedFilePaths: Array = []; private _validatedFilePathsMap: Record = {}; - constructor( - private _baseDirectory: string | null = null, - private _versionControl: BettererVersionControlWorker | null = null - ) {} + constructor(public readonly baseDirectory: string) {} - public get baseDirectory(): string { - assert(this._baseDirectory); - return this._baseDirectory; + public get isCacheable(): boolean { + return this._cacheStrategy !== null; } - public get versionControl(): BettererVersionControlWorker { - assert(this._versionControl); - return this._versionControl; - } - - public init(directory: string, versionControl: BettererVersionControlWorker | null): void { - this._baseDirectory = directory; - this._versionControl = versionControl; + public cache(strategy: BettererCacheStrategy): void { + this._cacheStrategy = strategy; } public async validate(filePaths: BettererFilePaths): Promise { - // If `include()` was never called, just filter the given list: - if (!this._included.length) { - const validFilePaths = await this.versionControl.api.filterIgnored(filePaths); - return validFilePaths.filter((filePath) => !this._isExcluded(filePath)); + if (!filePaths.length) { + return filePaths; } + await this._update(); return filePaths.filter((filePath) => this._validatedFilePathsMap[filePath]); } + public included(filePaths: BettererFilePaths): BettererFilePaths { + if (!this._included.length) { + return filePaths; + } + return filePaths.filter((filePath) => this._isIncluded(filePath) && !this._isExcluded(filePath)); + } + public resolve(...pathSegments: Array): string { return normalisedPath(path.resolve(this.baseDirectory, ...pathSegments)); } + public relative(to: string): string { + return normalisedPath(path.relative(this.baseDirectory, to)); + } + public include(...includePatterns: BettererFileGlobs): this { + if (!includePatterns.length) { + return this; + } + + if (this._included.length === 1 && this._included.includes(INCLUDE_ALL)) { + this._included = []; + } + this._included = [...this._included, ...flatten(includePatterns)]; + this._includedResolved = null; return this; } public exclude(...excludePatterns: BettererFilePatterns): this { - if (!this._included.length) { - this.include('**/*'); - } this._excluded = [...this._excluded, ...flatten(excludePatterns)]; + this._excludedResolved = null; return this; } @@ -71,17 +84,46 @@ export class BettererFileResolverΩ implements BettererFileResolver { return this._validatedFilePaths; } + public async filterCached(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise { + const { fs } = getGlobals(); + + // If file changes do not impact other files e.g. linting, RegExp/syntax checks, + if (this._cacheStrategy === BettererCacheStrategy.FilePath) { + // then only changed files need to be tested: + const cacheMisses = await fs.api.filterCached(testMeta, filePaths); + return cacheMisses; + } + + // If file changes might impact another file: e.g. full compilation + if (this._cacheStrategy === BettererCacheStrategy.FilePaths) { + // Then it's all or nothing: + const cacheMisses = await fs.api.filterCached(testMeta, await this.files()); + const allFilesCached = cacheMisses.length === 0; + return allFilesCached ? [] : filePaths; + } + + return filePaths; + } + + public async tmp(filePath = ''): Promise { + const tmpPath = await getTmpPath(filePath); + return this.relative(tmpPath); + } + private async _update(): Promise { + const { fs } = getGlobals(); + this._validatedFilePathsMap = {}; - const filePaths = await this.versionControl.api.getFilePaths(); + const filePaths = await fs.api.getFilePaths(); + const validatedFilePaths: Array = []; filePaths.forEach((filePath) => { - this._validatedFilePathsMap[filePath] = this._isIncluded(filePath); - }); - this._validatedFilePaths = Object.keys(this._validatedFilePathsMap).filter((filePath) => { - const included = this._validatedFilePathsMap[filePath] && !this._isExcluded(filePath); - this._validatedFilePathsMap[filePath] = included; - return included; + const includedAndNotExcluded = this._isIncluded(filePath) && !this._isExcluded(filePath); + this._validatedFilePathsMap[filePath] = includedAndNotExcluded; + if (includedAndNotExcluded) { + validatedFilePaths.push(filePath); + } }); + this._validatedFilePaths = validatedFilePaths.sort(); } private _isIncluded(filePath: string): boolean { @@ -92,6 +134,11 @@ export class BettererFileResolverΩ implements BettererFileResolver { } private _isExcluded(filePath: string): boolean { - return this._excluded.some((exclude: RegExp) => exclude.test(filePath)); + if (!this._excludedResolved) { + this._excludedResolved = this._excluded.map((pattern) => (isString(pattern) ? this.resolve(pattern) : pattern)); + } + return this._excluded.some((pattern) => + isString(pattern) ? minimatch(filePath, pattern) : pattern.test(filePath) + ); } } diff --git a/packages/betterer/src/fs/fs.ts b/packages/betterer/src/fs/fs.ts new file mode 100644 index 000000000..14a3980da --- /dev/null +++ b/packages/betterer/src/fs/fs.ts @@ -0,0 +1,51 @@ +import type { BettererFilePath, BettererFilePaths, BettererFS } from './types.js'; + +import path from 'node:path'; +import ignoreWalk from 'ignore-walk'; + +import { normalisedPath } from '../utils.js'; + +export class BettererFSΩ implements BettererFS { + private _filePaths: BettererFilePaths = []; + private _syncing: Promise | null = null; + + private constructor(private _basePath: BettererFilePath) {} + + public static async create(fsPath: BettererFilePath): Promise { + const fs = new BettererFSΩ(fsPath); + await fs.sync(); + return fs; + } + + public getFilePaths(): BettererFilePaths { + return this._filePaths; + } + + public async sync(): Promise { + if (this._syncing) { + await this._syncing; + return; + } + this._syncing = this._sync(); + await this._syncing; + this._syncing = null; + } + + private async _sync(): Promise { + // Collect all relevant files within the `basePath`: + const filePaths = await new Promise((resolve, reject) => { + const walker = new ignoreWalk.Walker({ + path: this._basePath, + ignoreFiles: ['.gitignore', ''] + }); + // Force `walker` to ignore anything inside a `.git` folder: + walker.onReadIgnoreFile('', '.git', () => void 0); + walker.on('done', resolve).on('error', reject).start(); + }); + this._filePaths = filePaths.map((filePath) => toAbsolutePath(this._basePath, filePath)); + } +} + +function toAbsolutePath(basePath: string, relativePath: string): string { + return normalisedPath(path.join(basePath, relativePath.trimStart())); +} diff --git a/packages/betterer/src/fs/fs.worker.ts b/packages/betterer/src/fs/fs.worker.ts new file mode 100644 index 000000000..89e9e73f4 --- /dev/null +++ b/packages/betterer/src/fs/fs.worker.ts @@ -0,0 +1,92 @@ +import type { BettererConfig } from '../config/index.js'; +import type { BettererTestMeta } from '../test/index.js'; +import type { BettererFileCache, BettererFilePaths, BettererFS, BettererVersionControl } from './types.js'; + +import { invariantΔ } from '@betterer/errors'; +import { exposeToMainΔ } from '@betterer/worker'; + +import { BettererGitΩ } from './git.js'; +import { BettererFileCacheΩ } from './file-cache.js'; +import { BettererFSΩ } from './fs.js'; + +let fs: BettererFS | null = null; +let versionControl: BettererVersionControl | null = null; +let cache: BettererFileCache | null = null; + +/** @knipignore part of worker API */ +export async function init(config: BettererConfig): Promise { + fs = await BettererFSΩ.create(config.basePath); + if (config.cache) { + cache = await BettererFileCacheΩ.create(config.cachePath); + } + if (config.precommit && config.versionControlPath) { + versionControl = new BettererGitΩ(config.versionControlPath); + } +} + +/** @knipignore part of worker API */ +export function add(resultsPath: string): Promise { + checkInitialisedVersionControl(versionControl); + return versionControl.add(resultsPath); +} + +/** @knipignore part of worker API */ +export function getFilePaths(): BettererFilePaths { + checkInitialisedFS(fs); + return fs.getFilePaths(); +} + +/** @knipignore part of worker API */ +export function sync(): Promise { + checkInitialisedFS(fs); + return fs.sync(); +} + +/** @knipignore part of worker API */ +export function clearCache(testName: string): void { + checkInitialisedCache(cache); + cache.clearCache(testName); +} + +/** @knipignore part of worker API */ +export function filterCached(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise { + checkInitialisedCache(cache); + return cache.filterCached(testMeta, filePaths); +} + +/** @knipignore part of worker API */ +export async function updateCache(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise { + checkInitialisedCache(cache); + await cache.updateCache(testMeta, filePaths); +} + +/** @knipignore part of worker API */ +export function writeCache(): Promise { + checkInitialisedCache(cache); + return cache.writeCache(); +} + +function checkInitialisedVersionControl( + versionControl: BettererVersionControl | null +): asserts versionControl is BettererVersionControl { + invariantΔ(versionControl, '`init` must be called before using version control!'); +} + +function checkInitialisedCache(cache: BettererFileCache | null): asserts cache is BettererFileCache { + invariantΔ(cache, '`init` must be called before using cache!'); +} + +function checkInitialisedFS(fs: BettererFS | null): asserts fs is BettererFS { + invariantΔ(fs, '`init` must be called before using file system!'); +} + +exposeToMainΔ({ + init, + add, + getFilePaths, + sync, + clearCache, + filterCached, + updateCache, + writeCache +}); diff --git a/packages/betterer/src/fs/git.ts b/packages/betterer/src/fs/git.ts index e1ad7ca5b..6b88cc6c3 100644 --- a/packages/betterer/src/fs/git.ts +++ b/packages/betterer/src/fs/git.ts @@ -1,192 +1,17 @@ import type { SimpleGit } from 'simple-git'; -import type { BettererFileCache, BettererFilePaths, BettererVersionControl } from './types.js'; +import type { BettererFilePath, BettererVersionControl } from './types.js'; -import { BettererError } from '@betterer/errors'; -import assert from 'node:assert'; -import { promises as fs } from 'node:fs'; -import path from 'node:path'; import { simpleGit } from 'simple-git'; -import { createHash } from '../hasher.js'; -import { normalisedPath } from '../utils.js'; -import { BettererFileCacheΩ } from './file-cache.js'; -import { read } from './reader.js'; - export class BettererGitΩ implements BettererVersionControl { - private _cache: BettererFileCache | null = null; - private _configPaths: BettererFilePaths = []; - private _fileMap: Record = {}; - private _filePaths: Array = []; - private _git: SimpleGit | null = null; - private _gitDir: string | null = null; - private _rootDir: string | null = null; - private _syncing: Promise | null = null; - - public async add(resultsPath: string): Promise { - assert(this._git); - await this._git.add(resultsPath); - } - - public filterCached(testName: string, filePaths: BettererFilePaths): BettererFilePaths { - assert(this._cache); - return this._cache.filterCached(testName, filePaths); - } - - public filterIgnored(filePaths: BettererFilePaths): BettererFilePaths { - return filePaths.filter((absolutePath) => this._fileMap[absolutePath]); - } - - public clearCache(testName: string): void { - assert(this._cache); - this._cache.clearCache(testName); - } + private _git: SimpleGit; - public async enableCache(cachePath: string): Promise { - assert(this._cache); - return await this._cache.enableCache(cachePath); + public constructor(versionControlPath: BettererFilePath) { + this._git = simpleGit(versionControlPath); } - public updateCache(testName: string, filePaths: BettererFilePaths): void { - assert(this._cache); - return this._cache.updateCache(testName, filePaths); - } - - public writeCache(): Promise { - assert(this._cache); - return this._cache.writeCache(); - } - - public getFilePaths(): BettererFilePaths { - return this._filePaths; - } - - public async init(configPaths: BettererFilePaths, cwd: string): Promise { - this._configPaths = configPaths; - this._gitDir = await this._findGitRoot(cwd); - this._rootDir = path.dirname(this._gitDir); - this._git = simpleGit(this._rootDir); - this._cache = new BettererFileCacheΩ(this._configPaths); - await this._init(this._git); - await this.sync(); - return this._rootDir; - } - - public async sync(): Promise { - if (this._syncing) { - return await this._syncing; - } - this._syncing = this._sync(); - await this._syncing; - this._syncing = null; - } - - private async _findGitRoot(cwd: string): Promise { - let dir = cwd; - while (dir !== path.parse(dir).root) { - try { - const gitPath = path.join(dir, '.git'); - await fs.access(gitPath); - return gitPath; - } catch (err) { - dir = path.join(dir, '..'); - } - } - throw new BettererError('.git directory not found. Betterer must be used within a git repository.'); - } - - private async _getFileHash(filePath: string): Promise { - const content = await read(filePath); - if (content == null) { - return null; - } - - return createHash(content); - } - - private async _init(git: SimpleGit): Promise { - const retries = 3; - for (let i = 0; i < retries; i++) { - try { - await git.init(); - } catch (error) { - if (i >= retries) { - throw error; - } - } - } - } - - private _toFilePaths(rootDir: string, lines: Array): Array { - return lines.map((line) => toAbsolutePath(rootDir, line)); - } - - private _toLines(output: string): Array { - if (output.length === 0) { - return []; - } - return Array.from(new Set(output.trimEnd().split('\n'))); - } - - private async _sync(): Promise { - this._fileMap = {}; - this._filePaths = []; - - assert(this._cache); - assert(this._git); - assert(this._rootDir); - const treeOutput = await this._git.raw(['ls-tree', '--full-tree', '-r', 'HEAD']); - const fileInfo = this._toLines(treeOutput).map((info) => info.split(/\s/)); - - const fileHashes: Record = {}; - - // Collect hashes from git: - fileInfo.forEach((fileInfo) => { - const [, , hash, relativePath] = fileInfo; - assert(this._rootDir); - const absolutePath = toAbsolutePath(this._rootDir, relativePath); - fileHashes[absolutePath] = hash; - return absolutePath; - }); - - // Collect hashes for modified files: - const modifiedOutput = await this._git.raw(['ls-files', '--modified']); - const modifiedFilePaths = this._toFilePaths(this._rootDir, this._toLines(modifiedOutput)); - await Promise.all( - modifiedFilePaths.map(async (absolutePath) => { - fileHashes[absolutePath] = await this._getFileHash(absolutePath); - }) - ); - - // Collect all tracked files, excluding files that have been deleted, *and* all untracked files: - const allFilesOutput = await this._git.raw(['ls-files', '--cached', '--others', '--exclude-standard']); - const allFilePaths = this._toFilePaths(this._rootDir, this._toLines(allFilesOutput)); - await Promise.all( - allFilePaths.map(async (absolutePath) => { - // If file is tracked: - // `fileHashes[absolutePath]` = the git hash. - // If file was tracked and is now deleted: - // `fileHashes[absolutePath]` = null - // `this._getFileHash(absolutePath)` = null - // If file is untracked and is new: - // `fileHashes[absolutePath]` = null - // `this._getFileHash(absolutePath) = basic hash - const hash = fileHashes[absolutePath] || (await this._getFileHash(absolutePath)); - - // If hash is null then the file was deleted so it shouldn't be included: - if (hash == null) { - return; - } - this._fileMap[absolutePath] = hash; - this._filePaths.push(absolutePath); - }) - ); - - const cacheΩ = this._cache as BettererFileCacheΩ; - cacheΩ.setHashes(this._fileMap); + public async add(resultsPath: string): Promise { + await this._git.add(resultsPath); } } - -function toAbsolutePath(rootDir: string, relativePath: string): string { - return normalisedPath(path.join(rootDir, relativePath.trimStart())); -} diff --git a/packages/betterer/src/fs/import.ts b/packages/betterer/src/fs/import.ts new file mode 100644 index 000000000..f629af0d9 --- /dev/null +++ b/packages/betterer/src/fs/import.ts @@ -0,0 +1,115 @@ +import { BettererError } from '@betterer/errors'; +import { promises as fs } from 'node:fs'; +import { Module } from 'node:module'; +import path from 'node:path'; +import url from 'node:url'; + +import { createCacheHash } from '../hasher.js'; +import { read } from './reader.js'; +import { getTmpFileName } from './temp.js'; + +interface ESModule { + default: unknown; +} + +interface ModulePrivate { + _compile(source: string, path: string): void; +} + +type ESBuild = typeof import('esbuild'); + +export async function importTranspiledHashed(importPath: string): Promise<[unknown, string]> { + const esbuild = await importESBuild(); + if (!esbuild) { + const contents = await read(importPath); + if (contents == null) { + throw new BettererError(`could not read "${importPath}". 😔`); + } + + const hash = createCacheHash(contents); + return [await importDefault(importPath), hash]; + } + + try { + return await importFrom(importPath, esbuild); + } catch (error) { + throw new BettererError(`could not import "${importPath}". 😔`, error as Error); + } +} + +export async function importTranspiled(importPath: string): Promise { + const [result] = await importTranspiledHashed(importPath); + return result; +} + +export async function importDefault(importPath: string): Promise { + try { + let importId = importPath; + if (path.extname(importId)) { + // Absolute paths on Windows must be transformed to a URL before importing: + importId = url.pathToFileURL(importId).toString(); + } + const m = (await import(importId)) as unknown; + return getDefaultExport(m); + } catch (error) { + throw new BettererError(`could not import "${importPath}". 😔`, error as Error); + } +} + +let count = 0; +export function importText(filePath: string, text: string): unknown { + const id = String(count++); + const { base, dir, ext } = path.parse(filePath); + const m = new Module(path.join(dir, `${base}.${id}.${ext}`)); + (m as unknown as ModulePrivate)._compile(text, id); + return getDefaultExport(m.exports); +} + +function getDefaultExport(module: unknown): unknown { + return (module as ESModule).default || module; +} + +async function importFrom(importPath: string, esbuild: ESBuild): Promise<[unknown, string]> { + const outfile = getTmpFileName(importPath, '.mjs'); + const cleanup = async () => { + await fs.rm(outfile); + }; + + try { + await esbuild.build({ + bundle: true, + format: 'esm', + entryPoints: [importPath], + outfile, + packages: 'external', + platform: 'node', + logLevel: 'silent', + jsx: 'automatic' + }); + + const transpiled = await read(outfile); + if (transpiled === null) { + throw new BettererError(`could not read "${importPath}". 😔`); + } + + const hash = createCacheHash(transpiled); + const result = await importDefault(outfile); + return [result, hash]; + } catch (error) { + throw new BettererError((error as Error).message); + } finally { + try { + await cleanup(); + } catch { + // No file was actually created! + } + } +} + +async function importESBuild(): Promise { + try { + return await import('esbuild'); + } catch { + return null; + } +} diff --git a/packages/betterer/src/fs/index.ts b/packages/betterer/src/fs/index.ts index 3a043ee75..08455b18a 100644 --- a/packages/betterer/src/fs/index.ts +++ b/packages/betterer/src/fs/index.ts @@ -1,5 +1,28 @@ +export type { + BettererConfigFS, + BettererConfigIgnores, + BettererConfigPaths, + BettererFileGlobs, + BettererFilePath, + BettererFilePaths, + BettererFilePatterns, + BettererFileResolver, + BettererFSWorker, + BettererOptionsFS, + BettererOptionsIgnores, + BettererOptionsPaths, + BettererOptionsWatcher, + BettererOptionsWatcherOverride +} from './types.js'; + +export { createFSConfig, overrideWatchConfig } from './config.js'; +export { BettererCacheStrategy } from './file-cache-strategy.js'; export { BettererFileResolverΩ } from './file-resolver.js'; -export { read } from './reader.js'; -export { BettererFileGlobs, BettererFilePaths, BettererFilePatterns, BettererFileResolver } from './types.js'; +export { BettererResultsFileΩ } from './results-file.js'; +export { importDefault, importTranspiled, importTranspiledHashed } from './import.js'; +export { merge } from './merge.js'; +export { parse } from './parse.js'; +export { read, readdir } from './reader.js'; +export { isTempFilePath } from './temp.js'; export { forceRelativePaths, write } from './writer.js'; -export { BettererVersionControlWorker } from './types.js'; +export { WATCHER_EVENTS, createWatcher } from './watcher.js'; diff --git a/packages/betterer/src/fs/merge.ts b/packages/betterer/src/fs/merge.ts new file mode 100644 index 000000000..ab0d945df --- /dev/null +++ b/packages/betterer/src/fs/merge.ts @@ -0,0 +1,9 @@ +import { importText } from './import.js'; + +/** + * Takes two strings of JavaScript, evaluates their contents, and merges the results, + * with the latter taking precedence. + */ +export function merge(filePath: string, ours: string, theirs: string): unknown { + return { ...(importText(filePath, ours) as object), ...(importText(filePath, theirs) as object) }; +} diff --git a/packages/betterer/src/results/parse.ts b/packages/betterer/src/fs/parse.ts similarity index 66% rename from packages/betterer/src/results/parse.ts rename to packages/betterer/src/fs/parse.ts index 7a99ee239..5c0e6e6bc 100644 --- a/packages/betterer/src/results/parse.ts +++ b/packages/betterer/src/fs/parse.ts @@ -1,19 +1,21 @@ -import type { BettererResultsSerialised } from './types.js'; +import type { BettererFilePath } from './index.js'; import { BettererError } from '@betterer/errors'; import assert from 'node:assert'; -import { read } from '../fs/index.js'; -import { importText } from '../import.js'; -import { mergeResults } from './merge.js'; +import { read } from './index.js'; +import { importText } from './import.js'; +import { merge } from './merge.js'; const MERGE_CONFLICT_ANCESTOR = '|||||||'; const MERGE_CONFLICT_END = '>>>>>>>'; const MERGE_CONFLICT_SEP = '======='; const MERGE_CONFLICT_START = '<<<<<<<'; +const PARSE_CACHE = new Map(); + /** - * Parses the contents of a given results file path. If the file doesn't exist, it will + * Parses the contents of a given file path. If the file doesn't exist, it will * return an empty object. If the file exists, but has merge conflicts, it will merge the * files using {@link mergeResults | `mergeResults`}. * @@ -21,25 +23,36 @@ const MERGE_CONFLICT_START = '<<<<<<<'; * Throws if the results file cannot be parsed, or if it contains merge conflicts that * can't be resolved. */ -export async function parseResults(resultsPath: string): Promise { - const contents = await read(resultsPath); +export async function parse(filePath: BettererFilePath): Promise { + const contents = await read(filePath); if (!contents) { return {}; } + const cached = PARSE_CACHE.get(contents); + if (cached) { + return cached; + } + + const parsed = parseContents(filePath, contents); + PARSE_CACHE.set(contents, parsed); + return parsed; +} + +function parseContents(filePath: BettererFilePath, contents: string): unknown { if (hasMergeConflicts(contents)) { try { const [ours, theirs] = extractConflicts(contents); - return mergeResults(ours, theirs); + return merge(filePath, ours, theirs); } catch (error) { - throw new BettererError(`could not resolve merge conflict in "${resultsPath}". 😔`, error as Error); + throw new BettererError(`could not resolve merge conflict in "${filePath}". 😔`, error as Error); } } try { - return await importText(contents); - } catch { - throw new BettererError(`could not read results from "${resultsPath}". 😔`); + return importText(filePath, contents); + } catch (error) { + throw new BettererError(`could not read results from "${filePath}". 😔`, error as Error); } } @@ -47,10 +60,10 @@ function hasMergeConflicts(str: string): boolean { return str.includes(MERGE_CONFLICT_START) && str.includes(MERGE_CONFLICT_SEP) && str.includes(MERGE_CONFLICT_END); } -function extractConflicts(file: string): [string, string] { +function extractConflicts(contents: string): [string, string] { const ours = []; const theirs = []; - const lines = file.split(/\r?\n/g); + const lines = contents.split(/\r?\n/g); let skip = false; while (lines.length) { diff --git a/packages/betterer/src/fs/public.ts b/packages/betterer/src/fs/public.ts deleted file mode 100644 index cd346c548..000000000 --- a/packages/betterer/src/fs/public.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { - BettererFileGlobs, - BettererFilePath, - BettererFilePaths, - BettererFilePatterns, - BettererFileResolver -} from './types.js'; diff --git a/packages/betterer/src/fs/reader.ts b/packages/betterer/src/fs/reader.ts index 8c31951ca..35b20c551 100644 --- a/packages/betterer/src/fs/reader.ts +++ b/packages/betterer/src/fs/reader.ts @@ -9,8 +9,9 @@ export async function read(filePath: string): Promise { try { const stat = await fs.stat(filePath); const modifiedTime = stat.mtime.getTime(); - if (READ_CACHE_TIME[filePath] === modifiedTime) { - return READ_CACHE[filePath]; + const cached = READ_CACHE[filePath]; + if (READ_CACHE_TIME[filePath] === modifiedTime && cached) { + return cached; } const contents = await fs.readFile(filePath, 'utf-8'); @@ -22,3 +23,13 @@ export async function read(filePath: string): Promise { return null; } } + +export async function readdir(dirPath: string): Promise { + try { + const stat = await fs.stat(dirPath); + const isDirectory = stat.isDirectory(); + return isDirectory || null; + } catch { + return null; + } +} diff --git a/packages/betterer/src/fs/results-file.ts b/packages/betterer/src/fs/results-file.ts new file mode 100644 index 000000000..716cf6d66 --- /dev/null +++ b/packages/betterer/src/fs/results-file.ts @@ -0,0 +1,11 @@ +import type { BettererResultsSerialised } from '../results/index.js'; + +import { parse } from './parse.js'; + +export class BettererResultsFileΩ { + constructor(private readonly _resultsPath: string) {} + + public async parse(): Promise { + return (await parse(this._resultsPath)) as BettererResultsSerialised; + } +} diff --git a/packages/betterer/src/fs/temp.ts b/packages/betterer/src/fs/temp.ts new file mode 100644 index 000000000..f0e22cf27 --- /dev/null +++ b/packages/betterer/src/fs/temp.ts @@ -0,0 +1,27 @@ +import { promises as fs } from 'node:fs'; +import os from 'node:os'; +import crypto from 'node:crypto'; +import path from 'node:path'; + +const BETTERER_TEMP_DIR = 'betterer'; +const BETTERER_TMP_EXT = '.betterer.tmp'; + +export function getTmpFileName(name: string, ext: string) { + const id = crypto.randomBytes(4).toString('hex'); + return `${name}.${id}${BETTERER_TMP_EXT}${ext}`; +} + +export function isTempFilePath(filePath: string): boolean { + const { base } = path.parse(filePath); + return base.includes(BETTERER_TMP_EXT); +} + +export async function getTmpPath(fileName = ''): Promise { + const bettererTmpDirPath = path.join(os.tmpdir(), BETTERER_TEMP_DIR); + await fs.mkdir(bettererTmpDirPath, { recursive: true }); + if (!fileName) { + return bettererTmpDirPath; + } + const { name, ext } = path.parse(fileName); + return path.join(bettererTmpDirPath, getTmpFileName(name, ext)); +} diff --git a/packages/betterer/src/fs/types.ts b/packages/betterer/src/fs/types.ts index a7b69297f..3eb58b1e7 100644 --- a/packages/betterer/src/fs/types.ts +++ b/packages/betterer/src/fs/types.ts @@ -1,9 +1,217 @@ import type { BettererWorkerAPI } from '@betterer/worker'; +import type { BettererTestMeta } from '../test/index.js'; + +/** + * @public A path to a {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file } + * containing **Betterer** tests, or an array of them. + */ +export type BettererOptionsPaths = Array | string; + +/** + * @public **Betterer** options for creating a `BettererFS`. + * + * @remarks The options object will be validated by **Betterer** and will be available on the + * {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export interface BettererOptionsFS { + /** + * The path to the directory containing the code to be covered by **Betterer**. + * By default this is the directory that contains the first given {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file }, + * + * All `include`, `exclude`, and `ignore` patterns are matched relative to the `basePath`. + * + * @remarks When overriding `basePath`, the path will be resolved relative to the `cwd`. + * + * @defaultValue `const [first] = options.configPath; const basePath = path.dirname(first)` + */ + basePath?: string; + /** + * When `true`, caching will be enabled for {@link @betterer/betterer#BettererFileTest | `BettererFileTest`s}. + * Betterer will only check files that have changes since the last test run. **Betterer** will + * create a cache file at the given `cachePath`. + * + * @defaultValue `false` + */ + cache?: boolean; + /** + * The path to where the **Betterer** cache file will be saved. Only used when `cache` is `true`. + * + * @remarks When overriding `cachePath`, the path will be resolved relative to the `cwd`. + * + * @defaultValue `'./.betterer.cache'` + */ + cachePath?: string; + /** + * A path to a {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file } + * containing **Betterer** tests, or an array of them. + * + * @remarks When overriding `configPaths`, the paths will be resolved relative to the `cwd`. + * + * @defaultValue `['./.betterer.ts']` + */ + configPaths?: BettererOptionsPaths; + /** + * The current working directory. + * + * @remarks All other path options will be resolved relative to the given `cwd`. + * + * @defaultValue {@link https://nodejs.org/api/process.html#process_process_cwd | `process.cwd()`} + */ + cwd?: string; + /** + * The path to the root of the repository. + * By default this is the same as the `basePath`, but can be useful to override in a monorepo. + * + * All `include`, `exclude`, and `ignore` patterns are matched relative to the `basePath`. + * + * @remarks When overriding `repoPath`, the path will be resolved relative to the `cwd`. + * + * @defaultValue `options.basePath` + */ + repoPath?: string; + /** + * The path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. + * + * @remarks When overriding `resultsPath`, the path will be resolved relative to the `cwd`. + * + * @defaultValue `'./.betterer.results'` + */ + resultsPath?: string; + /** + * The path to the {@link https://phenomnomnominal.github.io/betterer/docs/betterer-and-typescript | TypeScript configuration}. + * + * @remarks When overriding `tsconfigPath`, the path will be resolved relative to the `cwd`. + * + * @deprecated This will be removed in v7.0.0 🚨 + * + * @defaultValue `null` + */ + tsconfigPath?: string; +} + +/** + * @public A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern + * to match file paths that should be ignored by the file watcher in watch mode, or an array of + * them. + */ +export type BettererOptionsIgnores = Array; + +/** + * @public **Betterer** options for instantiating a file watcher. + * + * @remarks The options object will be validated by **Betterer** and will be available on the + * {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export interface BettererOptionsWatcher { + /** + * A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern to match + * file paths that should be ignored by the file watcher in watch mode, or an array of them. + * All `ignores` should be relative to the `cwd`. + * @defaultValue `[]` + */ + ignores?: BettererOptionsIgnores; + /** + * Must be `true` when using Watch mode. + */ + watch?: true; +} + +/** + * @public Options for when you override the file watcher config via the {@link @betterer/betterer#BettererContext.options | `BettererContext.options()` API}. + */ +export interface BettererOptionsWatcherOverride { + /** + * A {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob} pattern to match + * file paths that should be ignored by the file watcher in watch mode, or an array of them. All + * `ignores` should be relative to the `cwd`. + * @defaultValue `[]` + */ + ignores?: BettererOptionsIgnores; +} + +/** + * @public An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } + * patterns that match file paths that will be ignored by the file watcher in watch mode. + */ +export type BettererConfigIgnores = ReadonlyArray; + +/** + * @public An array of absolute {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file paths } + * containing **Betterer** tests. + */ +export type BettererConfigPaths = readonly [string, ...Array]; + +/** + * @public Full validated config object for a `BettererFS`. + * + * @remarks Ths config can be accessed via the {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export interface BettererConfigFS { + /** + * The absolute path to the directory containing the code to be covered by **Betterer**. + * + * All `include`, `exclude`, and `ignore` patterns are resolved relative to the `basePath`. + */ + basePath: string; + /** + * When `true`, caching will be enabled for {@link @betterer/betterer#BettererFileTest | `BettererFileTest`s }. + * **Betterer** will only check files that have changes since the last test run. **Betterer** + * will create a cache file at the `configPath`. + */ + cache: boolean; + /** + * The absolute path to where the **Betterer** cache file will be saved. Only used when `cache` + * is `true`. + */ + cachePath: string; + /** + * An array of absolute {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file paths } + * containing **Betterer** tests. + */ + configPaths: BettererConfigPaths; + /** + * The current working directory. + */ + cwd: string; + /** + * An array of absolute {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } + * patterns that match file paths that will be ignored by the file watcher in watch mode. + */ + ignores: BettererConfigIgnores; + /** + * The absolute path to the root of the repository. + */ + repoPath: string; + /** + * The absolute path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. + */ + resultsPath: string; + /** + * The absolute path to the {@link https://phenomnomnominal.github.io/betterer/docs/betterer-and-typescript | TypeScript configuration file}. + * + * @deprecated This will be removed in v7.0.0 🚨 + */ + tsconfigPath: string | null; + /** + * The absolute path to the local version control root. This will only be set in {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer/#pre-commit-mode | precommit mode}. + */ + versionControlPath: string | null; + /** + * When `true`, {@link https://phenomnomnominal.github.io/betterer/docs/running-betterer#watch-mode | watch mode } + * is enabled. In watch mode, **Betterer** will run all {@link @betterer/betterer#BettererFileTest | `BettererFileTest`s } + * whenever a file changes. Only files that are tracked by version control will be watched by + * default. You can ignore additional files using `ignores`. + * + * If `ci`, `precommit`, `strict`, or `update` is `true`, `watch` will be `false`. + */ + watch: boolean; +} + /** * @public An array of {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } * patterns that match file paths that will be included in an operation. All globs should be - * relative to the current {@link @betterer/betterer#BettererConfig.cwd | `BettererConfig.cwd`}. + * relative to the current {@link @betterer/betterer#BettererConfigFS.cwd | `BettererConfigFS.cwd`}. * * @remarks - Can contain nested arrays, which will be {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat | flattened}. */ @@ -25,66 +233,72 @@ export type BettererFilePaths = ReadonlyArray; * * @remarks - Can contain nested arrays, which will be {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/flat | flattened}. */ -export type BettererFilePatterns = ReadonlyArray>; +export type BettererFilePatterns = ReadonlyArray>; -export type BettererFileHashMap = Record; +export type BettererFileHashMap = Map; +export type BettererFileHashMapSerialised = Record; -export type BettererTestCacheMap = Record; +export type BettererTestCacheMap = Map; +export type BettererTestCacheMapSerialised = Record; export interface BettererCacheFile { version: number; - testCache: BettererTestCacheMap; + testCache: BettererTestCacheMapSerialised; } export interface BettererFileCache { clearCache(testName: string): void; - filterCached(testName: string, filePaths: BettererFilePaths): BettererFilePaths; - enableCache(cachePath: string): Promise; - updateCache(testName: string, filePaths: BettererFilePaths): void; + filterCached(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise; + updateCache(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise; writeCache(): Promise; } - -export interface BettererVersionControl extends BettererFileCache { - add(resultsPath: string): Promise; - filterIgnored(filePaths: BettererFilePaths): BettererFilePaths; +export interface BettererFS { getFilePaths(): BettererFilePaths; - init(configPaths: BettererFilePaths, cwd: string): Promise; sync(): Promise; } -export type BettererVersionControlWorker = BettererWorkerAPI; +export interface BettererVersionControl { + add(resultsPath: string): Promise; +} + +export type BettererFSWorker = BettererWorkerAPI; /** - * @public A helper for resolving file paths in a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}. + * @public A helper for resolving file paths in a {@link @betterer/betterer#BettererResolverTest | `BettererResolverTest`}. * * @remarks For ergonomic reasons, a test consumer should be able to use _relative_ paths when they - * use a test, whether that be passing the path to a config file, or using {@link @betterer/betterer#BettererFileTest.include | `BettererFileTest.include()` } + * use a test, whether that be passing the path to a config file, or using {@link @betterer/betterer#BettererResolverTest.include | `BettererResolverTest.include()` } * to select relevant files. * - * To enable that, **Betterer** creates a `BettererFileResolver` whenever a {@link @betterer/betterer#BettererFileTest | `BettererFileTest` } + * To enable that, **Betterer** creates a `BettererFileResolver` whenever a {@link @betterer/betterer#BettererResolverTest | `BettererResolverTest` } * is run. The `baseDirectory` is set to the directory containing the {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file}. * * Internally **Betterer** uses the `BettererFileResolver` to manage file paths specified by - * {@link @betterer/betterer#BettererFileTest.include | `BettererFileTest.include()` } and {@link @betterer/betterer#BettererFileTest.exclude | `BettererFileTest.exclude` }. + * {@link @betterer/betterer#BettererResolverTest.include | `BettererResolverTest.include()` } and {@link @betterer/betterer#BettererResolverTest.exclude | `BettererResolverTest.exclude` }. * A test function can use the `BettererFileResolver` to resolve and validate file paths. * * @example * ```typescript - * import { BettererFileTest } from '@betterer/betterer'; + * import { BettererResolverTest } from '@betterer/betterer'; * - * export function myFileTest (relativeConfigFilePath: string) { - * return new BettererFileTest((_, __, resolver) => { - * // Resolve a file path relative to the `baseDirectory` - * const absoluteConfigFilePath = resolver.resolve(relativeConfigFilePath); + * export function myTest (relativeConfigFilePath: string) { + * return new BettererResolverTest({ + * constraint: () => { + * // ... + * }, + * test: () => { + * // Resolve a file path relative to the `baseDirectory` + * const absoluteConfigFilePath = this.resolver.resolve(relativeConfigFilePath); * - * // Validate if some file paths are relevant for a test: - * const validatedPaths = resolver.validate( - * ['./file-1.js', './file-2.js', './file-3.ts'] - * ); - * // ['./file-1.js'] + * // Validate if some file paths are relevant for a test: + * const validatedPaths = this.resolver.validate( + * ['./file-1.js', './file-2.js', './file-3.ts'] + * ); + * // ['./file-1.js'] + * } * }) * .include('**\/*.js') - * .exclude(/file-2.js/); + * .exclude('**\/file-2.js'); * }; * ``` */ @@ -103,12 +317,43 @@ export interface BettererFileResolver { */ resolve(...pathSegments: Array): string; /** - * Validate if some file paths are relevant for a test. Files can be included and excluded - * via {@link @betterer/betterer#BettererFileTest.include | `BettererFileTest.include()`} and {@link @betterer/betterer#BettererFileTest.exclude | `BettererFileTest.exclude()`}. + * Find the relative path to `to` from the `baseDirectory`. + * + * @param to - String path of the target file/directory. Works the same was as {@link https://nodejs.org/api/path.html#pathrelativefrom-to | 'path.relative()' } + * but with `to` as the first argument. + * + * @returns The relative path. + */ + relative(to: string): string; + /** + * Check if some file paths are included and valid based on the resolver config. Files can be included and excluded + * via {@link @betterer/betterer#BettererResolverTest.include | `BettererResolverTest.include()`} and {@link @betterer/betterer#BettererResolverTest.exclude | `BettererResolverTest.exclude()`}. + * + * @remarks Also takes into consideration the files status in the version control system, + * so a given file path *must* exist on disk, *and* not be listed in an ignore file. * * @param filePaths - An array of paths to validate. * - * @returns The given paths filtered for relevance based on the `includes` and `excludes` of the {@link @betterer/betterer#BettererFileResolver | `BettererFileResolver`}. + * @returns The given paths filtered for relevance based on the `includes` and `excludes` of the {@link @betterer/betterer#BettererFileResolver | `BettererFileResolver`}, + * as well as the files status in the version control system. */ validate(filePaths: BettererFilePaths): Promise; + /** + * Check if some file paths are included and valid based on the resolver config. Files can be included and excluded + * via {@link @betterer/betterer#BettererResolverTest.include | `BettererResolverTest.include()`} and {@link @betterer/betterer#BettererResolverTest.exclude | `BettererResolverTest.exclude()`}. + * + * @param filePaths - An array of paths to validate. + * + * @returns The given paths filtered for relevance based on the `includes` and `excludes` of the {@link @betterer/betterer#BettererFileResolver | `BettererFileResolver`}. + */ + included(filePaths: BettererFilePaths): BettererFilePaths; + /** + * Create a temporary file and get the path to that file, relative to the `baseDirectory`. + * + * @param filePath - an optional file path to include in the temp path. + * + * @returns A path to a temporary directory called `.betterer` somewhere on disk, with the optional file path. + * If included, the file path will have extra characters inserted to guarantee uniqueness. + */ + tmp(filePath?: BettererFilePath): Promise; } diff --git a/packages/betterer/src/fs/version-control.worker.ts b/packages/betterer/src/fs/version-control.worker.ts deleted file mode 100644 index 88a665d2c..000000000 --- a/packages/betterer/src/fs/version-control.worker.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { exposeToMain__ } from '@betterer/worker'; -import { BettererGitΩ } from './git.js'; -import type { BettererFilePaths } from './types.js'; - -export const versionControl = new BettererGitΩ(); - -export function add(resultsPath: string): Promise { - return versionControl.add(resultsPath); -} - -export function filterIgnored(filePaths: BettererFilePaths): BettererFilePaths { - return versionControl.filterIgnored(filePaths); -} - -export function getFilePaths(): BettererFilePaths { - return versionControl.getFilePaths(); -} - -export function init(configPaths: BettererFilePaths, cwd: string): Promise { - return versionControl.init(configPaths, cwd); -} - -export function sync(): Promise { - return versionControl.sync(); -} - -export function clearCache(testName: string): void { - return versionControl.clearCache(testName); -} - -export function filterCached(testName: string, filePaths: BettererFilePaths): BettererFilePaths { - return versionControl.filterCached(testName, filePaths); -} - -export function enableCache(cachePath: string): Promise { - return versionControl.enableCache(cachePath); -} - -export function updateCache(testName: string, filePaths: BettererFilePaths): void { - return versionControl.updateCache(testName, filePaths); -} - -export function writeCache(): Promise { - return versionControl.writeCache(); -} - -exposeToMain__({ - add, - filterIgnored, - getFilePaths, - init, - sync, - clearCache, - filterCached, - enableCache, - updateCache, - writeCache -}); diff --git a/packages/betterer/src/fs/watcher.ts b/packages/betterer/src/fs/watcher.ts new file mode 100644 index 000000000..46661dbde --- /dev/null +++ b/packages/betterer/src/fs/watcher.ts @@ -0,0 +1,23 @@ +import type { FSWatcher } from 'chokidar'; + +import { watch } from 'chokidar'; + +import { getGlobals } from '../globals.js'; + +export const WATCHER_EVENTS = ['add', 'change']; + +export async function createWatcher(): Promise { + const { config } = getGlobals(); + if (!config.watch) { + return null; + } + + const watcher = watch(config.basePath, { ignoreInitial: true }); + + await new Promise((resolve, reject) => { + watcher.on('ready', resolve); + watcher.on('error', reject); + }); + + return watcher; +} diff --git a/packages/betterer/src/fs/writer.ts b/packages/betterer/src/fs/writer.ts index cbba03544..301501e95 100644 --- a/packages/betterer/src/fs/writer.ts +++ b/packages/betterer/src/fs/writer.ts @@ -13,7 +13,7 @@ export async function write(toWrite: string, filePath: string): Promise { try { await fs.mkdir(path.dirname(filePath), { recursive: true }); await fs.writeFile(filePath, toWrite, 'utf8'); - } catch { - throw new BettererError(`could not write to "${filePath}". 😔`); + } catch (error) { + throw new BettererError(`could not write to "${filePath}". 😔`, error as Error); } } diff --git a/packages/betterer/src/globals.ts b/packages/betterer/src/globals.ts index 0abe6ff81..12e3b7e44 100644 --- a/packages/betterer/src/globals.ts +++ b/packages/betterer/src/globals.ts @@ -1,30 +1,108 @@ import type { BettererError } from '@betterer/errors'; +import type { BettererOptions } from './api/index.js'; +import type { BettererConfig } from './config/types.js'; +import type { BettererFileResolver, BettererFSWorker, BettererOptionsWatcher } from './fs/index.js'; +import type { BettererReporter } from './reporters/index.js'; +import type { BettererResultsWorker } from './results/index.js'; +import type { BettererRunWorkerPool } from './run/types.js'; +import type { BettererTestMetaLoaderWorker } from './test/index.js'; -import type { BettererOptionsAll } from './config/index.js'; -import type { BettererReporterΩ } from './reporters/index.js'; -import type { BettererVersionControlWorker } from './fs/types.js'; -import type { BettererGlobals } from './types.js'; +import { invariantΔ } from '@betterer/errors'; +import { importWorkerΔ } from '@betterer/worker'; -import { importWorker__ } from '@betterer/worker'; +import { createContextConfig, enableMode } from './context/index.js'; +import { BettererFileResolverΩ, createFSConfig } from './fs/index.js'; +import { createReporterConfig, loadDefaultReporter } from './reporters/index.js'; +import { createRunWorkerPool } from './run/index.js'; -import { createConfig } from './config/index.js'; -import { loadDefaultReporter } from './reporters/index.js'; -import { BettererResultsFileΩ } from './results/index.js'; +class BettererGlobalResolvers { + public base: BettererFileResolver; + + public constructor(config: BettererConfig) { + this.base = new BettererFileResolverΩ(config.basePath); + } +} + +class BettererGlobals { + public readonly resolvers: BettererGlobalResolvers = new BettererGlobalResolvers(this.config); + + constructor( + public readonly config: BettererConfig, + public readonly fs: BettererFSWorker, + private readonly _reporter: BettererReporter | null, + public readonly results: BettererResultsWorker, + private readonly _runWorkerPool: BettererRunWorkerPool | null, + private readonly _testMetaLoader: BettererTestMetaLoaderWorker | null + ) {} + + public get reporter(): BettererReporter { + invariantΔ(this._reporter, `\`reporter\` should only be accessed on the main thread!`); + return this._reporter; + } + + public get runWorkerPool(): BettererRunWorkerPool { + invariantΔ(this._runWorkerPool, `\`runWorkerPool\` should only be accessed on the main thread!`); + return this._runWorkerPool; + } + + public get testMetaLoader(): BettererTestMetaLoaderWorker { + invariantΔ(this._testMetaLoader, `\`testMetaLoader\` should only be accessed on the main thread!`); + return this._testMetaLoader; + } +} + +let GLOBAL_CONTAINER: BettererGlobals | null = null; + +export async function createGlobals( + options: BettererOptions, + optionsWatch: BettererOptionsWatcher = {} +): Promise { + let errorReporter = await loadDefaultReporter(); -export async function createGlobals(options: BettererOptionsAll = {}): Promise { - const reporter = loadDefaultReporter(); - const versionControl: BettererVersionControlWorker = importWorker__('./fs/version-control.worker.js'); try { - const config = await createConfig(options, versionControl); - if (config.cache) { - await versionControl.api.enableCache(config.cachePath); - } - const resultsFile = await BettererResultsFileΩ.create(config.resultsPath, versionControl); - return { config, resultsFile, versionControl }; + const configContext = await createContextConfig(options); + const configFS = await createFSConfig(configContext, options, optionsWatch); + + const [configReporter, reporter] = await createReporterConfig(configFS, options); + errorReporter = reporter; + + const results: BettererResultsWorker = await importWorkerΔ('./results/results.worker.js'); + const fs: BettererFSWorker = await importWorkerΔ('./fs/fs.worker.js'); + const testMetaLoader: BettererTestMetaLoaderWorker = await importWorkerΔ('./test/test-meta/loader.worker.js'); + + const config = enableMode({ + ...configContext, + ...configFS, + ...configReporter + }); + + await results.api.init(config); + await fs.api.init(config); + + const runWorkerPool = await createRunWorkerPool(config.workers); + + setGlobals(config, fs, reporter, results, runWorkerPool, testMetaLoader); } catch (error) { - await versionControl.destroy(); - const reporterΩ = reporter as BettererReporterΩ; + const reporterΩ = errorReporter; await reporterΩ.configError(options, error as BettererError); throw error; } } + +export function getGlobals(): BettererGlobals { + invariantΔ(GLOBAL_CONTAINER, '`createGlobals` must be called before trying to use globals!'); + return GLOBAL_CONTAINER; +} + +export function setGlobals(...globals: ConstructorParameters): void { + GLOBAL_CONTAINER = new BettererGlobals(...globals); +} + +export async function destroyGlobals(): Promise { + if (!GLOBAL_CONTAINER) { + return; + } + const { fs, results, runWorkerPool, testMetaLoader } = getGlobals(); + await Promise.all([fs.destroy(), results.destroy(), runWorkerPool.destroy(), testMetaLoader.destroy()]); + GLOBAL_CONTAINER = null; +} diff --git a/packages/betterer/src/hasher.ts b/packages/betterer/src/hasher.ts index b3dad68a5..84a219ecc 100644 --- a/packages/betterer/src/hasher.ts +++ b/packages/betterer/src/hasher.ts @@ -1,8 +1,31 @@ +import crypto from 'node:crypto'; import djb2a from 'djb2a'; + import memoize from 'fast-memoize'; -import { normaliseNewlines } from './utils.js'; +import { isString, normaliseNewlines } from './utils.js'; +import { invariantΔ } from '@betterer/errors'; + +export const createHash = memoize( + function createHash(value: string): string { + return djb2a(normaliseNewlines(value)).toString(); + }, + { + serializer: (value: unknown) => { + invariantΔ(isString(value), '`createHash` should only be called with string arguments!'); + return value; + } + } +); -export const createHash = memoize(function createHash(value: string): string { - return djb2a(normaliseNewlines(value)).toString(); -}); +export const createCacheHash = memoize( + function createHash(value: string): string { + return crypto.createHash('sha256').update(normaliseNewlines(value)).digest('hex'); + }, + { + serializer: (value: unknown) => { + invariantΔ(isString(value), '`createHash` should only be called with string arguments!'); + return value; + } + } +); diff --git a/packages/betterer/src/import.ts b/packages/betterer/src/import.ts deleted file mode 100644 index f9f52a3dc..000000000 --- a/packages/betterer/src/import.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { Module } from 'module'; - -interface ESModule { - default: T; -} -interface ModulePrivate { - _compile(source: string, path: string): void; -} - -export function importDefault(importPath: string): T { - // eslint-disable-next-line @typescript-eslint/no-var-requires -- migrating away from CJS requires - const m = require(importPath) as unknown; - return getDefaultExport(m); -} - -let count = 0; -export function importText(text: string): T { - const id = `${count++}`; - const m = new Module(id); - (m as unknown as ModulePrivate)._compile(text, id); - return getDefaultExport(m.exports); -} - -export function getDefaultExport(module: unknown): T { - return (module as ESModule).default || (module as T); -} diff --git a/packages/betterer/src/index.ts b/packages/betterer/src/index.ts index 3fd349804..e6c4d1f25 100644 --- a/packages/betterer/src/index.ts +++ b/packages/betterer/src/index.ts @@ -4,89 +4,111 @@ * @packageDocumentation */ -export { betterer, merge, results, runner, watch } from './betterer.js'; -export { - BettererConfig, - BettererConfigBase, - BettererConfigStart, - BettererConfigWatch, +import 'core-js/proposals/promise-with-resolvers.js'; + +export type { + BettererAPI, + BettererOptions, + BettererOptionsResults, + BettererOptionsRunner, + BettererOptionsWatch +} from './api/index.js'; +export type { BettererConfig, BettererOptionsOverride } from './config/index.js'; +export type { + BettererConfigContext, BettererConfigExcludes, BettererConfigFilters, - BettererConfigIgnores, BettererConfigIncludes, - BettererConfigPaths, - BettererOptionsBase, + BettererContext, + BettererContextSummary, + BettererOptionsContext, + BettererOptionsContextOverride, BettererOptionsExcludes, BettererOptionsFilters, - BettererOptionsIgnores, BettererOptionsIncludes, - BettererOptionsMerge, - BettererOptionsOverride, - BettererOptionsPaths, - BettererOptionsReporters, - BettererOptionsResults, - BettererOptionsRunner, - BettererOptionsStartBase, - BettererOptionsStartCI, - BettererOptionsStartDefault, - BettererOptionsStartPrecommit, - BettererOptionsStartStrict, - BettererOptionsStartUpdate, - BettererOptionsStart, - BettererOptionsWatch -} from './config/public.js'; -export { BettererContext, BettererContextSummary } from './context/public.js'; -export { + BettererOptionsMode, + BettererOptionsModeCI, + BettererOptionsModeDefault, + BettererOptionsModePrecommit, + BettererOptionsModeStrict, + BettererOptionsModeUpdate, + BettererOptionsModeWatch +} from './context/index.js'; +export type { + BettererConfigFS, + BettererConfigIgnores, + BettererConfigPaths, BettererFileGlobs, BettererFilePath, BettererFilePaths, BettererFilePatterns, - BettererFileResolver -} from './fs/public.js'; -export { BettererReporter } from './reporters/public.js'; -export { + BettererFileResolver, + BettererOptionsFS, + BettererOptionsIgnores, + BettererOptionsPaths, + BettererOptionsWatcher, + BettererOptionsWatcherOverride +} from './fs/index.js'; +export type { + BettererConfigReporter, + BettererOptionsReporter, + BettererOptionsReporterOverride, + BettererOptionsReporters, + BettererReporter, + BettererRunLogFunction, + BettererRunLogger +} from './reporters/index.js'; +export type { BettererFileTestResultSummary, BettererFileTestResultSummaryDetails, - BettererTestResultSummary, - BettererTestResultSummaryDetails, + BettererOptionsMerge, BettererResult, - BettererResultSummary, BettererResultSummaries, - BettererResultsSummary -} from './results/public.js'; -export { BettererDelta, BettererRun, BettererRuns, BettererRunSummary, BettererRunSummaries } from './run/public.js'; -export { BettererRunner } from './runner/public.js'; -export { BettererSuite, BettererSuiteSummary, BettererSuiteSummaries } from './suite/public.js'; -export { + BettererResultSummary, + BettererResultsSummary, + BettererTestResultSummary, + BettererTestResultSummaryDetails +} from './results/index.js'; +export type { + BettererDelta, + BettererRun, + BettererRunSummaries, + BettererRunSummary, + BettererRuns +} from './run/index.js'; +export type { BettererRunner } from './runner/index.js'; +export type { BettererSuite, BettererSuiteSummaries, BettererSuiteSummary } from './suite/index.js'; +export type { BettererDeserialise, BettererDiff, BettererDiffer, BettererFile, BettererFileBase, BettererFileDiff, - BettererFilesDiff, - BettererFileTest, - BettererFileTestFunction, - BettererFileTestResult, - BettererFileTestResultSerialised, - BettererFileTestDiff, BettererFileIssue, BettererFileIssueSerialised, BettererFileIssues, BettererFileIssuesSerialised, + BettererFileTestDiff, + BettererFileTestFunction, + BettererFileTestResult, + BettererFileTestResultKey, + BettererFileTestResultSerialised, + BettererFilesDiff, BettererPrinter, BettererProgress, BettererSerialise, BettererSerialiser, - BettererTest, - BettererTestBase, + BettererTestConfig, BettererTestConstraint, BettererTestDeadline, BettererTestFunction, BettererTestGoal, - BettererTestConfig, - BettererTestOptions, - BettererTestOptionsBasic, - BettererTestOptionsComplex, - BettererTestNames -} from './test/public.js'; + BettererTestNames, + BettererTestOptions +} from './test/index.js'; +export type { MaybeAsync, Func } from './types.js'; + +export { betterer, merge, results, runner, watch } from './api/index.js'; +export { BettererCacheStrategy } from './fs/index.js'; +export { BettererFileTest, BettererResolverTest, BettererTest } from './test/index.js'; diff --git a/packages/betterer/src/reporters/config.ts b/packages/betterer/src/reporters/config.ts new file mode 100644 index 000000000..04980e848 --- /dev/null +++ b/packages/betterer/src/reporters/config.ts @@ -0,0 +1,40 @@ +import type { BettererConfigFS } from '../fs/index.js'; +import type { BettererReporterΩ } from './reporter.js'; +import type { + BettererConfigReporter, + BettererOptionsReporter, + BettererOptionsReporterOverride, + BettererReporter +} from './types.js'; + +import { toArray, validateBool } from '../config/index.js'; +import { getGlobals, setGlobals } from '../globals.js'; +import { loadReporters, loadSilentReporter } from './loader.js'; + +export async function createReporterConfig( + configBase: BettererConfigFS, + options: BettererOptionsReporter +): Promise<[BettererConfigReporter, BettererReporterΩ]> { + const { cwd } = configBase; + + const logo = options.logo ?? false; + + const reporters = toArray(options.reporters); + const silent = options.silent ?? false; + + validateBool({ logo }); + validateBool({ silent }); + + const reporter = silent ? loadSilentReporter() : await loadReporters(reporters, cwd); + + return [{ logo }, reporter]; +} + +export async function overrideReporterConfig(optionsOverride: BettererOptionsReporterOverride): Promise { + if (optionsOverride.reporters) { + const { config, results, runWorkerPool, testMetaLoader, fs } = getGlobals(); + const reporters = toArray(optionsOverride.reporters); + const reporter = await loadReporters(reporters, config.cwd); + setGlobals(config, fs, reporter, results, runWorkerPool, testMetaLoader); + } +} diff --git a/packages/betterer/src/reporters/index.ts b/packages/betterer/src/reporters/index.ts index bd66d2a0b..8920cd894 100644 --- a/packages/betterer/src/reporters/index.ts +++ b/packages/betterer/src/reporters/index.ts @@ -1,3 +1,15 @@ export type { BettererReporterΩ } from './reporter.js'; -export { loadDefaultReporter, loadSilentReporter, loadReporters } from './loader.js'; -export { BettererReporter, BettererReporterModule } from './types.js'; +export type { + BettererConfigReporter, + BettererOptionsReporter, + BettererOptionsReporterOverride, + BettererOptionsReporters, + BettererReporter, + BettererReporterFactory, + BettererReporterModule, + BettererRunLogFunction, + BettererRunLogger +} from './types.js'; + +export { createReporterConfig, overrideReporterConfig } from './config.js'; +export { loadDefaultReporter, loadReporters, loadSilentReporter } from './loader.js'; diff --git a/packages/betterer/src/reporters/loader.ts b/packages/betterer/src/reporters/loader.ts index ee97312b3..f934a6be3 100644 --- a/packages/betterer/src/reporters/loader.ts +++ b/packages/betterer/src/reporters/loader.ts @@ -1,55 +1,83 @@ -import type { BettererOptionsReporters } from '../config/index.js'; -import type { BettererReporter, BettererReporterFactory, BettererReporterModule } from './types.js'; +import type { + BettererOptionsReporters, + BettererReporter, + BettererReporterFactory, + BettererReporterModule +} from './types.js'; -import { BettererError } from '@betterer/errors'; +import { BettererError, invariantΔ } from '@betterer/errors'; import path from 'node:path'; -import { importDefault } from '../import.js'; +import { importDefault, importTranspiled } from '../fs/index.js'; +import { BettererRunLoggerΩ } from '../run/index.js'; import { isFunction, isString } from '../utils.js'; import { BettererReporterΩ } from './reporter.js'; -const HOOK_NAMES = Object.getOwnPropertyNames(BettererReporterΩ.prototype) as ReadonlyArray; +const REPORTER_HOOK_NAMES = Object.getOwnPropertyNames(BettererReporterΩ.prototype) as ReadonlyArray< + keyof BettererReporter +>; +const RUN_LOGGER_HOOK_NAMES = Object.getOwnPropertyNames(BettererRunLoggerΩ.prototype) as ReadonlyArray< + keyof BettererRunLoggerΩ +>; -export function loadDefaultReporter(): BettererReporter { - const { createReporter__ } = importDefault('@betterer/reporter'); - return new BettererReporterΩ([createReporter__()]); +export async function loadDefaultReporter(): Promise { + const reporterFactory = await importDefault('@betterer/reporter'); + assertDefaultReporter(reporterFactory); + return new BettererReporterΩ([reporterFactory.createReporterΔ()]); } -export function loadReporters(reporters: BettererOptionsReporters, cwd: string): BettererReporter { +function assertDefaultReporter(reporterFactory: unknown): asserts reporterFactory is BettererReporterFactory { + invariantΔ( + (reporterFactory as Partial).createReporterΔ, + `"@betterer/reporter" didn't provider a reporter factory!` + ); +} + +export async function loadReporters(reporters: BettererOptionsReporters, cwd: string): Promise { if (reporters.length === 0) { - return loadDefaultReporter(); + return await loadDefaultReporter(); } return new BettererReporterΩ( - reporters.map((reporter) => { - if (isString(reporter)) { - reporter = resolveReporter(cwd, reporter); - try { - const module = importDefault(reporter); - if (!module || !module.reporter) { - throw new BettererError(`"${reporter}" didn't create a reporter. 😔`); + await Promise.all( + reporters.map(async (reporter) => { + if (isString(reporter)) { + reporter = await resolveReporter(cwd, reporter); + try { + const module = path.extname(reporter) ? await importTranspiled(reporter) : await importDefault(reporter); + assertReporter(reporter, module); + validate(module.reporter, REPORTER_HOOK_NAMES); + return module.reporter; + } catch (error) { + throw new BettererError(`could not import "${reporter}". 😔`, error as BettererError); } - validate(module.reporter); - return module.reporter; - } catch (error) { - throw new BettererError(`could not require "${reporter}". 😔`, error as BettererError); } - } - validate(reporter); - return reporter; - }) + validate(reporter, REPORTER_HOOK_NAMES); + return reporter; + }) + ) ); } +function assertReporter(reporter: string, reporterModule: unknown): asserts reporterModule is BettererReporterModule { + if (!reporterModule || !(reporterModule as Partial).reporter) { + throw new BettererError(`"${reporter}" didn't create a reporter. 😔`); + } +} + export function loadSilentReporter(): BettererReporterΩ { return new BettererReporterΩ([]); } -function validate(result: unknown): asserts result is BettererReporter { +function validate(result: unknown, hookNames: ReadonlyArray): asserts result is BettererReporter { const reporter = result as BettererReporter; Object.keys(reporter).forEach((key) => { const hookName = key as keyof BettererReporter; - if (!HOOK_NAMES.includes(hookName)) { + if (key === 'runLogger') { + validate(reporter.runLogger, RUN_LOGGER_HOOK_NAMES); + return; + } + if (!hookNames.includes(hookName)) { throw new BettererError(`"${hookName}" is not a valid reporter hook name. 😔`); } if (!isFunction(reporter[hookName])) { @@ -58,10 +86,12 @@ function validate(result: unknown): asserts result is BettererReporter { }); } -function resolveReporter(cwd: string, reporter: string): string { +async function resolveReporter(cwd: string, reporter: string): Promise { try { - // Local file: - return require.resolve(path.resolve(cwd, reporter)); + // Local reporter: + const localReporterPath = path.resolve(cwd, reporter); + await import(localReporterPath); + return localReporterPath; } catch { // npm module: return reporter; diff --git a/packages/betterer/src/reporters/public.ts b/packages/betterer/src/reporters/public.ts deleted file mode 100644 index e2732209e..000000000 --- a/packages/betterer/src/reporters/public.ts +++ /dev/null @@ -1 +0,0 @@ -export { BettererReporter } from './types.js'; diff --git a/packages/betterer/src/reporters/reporter.ts b/packages/betterer/src/reporters/reporter.ts index c1fc1238a..f90ca264e 100644 --- a/packages/betterer/src/reporters/reporter.ts +++ b/packages/betterer/src/reporters/reporter.ts @@ -1,12 +1,37 @@ import type { BettererError } from '@betterer/errors'; +import type { BettererLoggerCodeInfo, BettererLoggerMessages } from '@betterer/logger'; import type { BettererContext } from '../context/index.js'; import type { BettererContextSummary } from '../context/types.js'; import type { BettererRun, BettererRunSummary } from '../run/index.js'; import type { BettererSuite, BettererSuiteSummary } from '../suite/index.js'; -import type { BettererReporter } from './types.js'; +import type { BettererReporter, BettererRunLogger } from './types.js'; export class BettererReporterΩ implements BettererReporter { + public runLogger: BettererRunLogger = { + code: async (run: BettererRun, code: BettererLoggerCodeInfo): Promise => { + await Promise.all(this._reporters.map((r) => r.runLogger?.code(run, code))); + }, + debug: async (run: BettererRun, ...debug: BettererLoggerMessages): Promise => { + await Promise.all(this._reporters.map((r) => r.runLogger?.debug(run, ...debug))); + }, + error: async (run: BettererRun, ...error: BettererLoggerMessages): Promise => { + await Promise.all(this._reporters.map((r) => r.runLogger?.error(run, ...error))); + }, + info: async (run: BettererRun, ...info: BettererLoggerMessages): Promise => { + await Promise.all(this._reporters.map((r) => r.runLogger?.info(run, ...info))); + }, + progress: async (run: BettererRun, ...progress: BettererLoggerMessages): Promise => { + await Promise.all(this._reporters.map((r) => r.runLogger?.progress(run, ...progress))); + }, + success: async (run: BettererRun, ...success: BettererLoggerMessages): Promise => { + await Promise.all(this._reporters.map((r) => r.runLogger?.success(run, ...success))); + }, + warn: async (run: BettererRun, ...warn: BettererLoggerMessages): Promise => { + await Promise.all(this._reporters.map((r) => r.runLogger?.warn(run, ...warn))); + } + }; + constructor(private _reporters: Array) {} async configError(invalidConfig: unknown, error: BettererError): Promise { @@ -14,6 +39,7 @@ export class BettererReporterΩ implements BettererReporter { } async contextStart(context: BettererContext, lifecycle: Promise): Promise { + defaultLifecycleCatch(lifecycle); await Promise.all(this._reporters.map((r) => r.contextStart?.(context, lifecycle))); } @@ -26,6 +52,7 @@ export class BettererReporterΩ implements BettererReporter { } async suiteStart(suite: BettererSuite, lifecycle: Promise): Promise { + defaultLifecycleCatch(lifecycle); await Promise.all(this._reporters.map((r) => r.suiteStart?.(suite, lifecycle))); } @@ -38,6 +65,7 @@ export class BettererReporterΩ implements BettererReporter { } async runStart(run: BettererRun, lifecycle: Promise): Promise { + defaultLifecycleCatch(lifecycle); await Promise.all(this._reporters.map((r) => r.runStart?.(run, lifecycle))); } @@ -49,3 +77,8 @@ export class BettererReporterΩ implements BettererReporter { await Promise.all(this._reporters.map((r) => r.runError?.(run, error))); } } + +function defaultLifecycleCatch(lifecycle: Promise): void { + // Just in case no-one handles this error in a reporter: + lifecycle.catch(() => void 0); +} diff --git a/packages/betterer/src/reporters/types.ts b/packages/betterer/src/reporters/types.ts index b30c2b8ba..22f26560e 100644 --- a/packages/betterer/src/reporters/types.ts +++ b/packages/betterer/src/reporters/types.ts @@ -1,15 +1,98 @@ import type { BettererError } from '@betterer/errors'; +import type { BettererLogger } from '@betterer/logger'; import type { BettererContext, BettererContextSummary } from '../context/index.js'; import type { BettererRun, BettererRunSummary } from '../run/index.js'; -import type { BettererSuiteSummary, BettererSuite } from '../suite/index.js'; +import type { BettererSuite, BettererSuiteSummary } from '../suite/index.js'; +import type { Func } from '../types.js'; + +/** + * @public An array of names of npm packages that export a {@link @betterer/betterer#BettererReporter | `BettererReporter`}, + * or `object`s that implement {@link @betterer/betterer#BettererReporter | `BettererReporter`}. + */ +export type BettererOptionsReporters = Array; + +/** + * @public **Betterer** options for creating a `BettererReporter`. + * + * @remarks The options object will be validated by **Betterer** and will be available on the + * {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export interface BettererOptionsReporter { + /** + * When `true`, the default reporter will render the Betterer logo. + * + * @defaultValue `false` + */ + logo?: boolean; + /** + * An array of names of npm packages that export a {@link @betterer/betterer#BettererReporter | `BettererReporter` } + * or `object`s that implement {@link @betterer/betterer#BettererReporter | `BettererReporter`}. + * Ignored when `silent` is `true`. + * + * @remarks When given a file path, the path will be resolved relative to the `cwd`. + * + * @defaultValue `['@betterer/reporter']` + */ + reporters?: BettererOptionsReporters; + /** + * When `true`, all reporters will be disabled. + * @defaultValue `false` + */ + silent?: boolean; +} + +/** + * @public Options for when you override the reporter config via the {@link @betterer/betterer#BettererContext.options | `BettererContext.options()` API}. + */ +export interface BettererOptionsReporterOverride { + /** + * An array of names of npm packages that export a {@link @betterer/betterer#BettererReporter | `BettererReporter` } + * or `object`s that implement {@link @betterer/betterer#BettererReporter | `BettererReporter`}. + * Ignored when `silent` is `true`. + * @defaultValue `['@betterer/reporter']` + */ + reporters?: BettererOptionsReporters; +} + +/** + * @public Full validated config object for a `BettererReporter`. + * + * @remarks Ths config can be accessed via the {@link @betterer/betterer#BettererConfig | `BettererConfig`}. + */ +export interface BettererConfigReporter { + /** + * When `true`, the default reporter will render the Betterer logo. + */ + logo: boolean; +} + +/** + * @public The interface for hooking into **Betterer**'s per-run logging system. + * + * @remarks A {@link @betterer/betterer#BettererReporter | `BettererReporter`} provides lifecycle-level events + * for a {@link @betterer/betterer#BettererContext | `BettererContext`}, {@link @betterer/betterer#BettererSuite | `BettererContext`} + * or {@link @betterer/betterer#BettererRun | `BettererRun`} starting, stopping, or throwing an error. A `BettererRunLogger` + * is available during a test run to log real-time information as the test is executed. + */ +export type BettererRunLogger = { + [Log in keyof BettererLogger]: BettererLogger[Log] extends Func ? BettererRunLogFunction : never; +}; + +/** + * @public The interface for hooking into **Betterer**'s per-run logging system. + */ +export type BettererRunLogFunction = ( + run: BettererRun, + ...args: Parameters +) => ReturnType; /** * @public The interface for hooking into **Betterer**'s reporter system. * * @remarks There are two ways to specify a custom `BettererReporter`: * - * Defining the reporter _inline_ when calling `Betterer` via one of the {@link @betterer/betterer#(betterer:function) | JS APIs}: + * Defining the reporter _inline_ when calling `Betterer` via one of the {@link @betterer/betterer#betterer | JS APIs}: * * @example * ```typescript @@ -38,6 +121,14 @@ import type { BettererSuiteSummary, BettererSuite } from '../suite/index.js'; * `'my-custom-module'` should export a `reporter` which implements the `BettererReporter` interface. */ export interface BettererReporter { + /** + * The `runLogger` contains hooks for per-run logs. Each individual test run has its own logger which + * can be used to emit information, issues, or status updates to the reporter. + * + * @remarks each hook will be called with the {@link @betterer/betterer#BettererRun | `BettererRun` } that + * emitted the log. The name of each run will be unique, so can be used to group log messages together. + */ + runLogger?: BettererRunLogger; /** * The `configError()` hook is called when there is an error while instantiating and validating * the {@link @betterer/betterer#BettererConfig | `BettererConfig`}. @@ -131,5 +222,5 @@ export interface BettererReporterModule { } export interface BettererReporterFactory { - createReporter__: () => BettererReporter; + createReporterΔ: () => BettererReporter; } diff --git a/packages/betterer/src/results/config.ts b/packages/betterer/src/results/config.ts new file mode 100644 index 000000000..3580514a7 --- /dev/null +++ b/packages/betterer/src/results/config.ts @@ -0,0 +1,18 @@ +import type { BettererConfigMerge, BettererOptionsMerge } from './types.js'; + +import path from 'node:path'; +import { toArray, validateFilePath, validateString, validateStringArray } from '../config/index.js'; + +const BETTERER_RESULTS = './.betterer.results'; + +export async function createMergeConfig(options: BettererOptionsMerge): Promise { + const contents = toArray(options.contents); + const cwd = options.cwd ?? process.cwd(); + const resultsPath = path.resolve(cwd, options.resultsPath ?? BETTERER_RESULTS); + + validateStringArray({ contents }); + validateString({ cwd }); + await validateFilePath({ resultsPath }); + + return { contents, cwd, resultsPath }; +} diff --git a/packages/betterer/src/results/index.ts b/packages/betterer/src/results/index.ts index 130f96b94..46690f6a4 100644 --- a/packages/betterer/src/results/index.ts +++ b/packages/betterer/src/results/index.ts @@ -1,14 +1,22 @@ -export { BettererMergerΩ } from './merger.js'; -export { BettererResultsSummaryΩ } from './results-summary.js'; -export { BettererResultΩ } from './result.js'; -export { BettererResultsFileΩ } from './results-file.js'; -export { +export type { + BettererConfigMerge, + BettererFileTestResultSummary, + BettererFileTestResultSummaryDetails, + BettererOptionsMerge, BettererResult, BettererResultSerialised, - BettererResultsSerialised, - BettererFileTestResultSummaryDetails, - BettererTestResultSummaryDetails, - BettererResultSummary, BettererResultSummaries, - BettererResultsSummary + BettererResultSummary, + BettererResultsSerialised, + BettererResultsSummary, + BettererResultsWorker, + BettererTestResultSummary, + BettererTestResultSummaryDetails } from './types.js'; + +export { BettererResultΩ } from './result.js'; +export { BettererResultsMergerΩ } from './results-merger.js'; +export { BettererResultsSummaryΩ } from './results-summary.js'; +export { BettererResultsΩ } from './results.js'; + +export { printResults } from './print.js'; diff --git a/packages/betterer/src/results/merge.ts b/packages/betterer/src/results/merge.ts deleted file mode 100644 index 7965b653c..000000000 --- a/packages/betterer/src/results/merge.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { BettererResultsSerialised } from './types.js'; - -import { importText } from '../import.js'; - -/** - * Takes two strings of JavaScript, evaluates their contents, and merges the results, - * with the latter taking precedence. - */ -export function mergeResults(ours: string, theirs: string): BettererResultsSerialised { - return { ...importText(ours), ...importText(theirs) }; -} diff --git a/packages/betterer/src/results/merger.ts b/packages/betterer/src/results/merger.ts deleted file mode 100644 index adc33d9a0..000000000 --- a/packages/betterer/src/results/merger.ts +++ /dev/null @@ -1,28 +0,0 @@ -import type { BettererOptionsMerge } from '../config/index.js'; -import type { BettererResultsSerialised } from './types.js'; - -import { createMergeConfig } from '../config/index.js'; -import { write } from '../fs/index.js'; -import { mergeResults } from './merge.js'; -import { parseResults } from './parse.js'; -import { printResults } from './print.js'; - -export class BettererMergerΩ { - private constructor(private _contents: Array, private _resultsPath: string) {} - - public static async create(options: BettererOptionsMerge): Promise { - const { contents, resultsPath } = await createMergeConfig(options); - return new BettererMergerΩ(contents, resultsPath); - } - - public async merge(): Promise { - let merged: BettererResultsSerialised; - if (this._contents.length === 2) { - const [ours, theirs] = this._contents; - merged = mergeResults(ours, theirs); - } else { - merged = await parseResults(this._resultsPath); - } - await write(printResults(merged), this._resultsPath); - } -} diff --git a/packages/betterer/src/results/print.ts b/packages/betterer/src/results/print.ts index 6228c2c28..7deca2e43 100644 --- a/packages/betterer/src/results/print.ts +++ b/packages/betterer/src/results/print.ts @@ -4,7 +4,7 @@ import type { BettererResultsSerialised } from './types.js'; const JS_INTERP_ESCAPED = '$\\{'; const JS_INTERP_UNESCAPED_REGEXP = /\$\{/g; -const ESCAPE_REPLACERS: Record = { +const ESCAPE_REPLACERS = { "'": "\\'", '`': '\\`', '\\': '\\\\', @@ -14,7 +14,7 @@ const ESCAPE_REPLACERS: Record = { '\t': '\\t', '\u2028': '\\u2028', '\u2029': '\\u2029' -}; +} as const; const RESULTS_HEADER = `// BETTERER RESULTS V2. // @@ -27,7 +27,7 @@ const RESULTS_HEADER = `// BETTERER RESULTS V2. * `import()`-able string of JavaScript. */ export function printResults(results: BettererResultsSerialised): string { - const printedResults = Object.keys(results).map((name) => printResult(name, results[name].value)); + const printedResults = Object.entries(results).map(([name, result]) => printResult(name, result.value)); return [RESULTS_HEADER, ...printedResults].join(''); } @@ -37,6 +37,6 @@ function printResult(name: string, printedValue: string): string { function escape(printedValue: string): string { return printedValue - .replace(/['`\\\b\f\r\t\u2028\u2029]/g, (char) => ESCAPE_REPLACERS[char]) + .replace(/['`\\\b\f\r\t\u2028\u2029]/g, (char) => ESCAPE_REPLACERS[char as keyof typeof ESCAPE_REPLACERS]) .replace(JS_INTERP_UNESCAPED_REGEXP, JS_INTERP_ESCAPED); } diff --git a/packages/betterer/src/results/public.ts b/packages/betterer/src/results/public.ts deleted file mode 100644 index dafe18619..000000000 --- a/packages/betterer/src/results/public.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { - BettererResult, - BettererTestResultSummary, - BettererTestResultSummaryDetails, - BettererFileTestResultSummary, - BettererFileTestResultSummaryDetails, - BettererResultSummary, - BettererResultSummaries, - BettererResultsSummary -} from './types.js'; diff --git a/packages/betterer/src/results/result.ts b/packages/betterer/src/results/result.ts index b4d7164bc..ec9916bb7 100644 --- a/packages/betterer/src/results/result.ts +++ b/packages/betterer/src/results/result.ts @@ -1,5 +1,8 @@ import type { BettererResult } from './types.js'; export class BettererResultΩ implements BettererResult { - constructor(public value: unknown) {} + constructor( + public value: unknown, + public printed: string + ) {} } diff --git a/packages/betterer/src/results/results-file.ts b/packages/betterer/src/results/results-file.ts deleted file mode 100644 index c4996dd78..000000000 --- a/packages/betterer/src/results/results-file.ts +++ /dev/null @@ -1,102 +0,0 @@ -import type { BettererVersionControlWorker } from '../fs/index.js'; -import type { BettererRunSummary, BettererRunSummaries } from '../run/index.js'; -import type { BettererSuiteSummary } from '../suite/index.js'; -import type { BettererTestNames } from '../test/index.js'; -import type { BettererResultsSerialised } from './types.js'; - -import assert from 'node:assert'; - -import { write } from '../fs/index.js'; -import { parseResults } from './parse.js'; -import { printResults } from './print.js'; - -export class BettererResultsFileΩ { - private constructor( - private _resultsPath: string, - private _versionControl: BettererVersionControlWorker, - private _baseline: BettererResultsSerialised, - private _expected: BettererResultsSerialised - ) {} - - public static async create( - resultsPath: string, - versionControl: BettererVersionControlWorker - ): Promise { - const baseline = await parseResults(resultsPath); - const expected = baseline; - return new BettererResultsFileΩ(resultsPath, versionControl, baseline, expected); - } - - public getChanged(runSummaries: BettererRunSummaries): BettererTestNames { - const missingRuns = Object.keys(this._expected).filter( - (name) => !runSummaries.find((runSummary) => runSummary.name === name) - ); - const changedRuns = runSummaries - .filter((runSummary) => !runSummary.isNew && !runSummary.isFailed && !runSummary.isSkipped) - .filter((runSummary) => runSummary.printed !== this._getResult(runSummary.name, this._expected)) - .map((runSummary) => runSummary.name); - const newRuns = runSummaries - .filter((runSummary) => runSummary.isNew && !runSummary.isComplete) - .map((runSummary) => runSummary.name); - const worseRuns = runSummaries.filter((runSummary) => runSummary.isWorse).map((runSummary) => runSummary.name); - return [...missingRuns, ...changedRuns, ...newRuns, ...worseRuns]; - } - - public getExpected(name: string): [string, string] { - const baseline = this._getResult(name, this._baseline); - const expected = this._getResult(name, this._expected); - return [baseline, expected]; - } - - public hasResult(name: string): boolean { - return Object.hasOwnProperty.call(this._expected, name); - } - - public async sync(): Promise { - this._expected = await parseResults(this._resultsPath); - } - - public async writeNew(suiteSummary: BettererSuiteSummary): Promise { - if (suiteSummary.new.length === 0) { - return; - } - - const printedNew = printResults( - suiteSummary.new - .filter((runSummary) => !runSummary.isComplete) - .reduce((results, runSummary: BettererRunSummary) => { - results[runSummary.name] = { value: runSummary.printed as string }; - return results; - }, this._expected) - ); - - await write(printedNew, this._resultsPath); - } - - public async write(suiteSummary: BettererSuiteSummary, precommit: boolean): Promise { - const printedExpected = printResults(this._expected); - const printedResult = printResults( - suiteSummary.runSummaries - .filter((runSummary: BettererRunSummary) => runSummary.printed != null) - .reduce((results, runSummary) => { - results[runSummary.name] = { value: runSummary.printed as string }; - return results; - }, {} as BettererResultsSerialised) - ); - - const shouldWrite = printedResult !== printedExpected; - if (shouldWrite) { - await write(printedResult, this._resultsPath); - if (precommit) { - await this._versionControl.api.add(this._resultsPath); - } - } - } - - private _getResult(name: string, results: BettererResultsSerialised): string { - const hasResult = Object.hasOwnProperty.call(results, name); - assert(hasResult); - const { value } = results[name]; - return value; - } -} diff --git a/packages/betterer/src/results/results-merger.ts b/packages/betterer/src/results/results-merger.ts new file mode 100644 index 000000000..e5a877dd8 --- /dev/null +++ b/packages/betterer/src/results/results-merger.ts @@ -0,0 +1,29 @@ +import type { BettererFilePath } from '../fs/index.js'; +import type { BettererOptionsMerge, BettererResultsSerialised } from './types.js'; + +import { merge, parse, write } from '../fs/index.js'; +import { createMergeConfig } from './config.js'; +import { printResults } from './print.js'; + +export class BettererResultsMergerΩ { + private constructor( + private _contents: Array, + private _resultsPath: BettererFilePath + ) {} + + public static async create(options: BettererOptionsMerge): Promise { + const { contents, resultsPath } = await createMergeConfig(options); + return new BettererResultsMergerΩ(contents, resultsPath); + } + + public async merge(): Promise { + const [ours, theirs] = this._contents; + let merged: BettererResultsSerialised; + if (ours != null && theirs != null) { + merged = merge(this._resultsPath, ours, theirs) as BettererResultsSerialised; + } else { + merged = (await parse(this._resultsPath)) as BettererResultsSerialised; + } + await write(printResults(merged), this._resultsPath); + } +} diff --git a/packages/betterer/src/results/results-summary.ts b/packages/betterer/src/results/results-summary.ts index 302efd512..d234cc992 100644 --- a/packages/betterer/src/results/results-summary.ts +++ b/packages/betterer/src/results/results-summary.ts @@ -1,10 +1,13 @@ -import type { BettererOptionsResults } from '../config/index.js'; -import { BettererFileResolverΩ } from '../fs/index.js'; -import { createGlobals } from '../globals.js'; +import type { BettererError } from '@betterer/errors'; + import type { BettererFileTestResultΩ } from '../test/index.js'; -import { isBettererFileTest, loadTestMeta } from '../test/index.js'; +import type { BettererFileResolverΩ } from '../fs/index.js'; import type { BettererFileTestResultSummaryDetails, BettererResultsSummary, BettererResultSummaries } from './types.js'; +import { destroyGlobals, getGlobals } from '../globals.js'; +import { loadTest } from '../run/index.js'; +import { isBettererFileTest } from '../test/index.js'; + export class BettererResultsSummaryΩ implements BettererResultsSummary { public readonly resultSummaries: BettererResultSummaries; @@ -14,58 +17,58 @@ export class BettererResultsSummaryΩ implements BettererResultsSummary { : resultSummaries; } - public static async create(options: BettererOptionsResults): Promise { - const { config, resultsFile, versionControl } = await createGlobals({ - configPaths: options.configPaths, - cwd: options.cwd, - excludes: options.excludes, - filters: options.filters, - includes: options.includes, - resultsPath: options.resultsPath - }); + public static async create(): Promise { + const { config, reporter, resolvers, results, testMetaLoader } = getGlobals(); + const { configPaths, filters, includes, excludes, resultsPath } = config; - const testFactories = loadTestMeta(config.configPaths); + try { + let testsMeta = await testMetaLoader.api.loadTestsMeta(configPaths); + if (filters.length) { + testsMeta = testsMeta.filter((testMeta) => filters.some((filter) => filter.test(testMeta.name))); + } - let testNames = Object.keys(testFactories); - if (config.filters.length) { - testNames = testNames.filter((name) => config.filters.some((filter) => filter.test(name))); - } + const resolverΩ = resolvers.base as BettererFileResolverΩ; + resolverΩ.include(...includes); + resolverΩ.exclude(...excludes); - const { cwd, includes, excludes, resultsPath } = config; + const filePaths = await resolverΩ.files(); - const resolver = new BettererFileResolverΩ(cwd, versionControl); - resolver.include(...includes); - resolver.exclude(...excludes); + const onlyFileTests = includes.length > 0 || excludes.length > 0; - const filePaths = await resolver.files(); + const testStatuses = await Promise.all( + testsMeta.map(async (testMeta) => { + const { name } = testMeta; - const onlyFileTests = includes.length > 0 || excludes.length > 0; + const test = await loadTest(testMeta); - const testStatuses = await Promise.all( - testNames.map(async (name) => { - const test = await testFactories[name].factory(); - const isFileTest = isBettererFileTest(test); - const [expectedJSON] = resultsFile.getExpected(name); - const serialised = JSON.parse(expectedJSON) as unknown; - const deserialised = test.config.serialiser.deserialise(serialised, resultsPath); - if (isFileTest) { - const resultΩ = deserialised as BettererFileTestResultΩ; - const details = resultΩ.files - .filter((file) => !onlyFileTests || filePaths.includes(file.absolutePath)) - .reduce((summary, file) => { - summary[file.absolutePath] = file.issues; - return summary; - }, {} as BettererFileTestResultSummaryDetails); - return { name, isFileTest, details }; - } else { - const details = await test.config.printer(deserialised); - return { name, isFileTest, details }; - } - }) - ); + const isFileTest = isBettererFileTest(test); - const status = new BettererResultsSummaryΩ(testStatuses, onlyFileTests); - await versionControl.destroy(); - return status; + const expectedJSON = await results.api.getExpected(name); + const serialised = JSON.parse(expectedJSON) as unknown; + const deserialised = test.config.serialiser.deserialise(serialised, resultsPath); + + if (isFileTest) { + const resultΩ = deserialised as BettererFileTestResultΩ; + const details = resultΩ.files + .filter((file) => !onlyFileTests || filePaths.includes(file.absolutePath)) + .reduce((summary, file) => { + summary[file.absolutePath] = file.issues; + return summary; + }, {}); + return { name, isFileTest, details }; + } else { + const details = await test.config.printer(deserialised); + return { name, isFileTest, details }; + } + }) + ); + + return new BettererResultsSummaryΩ(testStatuses, onlyFileTests); + } catch (error) { + await reporter.configError?.(config, error as BettererError); + throw error; + } finally { + await destroyGlobals(); + } } } diff --git a/packages/betterer/src/results/results.ts b/packages/betterer/src/results/results.ts new file mode 100644 index 000000000..4ed294f26 --- /dev/null +++ b/packages/betterer/src/results/results.ts @@ -0,0 +1,60 @@ +import type { BettererFilePath } from '../fs/index.js'; +import type { BettererTestNames } from '../test/index.js'; +import type { BettererResultsSerialised } from './types.js'; + +import assert from 'node:assert'; + +import { BettererResultsFileΩ } from '../fs/index.js'; +import { write } from '../fs/index.js'; +import { printResults } from './print.js'; + +export class BettererResultsΩ { + private _expected: BettererResultsSerialised; + + private constructor( + private _resultsPath: BettererFilePath, + private _baseline: BettererResultsSerialised + ) { + this._expected = this._baseline; + } + + public static async create(resultsPath: BettererFilePath) { + const resultsFile = new BettererResultsFileΩ(resultsPath); + return new BettererResultsΩ(resultsPath, await resultsFile.parse()); + } + + public getBaseline(testName: string): string { + return this._getResult(testName, this._baseline); + } + + public getExpected(testName: string): string { + return this._getResult(testName, this._expected); + } + + public getExpectedTestNames(): BettererTestNames { + return Object.keys(this._expected); + } + + public hasBaseline(testName: string): boolean { + return Object.hasOwnProperty.call(this._baseline, testName); + } + + public async write(result: BettererResultsSerialised): Promise { + const printedExpected = printResults(this._expected); + const printedResult = printResults(result); + + const shouldWrite = printedResult !== printedExpected; + if (shouldWrite) { + await write(printedResult, this._resultsPath); + this._expected = result; + return printedResult; + } + return null; + } + + private _getResult(name: string, results: BettererResultsSerialised): string { + const result = results[name]; + assert(result); + return result.value; + } +} diff --git a/packages/betterer/src/results/results.worker.ts b/packages/betterer/src/results/results.worker.ts new file mode 100644 index 000000000..fb93df17a --- /dev/null +++ b/packages/betterer/src/results/results.worker.ts @@ -0,0 +1,58 @@ +import type { BettererConfig } from '../config/types.js'; +import type { BettererTestNames } from '../test/index.js'; +import type { BettererResultsSerialised } from './types.js'; + +import { invariantΔ } from '@betterer/errors'; +import { exposeToMainΔ } from '@betterer/worker'; + +import { BettererResultsΩ } from './results.js'; + +let results: BettererResultsΩ | null = null; + +/** @knipignore part of worker API */ +export async function init(config: BettererConfig): Promise { + results = await BettererResultsΩ.create(config.resultsPath); +} + +/** @knipignore part of worker API */ +export function getBaseline(testName: string): string { + checkInitialised(results); + return results.getBaseline(testName); +} + +/** @knipignore part of worker API */ +export function getExpected(testName: string): string { + checkInitialised(results); + return results.getExpected(testName); +} + +/** @knipignore part of worker API */ +export function getExpectedTestNames(): BettererTestNames { + checkInitialised(results); + return results.getExpectedTestNames(); +} + +/** @knipignore part of worker API */ +export function hasBaseline(testName: string): boolean { + checkInitialised(results); + return results.hasBaseline(testName); +} + +/** @knipignore part of worker API */ +export async function write(result: BettererResultsSerialised): Promise { + checkInitialised(results); + return await results.write(result); +} + +function checkInitialised(results: BettererResultsΩ | null): asserts results is BettererResultsΩ { + invariantΔ(results, '`results` should be set when `init` is called!'); +} + +exposeToMainΔ({ + init, + getBaseline, + getExpected, + getExpectedTestNames, + hasBaseline, + write +}); diff --git a/packages/betterer/src/results/types.ts b/packages/betterer/src/results/types.ts index 63af0f297..bc7787d7d 100644 --- a/packages/betterer/src/results/types.ts +++ b/packages/betterer/src/results/types.ts @@ -1,13 +1,61 @@ +import type { BettererWorkerAPI } from '@betterer/worker'; + import type { BettererFileIssues } from '../test/index.js'; +/** + * @public Options for when merging conflicts in the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file} + * via the {@link @betterer/betterer#merge | `betterer.merge()` API}. + * + * @remarks The options object will be validated by **Betterer**. + */ +export interface BettererOptionsMerge { + /** + * File contents for merging. If omitted, the `resultsPath` will be read and merged. + */ + contents?: Array; + /** + * The current working directory. + * @defaultValue {@link https://nodejs.org/api/process.html#process_process_cwd | `process.cwd()` } + */ + cwd?: string; + /** + * The path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. + * The `resultsPath` should be relative to the `cwd`. + * @defaultValue `'./.betterer.results'` + */ + resultsPath?: string; +} + +export interface BettererConfigMerge { + contents: Array; + /** + * The current working directory. + */ + cwd: string; + /** + * The absolute path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. + */ + resultsPath: string; +} + /** * @public The deserialised result object for a single run of a single {@link @betterer/betterer#BettererTest | `BettererTest`}. + * + * @remarks Having a wrapper like this is useful to distinguish between no result (`null`), + * and a test that had a null result `{ value: null }`. */ export interface BettererResult { + /** + * The actual value of the result. + * + * @remarks could be anything, including `null`! + */ value: unknown; } /** + * @knipignore used by an exported function + * * The result object for a single run of a single {@link @betterer/betterer#BettererTest | `BettererTest`}. * The `value` is first serialised and then `JSON.stringify()`-ed, so it needs * to be `JSON.parse()`-ed and then deserialised to be useful. @@ -92,3 +140,5 @@ export type BettererFileTestResultSummaryDetails = Record; diff --git a/packages/betterer/src/run/index.ts b/packages/betterer/src/run/index.ts index 95fd30589..42c7f93fc 100644 --- a/packages/betterer/src/run/index.ts +++ b/packages/betterer/src/run/index.ts @@ -1,13 +1,14 @@ -export { BettererRunΩ, BettererRunsΩ } from './run.js'; -export { createRunWorkerPool } from './run-worker-pool.js'; -export { +export type { BettererDelta, BettererRun, - BettererRuns, - BettererReporterRun, - BettererRunSummary, BettererRunSummaries, - BettererRunWorkerPool + BettererRunSummary, + BettererRunWorkerPool, + BettererRuns } from './types.js'; -export { createWorkerRunConfig } from './worker-run-config.js'; -export type { BettererWorkerRunΩ } from './worker-run.js'; + +export { BettererRunΩ } from './run.js'; +export { BettererRunLoggerΩ } from './run-logger.js'; +export { BettererRunObsoleteΩ } from './run-obsolete.js'; +export { createRunWorkerPool } from './run-worker-pool.js'; +export { BettererWorkerRunΩ, loadTest } from './worker-run.js'; diff --git a/packages/betterer/src/run/meta/index.ts b/packages/betterer/src/run/meta/index.ts new file mode 100644 index 000000000..3526d3d65 --- /dev/null +++ b/packages/betterer/src/run/meta/index.ts @@ -0,0 +1 @@ +export type { BettererRunMeta } from './types.js'; diff --git a/packages/betterer/src/run/meta/types.ts b/packages/betterer/src/run/meta/types.ts new file mode 100644 index 000000000..72ef1eeaa --- /dev/null +++ b/packages/betterer/src/run/meta/types.ts @@ -0,0 +1,7 @@ +export interface BettererRunMeta { + readonly hasFilePaths: boolean; + readonly isCacheable: boolean; + readonly isNew: boolean; + readonly isOnly: boolean; + readonly isSkipped: boolean; +} diff --git a/packages/betterer/src/run/public.ts b/packages/betterer/src/run/public.ts deleted file mode 100644 index 034a3f4d6..000000000 --- a/packages/betterer/src/run/public.ts +++ /dev/null @@ -1 +0,0 @@ -export { BettererDelta, BettererRun, BettererRuns, BettererRunSummary, BettererRunSummaries } from './types.js'; diff --git a/packages/betterer/src/run/run-logger.ts b/packages/betterer/src/run/run-logger.ts new file mode 100644 index 000000000..545b02e70 --- /dev/null +++ b/packages/betterer/src/run/run-logger.ts @@ -0,0 +1,39 @@ +import type { BettererLogger, BettererLoggerCodeInfo, BettererLoggerMessage } from '@betterer/logger'; + +import type { BettererRunLogger } from '../reporters/types.js'; +import type { BettererRun } from './types.js'; + +export class BettererRunLoggerΩ implements BettererLogger { + constructor( + private _runLogger: BettererRunLogger, + private readonly _run: BettererRun + ) {} + + public async code(codeInfo: BettererLoggerCodeInfo): Promise { + await this._runLogger.code(this._run, codeInfo); + } + + public async debug(debug: BettererLoggerMessage): Promise { + await this._runLogger.debug(this._run, debug); + } + + public async error(error: BettererLoggerMessage): Promise { + await this._runLogger.error(this._run, error); + } + + public async info(info: BettererLoggerMessage): Promise { + await this._runLogger.info(this._run, info); + } + + public async progress(progress: BettererLoggerMessage): Promise { + await this._runLogger.progress(this._run, progress); + } + + public async success(success: BettererLoggerMessage): Promise { + await this._runLogger.success(this._run, success); + } + + public async warn(warn: BettererLoggerMessage): Promise { + await this._runLogger.warn(this._run, warn); + } +} diff --git a/packages/betterer/src/run/run-obsolete.ts b/packages/betterer/src/run/run-obsolete.ts new file mode 100644 index 000000000..0f3052f7f --- /dev/null +++ b/packages/betterer/src/run/run-obsolete.ts @@ -0,0 +1,60 @@ +import type { BettererLogger } from '@betterer/logger'; + +import type { BettererReporter, BettererReporterΩ } from '../reporters/index.js'; +import type { BettererResult } from '../results/index.js'; +import type { BettererRun, BettererRunSummary } from './types.js'; + +import { BettererRunLoggerΩ } from './run-logger.js'; +import { BettererRunSummaryΩ } from './run-summary.js'; + +export class BettererRunObsoleteΩ implements BettererRun { + public readonly expected: BettererResult; + public readonly filePaths = null; + public readonly isNew = false; + public readonly isObsolete = true; + public readonly isOnly = false; + public readonly isRemoved: boolean; + public readonly isSkipped = false; + public readonly lifecycle = Promise.withResolvers(); + public readonly logger: BettererLogger; + + constructor( + reporter: BettererReporter, + public readonly name: string, + public readonly baseline: BettererResult, + update = false + ) { + const { runLogger } = reporter as BettererReporterΩ; + this.logger = new BettererRunLoggerΩ(runLogger, this); + this.isRemoved = update; + this.expected = baseline; + } + + public async run(): Promise { + return await Promise.resolve( + new BettererRunSummaryΩ({ + baseline: this.baseline, + delta: null, + diff: null, + error: null, + expected: this.expected, + filePaths: this.filePaths, + isBetter: false, + isComplete: false, + isExpired: false, + isFailed: false, + isNew: false, + isObsolete: this.isObsolete, + isRemoved: this.isRemoved, + isSame: false, + isSkipped: false, + isUpdated: false, + isWorse: false, + name: this.name, + logger: this.logger, + result: null, + timestamp: -Infinity + }) + ); + } +} diff --git a/packages/betterer/src/run/run-summary.ts b/packages/betterer/src/run/run-summary.ts index 42f1d3a7a..51fd8b185 100644 --- a/packages/betterer/src/run/run-summary.ts +++ b/packages/betterer/src/run/run-summary.ts @@ -1,54 +1,54 @@ -import type { BettererError } from '@betterer/errors'; +import type { BettererLogger } from '@betterer/logger'; import type { BettererFilePaths } from '../fs/index.js'; import type { BettererResult } from '../results/index.js'; import type { BettererDiff } from '../test/index.js'; -import type { BettererDelta, BettererRun, BettererRunSummary } from './types.js'; - -export enum BettererRunStatus { - better, - failed, - new, - same, - skipped, - update, - worse -} +import type { BettererDelta, BettererRunSummary } from './types.js'; export class BettererRunSummaryΩ implements BettererRunSummary { + public readonly baseline: BettererResult | null; + public readonly expected: BettererResult | null; + public readonly delta: BettererDelta | null; + public readonly diff: BettererDiff | null; + public readonly error: Error | null; public readonly filePaths: BettererFilePaths | null; - public readonly name: string; - public readonly isBetter: boolean; + public readonly isComplete: boolean; + public readonly isExpired: boolean; public readonly isFailed: boolean; public readonly isNew: boolean; + public readonly isObsolete: boolean; + public readonly isRemoved: boolean; public readonly isSame: boolean; public readonly isSkipped: boolean; public readonly isUpdated: boolean; public readonly isWorse: boolean; + public readonly logger: BettererLogger; + public readonly name: string; + public readonly result: BettererResult | null; + public readonly timestamp: number; - constructor( - run: BettererRun, - public readonly result: BettererResult | null, - public readonly baseline: BettererResult | null, - public readonly expected: BettererResult | null, - status: BettererRunStatus, - public readonly isComplete: boolean, - public readonly isExpired: boolean, - public readonly delta: BettererDelta | null, - public readonly diff: BettererDiff | null, - public readonly error: BettererError | null, - public readonly printed: string | null, - public readonly timestamp: number - ) { - this.name = run.name; - this.filePaths = run.filePaths; - this.isBetter = status === BettererRunStatus.better; - this.isFailed = status === BettererRunStatus.failed; - this.isNew = status === BettererRunStatus.new; - this.isSame = status === BettererRunStatus.same; - this.isSkipped = status === BettererRunStatus.skipped; - this.isUpdated = status === BettererRunStatus.update; - this.isWorse = status === BettererRunStatus.worse; + constructor(summary: BettererRunSummary) { + this.baseline = summary.baseline; + this.delta = summary.delta; + this.diff = summary.diff; + this.error = summary.error; + this.expected = summary.expected; + this.filePaths = summary.filePaths; + this.isBetter = summary.isBetter; + this.isComplete = summary.isComplete; + this.isExpired = summary.isExpired; + this.isFailed = summary.isFailed; + this.isNew = summary.isNew; + this.isObsolete = summary.isObsolete; + this.isRemoved = summary.isRemoved; + this.isSame = summary.isSame; + this.isSkipped = summary.isSkipped; + this.isUpdated = summary.isUpdated; + this.isWorse = summary.isWorse; + this.logger = summary.logger; + this.name = summary.name; + this.result = summary.result; + this.timestamp = summary.timestamp; } } diff --git a/packages/betterer/src/run/run-worker-pool.ts b/packages/betterer/src/run/run-worker-pool.ts index 3187c069b..bebf8e3c7 100644 --- a/packages/betterer/src/run/run-worker-pool.ts +++ b/packages/betterer/src/run/run-worker-pool.ts @@ -2,8 +2,8 @@ import type { BettererWorkerPool } from '@betterer/worker'; import type { BettererRunWorker } from './types.js'; -import { createWorkerPool__, importWorker__ } from '@betterer/worker'; +import { createWorkerPoolΔ, importWorkerΔ } from '@betterer/worker'; -export function createRunWorkerPool(workers: number): BettererWorkerPool { - return createWorkerPool__(workers, () => importWorker__('./run.worker.js')); +export async function createRunWorkerPool(workers: number): Promise> { + return await createWorkerPoolΔ(workers, async () => await importWorkerΔ('./run.worker.js')); } diff --git a/packages/betterer/src/run/run.ts b/packages/betterer/src/run/run.ts index 191799e66..6ffef5a4f 100644 --- a/packages/betterer/src/run/run.ts +++ b/packages/betterer/src/run/run.ts @@ -1,26 +1,46 @@ -import type { BettererWorkerRunConfig } from '../config/index.js'; -import type { BettererFilePaths, BettererVersionControlWorker } from '../fs/index.js'; +import { exposeToWorkerΔ } from '@betterer/worker'; +import type { BettererError } from '@betterer/errors'; +import type { BettererLogger } from '@betterer/logger'; + +import type { BettererFilePaths } from '../fs/index.js'; +import type { BettererReporter, BettererReporterΩ } from '../reporters/index.js'; import type { BettererTestMeta } from '../test/index.js'; -import type { BettererRun, BettererRunSummary, BettererRunWorkerHandle, BettererRunWorkerPool } from './types.js'; +import type { BettererRunMeta } from './meta/types.js'; +import type { BettererRun, BettererRunSummary, BettererRunWorkerHandle } from './types.js'; -import { getTime__ } from '@betterer/time'; +import { getTimeΔ } from '@betterer/time'; +import { getGlobals } from '../globals.js'; import { BettererResultΩ } from '../results/index.js'; +import { BettererRunLoggerΩ } from './run-logger.js'; +import { BettererRunSummaryΩ } from './run-summary.js'; export class BettererRunΩ implements BettererRun { + public readonly lifecycle = Promise.withResolvers(); public readonly isNew: boolean; + public readonly isObsolete: boolean = false; + public readonly isOnly: boolean; + public readonly isRemoved: boolean = false; public readonly isSkipped: boolean; + public readonly name: string; + public readonly logger: BettererLogger; private constructor( - public name: string, private _workerHandle: BettererRunWorkerHandle, + reporter: BettererReporter, public testMeta: BettererTestMeta, + public runMeta: BettererRunMeta, public baseline: BettererResultΩ | null, public expected: BettererResultΩ | null, public filePaths: BettererFilePaths | null ) { - this.isNew = testMeta.isNew; - this.isSkipped = testMeta.isSkipped; + const { runLogger } = reporter as BettererReporterΩ; + this.logger = exposeToWorkerΔ(new BettererRunLoggerΩ(runLogger, this)); + + this.isNew = !(baseline && expected); + this.isOnly = runMeta.isOnly; + this.isSkipped = runMeta.isSkipped; + this.name = testMeta.name; // Always run all files for a new test, even if just passed a single file: if (this.isNew && this.filePaths) { @@ -28,38 +48,68 @@ export class BettererRunΩ implements BettererRun { } } - public static async create( - runWorkerPool: BettererRunWorkerPool, - testName: string, - config: BettererWorkerRunConfig, - filePaths: BettererFilePaths, - versionControl: BettererVersionControlWorker - ): Promise { + public static async create(testMeta: BettererTestMeta, filePaths: BettererFilePaths): Promise { + const { config, fs, reporter, results, runWorkerPool } = getGlobals(); + const workerHandle = runWorkerPool.getWorkerHandle(); const worker = await workerHandle.claim(); - const testMeta = await worker.api.init(testName, config, versionControl); + + const runMeta = await worker.api.init(testMeta, { ...config, workers: 1 }, fs, results); workerHandle.release(); - const baseline = !testMeta.isNew ? new BettererResultΩ(JSON.parse(testMeta.baselineJSON)) : null; - const expected = !testMeta.isNew ? new BettererResultΩ(JSON.parse(testMeta.expectedJSON)) : null; + let baseline: BettererResultΩ | null = null; + let expected: BettererResultΩ | null = null; + + const isNew = !(await results.api.hasBaseline(testMeta.name)); + if (!isNew) { + const baselineSerialised = await results.api.getBaseline(testMeta.name); + const expectedSerialised = await results.api.getExpected(testMeta.name); + baseline = new BettererResultΩ(JSON.parse(baselineSerialised), baselineSerialised); + expected = new BettererResultΩ(JSON.parse(expectedSerialised), expectedSerialised); + } return new BettererRunΩ( - testName, workerHandle, + reporter, testMeta, + runMeta, baseline, expected, - testMeta.isFileTest ? filePaths : null + runMeta.hasFilePaths ? filePaths : null ); } - public async run(isSkipped: boolean): Promise { + public async run(isFiltered: boolean): Promise { const worker = await this._workerHandle.claim(); - const timestamp = getTime__(); - const summary = await worker.api.run(this.name, this.filePaths, isSkipped, timestamp); - this._workerHandle.release(); - return summary; + const timestamp = getTimeΔ(); + try { + return await worker.api.run(this.logger, this.name, this.filePaths, isFiltered, timestamp); + } catch (error) { + return new BettererRunSummaryΩ({ + baseline: this.baseline, + delta: null, + diff: null, + error: error as BettererError, + expected: this.expected, + filePaths: this.filePaths, + isBetter: false, + isComplete: false, + isExpired: false, + isFailed: true, + isNew: this.isNew, + isObsolete: this.isObsolete, + isRemoved: this.isRemoved, + isSame: false, + isSkipped: false, + isUpdated: false, + isWorse: false, + logger: this.logger, + name: this.name, + result: null, + timestamp: timestamp + }); + } finally { + this._workerHandle.release(); + } } } - -export type BettererRunsΩ = ReadonlyArray; diff --git a/packages/betterer/src/run/run.worker.ts b/packages/betterer/src/run/run.worker.ts index 5affe3442..cf51c1db9 100644 --- a/packages/betterer/src/run/run.worker.ts +++ b/packages/betterer/src/run/run.worker.ts @@ -1,35 +1,73 @@ -import type { BettererWorkerRunConfig } from '../config/index.js'; -import type { BettererFilePaths, BettererVersionControlWorker } from '../fs/index.js'; -import type { BettererTestMeta } from '../test/index.js'; +import type { BettererLogger } from '@betterer/logger'; + +import type { BettererConfig } from '../config/types.js'; +import type { BettererFilePaths, BettererFileResolverΩ, BettererFSWorker } from '../fs/index.js'; +import type { BettererResultsWorker } from '../results/index.js'; +import type { BettererTest, BettererTestMeta } from '../test/index.js'; +import type { BettererRunMeta } from './meta/index.js'; import type { BettererRunSummary } from './types.js'; -import { exposeToMain__ } from '@betterer/worker'; +import { invariantΔ } from '@betterer/errors'; +import { exposeToMainΔ } from '@betterer/worker'; -import { BettererWorkerRunΩ } from './worker-run.js'; +import { isBettererResolverTest, isBettererTest } from '../test/index.js'; +import { loadTest, BettererWorkerRunΩ } from './worker-run.js'; +import { setGlobals } from '../globals.js'; -const TEST_NAME_RUN: Record = {}; +const TEST_META_MAP: Record = {}; +/** @knipignore part of worker API */ export async function init( - testName: string, - options: BettererWorkerRunConfig, - versionControl: BettererVersionControlWorker -): Promise { - const worker = await BettererWorkerRunΩ.create(options, testName, versionControl); - TEST_NAME_RUN[testName] = worker; - return worker.testMeta; + testMeta: BettererTestMeta, + config: BettererConfig, + fs: BettererFSWorker, + results: BettererResultsWorker +): Promise { + // If we're in a worker, we need to populate the globals: + if (process.env.BETTERER_WORKER !== 'false') { + setGlobals(config, fs, null, results, null, null); + } + + const { name } = testMeta; + + const test = await loadTest(testMeta); + const isTest = isBettererTest(test); + + invariantΔ(isTest, `"${name}" must return a \`BettererTest\`!`); + + const isNew = !(await results.api.hasBaseline(name)); + const { isOnly, isSkipped } = test; + const hasFilePaths = isBettererResolverTest(test); + let isCacheable = false; + if (hasFilePaths) { + const { resolver } = test; + const resolverΩ = resolver as BettererFileResolverΩ; + isCacheable = resolverΩ.isCacheable; + } + + const runMeta = { hasFilePaths, isCacheable, isNew, isOnly, isSkipped }; + + TEST_META_MAP[testMeta.name] = [test, testMeta, runMeta]; + return runMeta; } +/** @knipignore part of worker API */ export function run( + logger: BettererLogger, testName: string, filePaths: BettererFilePaths | null, - isSkipped: boolean, + isFiltered: boolean, timestamp: number ): Promise { - const worker = TEST_NAME_RUN[testName]; - return worker.run(filePaths, isSkipped, timestamp); + const meta = TEST_META_MAP[testName]; + invariantΔ(meta, `Worker has not been initialised for "${testName}"!`); + const [test, testMeta, runMeta] = meta; + + const run = new BettererWorkerRunΩ(test.config, logger, testMeta, runMeta); + return run.run(filePaths, isFiltered, timestamp); } -exposeToMain__({ +exposeToMainΔ({ init, run }); diff --git a/packages/betterer/src/run/types.ts b/packages/betterer/src/run/types.ts index 3e09e267f..370c71ea3 100644 --- a/packages/betterer/src/run/types.ts +++ b/packages/betterer/src/run/types.ts @@ -1,4 +1,5 @@ -import type { BettererError } from '@betterer/errors'; +import type { BettererConstraintResult } from '@betterer/constraints'; +import type { BettererLogger } from '@betterer/logger'; import type { BettererWorkerAPI, BettererWorkerHandle, BettererWorkerPool } from '@betterer/worker'; import type { BettererFilePaths } from '../fs/index.js'; @@ -7,7 +8,7 @@ import type { BettererDiff } from '../test/index.js'; /** * @public The change between a test runs and its baseline. A {@link @betterer/betterer#BettererRun | `BettererRun`} - * has a `delta` property if the test has a {@link @betterer/betterer#BettererTestOptionsComplex.progress | `progress()` } + * has a `delta` property if the test has a {@link @betterer/betterer#BettererTestConfig.progress | `progress()` } * handler. */ export type BettererDelta = @@ -68,6 +69,11 @@ export type BettererDelta = * ``` */ export interface BettererRun { + /** + * The {@link @betterer/logger#BettererLogger | `BettererLogger`} for this run, which + * can be used to emit information, issues, or status updates to the reporter. + */ + readonly logger: BettererLogger; /** * The baseline result for the test run. If the {@link @betterer/betterer#BettererTest | `BettererTest`} * gets better over the lifetime of the {@link @betterer/betterer#BettererContext}, `baseline` @@ -83,26 +89,35 @@ export interface BettererRun { readonly expected: BettererResult | null; /** * An array of file paths that will be tested. Will be `null` if the test is not a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}. - * If it is an empty array then all relevant files for the test (as defined by {@link @betterer/betterer#BettererFileTest.include | `BettererFileTest.include()`} - * and {@link @betterer/betterer#BettererFileTest.exclude | `BettererFileTest.exclude()`}) will + * If it is an empty array then all relevant files for the test (as defined by {@link @betterer/betterer#BettererResolverTest.include | `BettererResolverTest.include()`} + * and {@link @betterer/betterer#BettererResolverTest.exclude | `BettererResolverTest.exclude()`}) will * be tested. */ readonly filePaths: BettererFilePaths | null; - /** - * The name of the test for the run. - */ - readonly name: string; - /** * When `true`, this is the first time that a test has been run. Both `baseline` and `expected` * will be set to `null`. The default reporter will show that this test is new. */ readonly isNew: boolean; + /** + * When `true`, Betterer found a previous result for a test that is no longer relevant. Both `baseline` and `expected` + * will be set to previous result. The default reporter will show that this test is obsolete, and suggest that it can be removed. + */ + readonly isObsolete: boolean; + /** + * When `true`, this test is "obsolete", due to a test being delete or renamed, but the `--update` + * option was used. is enabled. The previous result will be deleted from the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. + */ + readonly isRemoved: boolean; /** * When `true`, this test has been skipped and the test function will not run. The default * reporter will show that this test has been skipped. */ readonly isSkipped: boolean; + /** + * The name of the test for the run. + */ + readonly name: string; } /** @@ -110,16 +125,19 @@ export interface BettererRun { */ export type BettererRuns = ReadonlyArray; -export interface BettererReporterRun extends BettererRun { - lifecycle: Promise; -} - export interface BettererRunning { - failed(error: BettererError): Promise; done(result: BettererResult): Promise; skipped(): Promise; } +export interface BettererRunningEnd { + comparison?: BettererConstraintResult | null; + diff?: BettererDiff | null; + result?: BettererResult | null; + timestamp: number; + isSkipped?: true; +} + /** * @public The summary of a {@link @betterer/betterer#BettererTest | `BettererTest`} run. Includes * everything from {@link @betterer/betterer#BettererRun | `BettererRun`}. @@ -166,7 +184,6 @@ export interface BettererRunSummary extends BettererRun { * The `error` that cause the run to fail. Will be present when `isFailed` is `true`. */ readonly error: Error | null; - readonly printed: string | null; /** * The result for the test run. Will be `null` when `isFailed` or `isSkipped` is `true`. */ diff --git a/packages/betterer/src/run/worker-run-config.ts b/packages/betterer/src/run/worker-run-config.ts deleted file mode 100644 index 49e69ee7c..000000000 --- a/packages/betterer/src/run/worker-run-config.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { BettererConfig, BettererWorkerRunConfig } from '../config/index.js'; - -export function createWorkerRunConfig(config: BettererConfig): BettererWorkerRunConfig { - return { - cache: config.cache, - cachePath: config.cachePath, - ci: config.ci, - configPaths: config.configPaths, - cwd: config.cwd, - excludes: config.excludes, - filters: config.filters, - includes: config.includes, - ignores: config.ignores, - logo: config.logo, - precommit: config.precommit, - resultsPath: config.resultsPath, - strict: config.strict, - tsconfigPath: config.tsconfigPath, - update: config.update, - versionControlPath: config.versionControlPath, - watch: config.watch, - workers: config.workers - }; -} diff --git a/packages/betterer/src/run/worker-run.ts b/packages/betterer/src/run/worker-run.ts index 2ffa50879..22add0360 100644 --- a/packages/betterer/src/run/worker-run.ts +++ b/packages/betterer/src/run/worker-run.ts @@ -1,38 +1,57 @@ -import type { BettererConfig, BettererWorkerRunConfig } from '../config/index.js'; -import type { BettererFilePaths, BettererVersionControlWorker } from '../fs/index.js'; +import type { BettererLogger } from '@betterer/logger'; + +import type { BettererFilePaths } from '../fs/index.js'; import type { BettererResult } from '../results/index.js'; -import type { BettererDiff, BettererTestConfig, BettererTestMeta } from '../test/index.js'; -import type { BettererGlobals } from '../types.js'; -import type { BettererRun, BettererRunning, BettererRunSummary } from './types.js'; +import type { + BettererTest, + BettererTestConfig, + BettererTestFactory, + BettererTestMap, + BettererTestMeta +} from '../test/index.js'; +import type { BettererRunMeta } from './meta/index.js'; +import type { BettererRun, BettererRunning, BettererRunningEnd, BettererRunSummary } from './types.js'; -import { BettererConstraintResult } from '@betterer/constraints'; -import { BettererError } from '@betterer/errors'; import assert from 'node:assert'; +import { BettererConstraintResult } from '@betterer/constraints'; +import { BettererError, isBettererErrorΔ } from '@betterer/errors'; -import { createWorkerConfig } from '../config/index.js'; -import { forceRelativePaths } from '../fs/index.js'; -import { BettererResultsFileΩ, BettererResultΩ } from '../results/index.js'; -import { isBettererFileTest, loadTestMeta, isBettererTest } from '../test/index.js'; -import { BettererRunStatus, BettererRunSummaryΩ } from './run-summary.js'; +import { forceRelativePaths, importTranspiled } from '../fs/index.js'; +import { getGlobals } from '../globals.js'; +import { BettererResultΩ } from '../results/index.js'; +import { isBettererTest } from '../test/index.js'; +import { isFunction } from '../utils.js'; +import { BettererRunSummaryΩ } from './run-summary.js'; -export class BettererWorkerRunΩ implements BettererRun { - public readonly config: BettererConfig; +export class BettererWorkerRunΩ implements BettererRun, BettererTestConfig { public readonly isNew: boolean; + public readonly isObsolete = false; + public readonly isRemoved = false; public readonly isSkipped: boolean; - public filePaths: BettererFilePaths | null = null; + public readonly name: string; + + public readonly constraint = this._test.constraint; + public readonly deadline = this._test.deadline; + public readonly goal = this._test.goal; + public readonly test = this._test.test; + public readonly differ = this._test.differ; + public readonly printer = this._test.printer; + public readonly progress = this._test.progress; + public readonly serialiser = this._test.serialiser; private _baseline: BettererResultΩ | null = null; private _expected: BettererResultΩ | null = null; + private _filePaths: BettererFilePaths | null = null; - private constructor( - public readonly name: string, - public readonly globals: BettererGlobals, + constructor( + private _test: BettererTestConfig, + public readonly logger: BettererLogger, public readonly testMeta: BettererTestMeta, - public readonly test: BettererTestConfig + public readonly runMeta: BettererRunMeta ) { - this.config = globals.config; - this.isNew = testMeta.isNew; - this.isSkipped = testMeta.isSkipped; + this.isNew = runMeta.isNew; + this.isSkipped = runMeta.isSkipped; + this.name = testMeta.name; } public get baseline(): BettererResultΩ { @@ -45,182 +64,164 @@ export class BettererWorkerRunΩ implements BettererRun { return this._expected; } - public static async create( - runConfig: BettererWorkerRunConfig, - name: string, - versionControl: BettererVersionControlWorker - ): Promise { - const config = await createWorkerConfig(runConfig); - const resultsFile = await BettererResultsFileΩ.create(config.resultsPath, versionControl); - const globals = { config, resultsFile, versionControl }; - - const isNew = !resultsFile.hasResult(name); - - const testFactories = loadTestMeta(config.configPaths); - const testFactoryMeta = testFactories[name]; - const test = await testFactoryMeta.factory(); - - const isTest = isBettererTest(test); - const isFileTest = isBettererFileTest(test); - - if (!(isTest || isFileTest)) { - throw new BettererError(`"${name}" must return a \`BettererTest\`.`); - } - - test.config.configPath = testFactoryMeta.configPath; - - const baseTestMeta = { - name, - configPath: testFactoryMeta.configPath, - isFileTest, - isOnly: test.isOnly, - isSkipped: test.isSkipped - }; - - let testMeta: BettererTestMeta; - if (isNew) { - testMeta = { - ...baseTestMeta, - isNew: true, - baselineJSON: null, - expectedJSON: null - }; - } else { - const [baselineJSON, expectedJSON] = resultsFile.getExpected(name); - testMeta = { - ...baseTestMeta, - isNew: false, - baselineJSON, - expectedJSON - }; - } - - return new BettererWorkerRunΩ(name, globals, testMeta, test.config); + public get filePaths(): BettererFilePaths | null { + return this._filePaths; } public async run( filePaths: BettererFilePaths | null, - isSkipped: boolean, + isFiltered: boolean, timestamp: number ): Promise { - this.filePaths = filePaths; + this.setFilePaths(filePaths); - if (!this.testMeta.isNew) { - this._baseline = this._deserialise(this.testMeta.baselineJSON); - this._expected = this._deserialise(this.testMeta.expectedJSON); + const { config, results } = getGlobals(); + const { resultsPath } = config; + + if (!this.runMeta.isNew) { + this._baseline = this._deserialise(await results.api.getBaseline(this.name)); + this._expected = this._deserialise(await results.api.getExpected(this.name)); } - const running = this._run(this.config, timestamp); + const running = this._run(timestamp); - if (isSkipped) { + if (this.runMeta.isSkipped || isFiltered) { return await running.skipped(); } - try { - const result = new BettererResultΩ(await this.test.test(this)); - return await running.done(result); - } catch (error) { - return await running.failed(error as BettererError); - } + // No try/catch - the main thread handles the `isFailed` case: + const result = await this.test(this); + const serialisedResult = await this.serialiser.serialise.call(this, result, resultsPath); + const printedResult = forceRelativePaths(await this.printer(serialisedResult), resultsPath); + return await running.done(new BettererResultΩ(result, printedResult)); + } + + public setFilePaths(newFilePaths: BettererFilePaths | null) { + this._filePaths = newFilePaths; } private _deserialise(resultJSON: string): BettererResultΩ | null { try { const serialised = JSON.parse(resultJSON) as unknown; - const { resultsPath } = this.config; - const { deserialise } = this.test.serialiser; - return new BettererResultΩ(deserialise(serialised, resultsPath)); + const { config } = getGlobals(); + return new BettererResultΩ(this.serialiser.deserialise(serialised, config.resultsPath), resultJSON); } catch { return null; } } - private _run(config: BettererConfig, timestamp: number): BettererRunning { - const end = async ( - status: BettererRunStatus, - result: BettererResult | null = null, - diff: BettererDiff | null = null, - error: BettererError | null = null - ): Promise => { - const isBetter = status === BettererRunStatus.better; - const isSame = status === BettererRunStatus.same; - const isUpdated = status === BettererRunStatus.update; - const isSkipped = status === BettererRunStatus.skipped; - const isFailed = status === BettererRunStatus.failed; - const isWorse = status === BettererRunStatus.worse; - - const baselineValue = this.isNew ? null : this.baseline.value; - const resultValue = !result ? null : result.value; - - const delta = await this.test.progress(baselineValue, resultValue); - - const { resultsPath, ci } = config; - const { serialise } = this.test.serialiser; - - const resultSerialised = resultValue != null ? new BettererResultΩ(serialise(resultValue, resultsPath)) : null; - const baselineSerialised = this.isNew ? null : new BettererResultΩ(serialise(this.baseline.value, resultsPath)); - const expectedSerialised = this.isNew ? null : new BettererResultΩ(serialise(this.expected.value, resultsPath)); - - const isComplete = resultValue != null && (await this.test.goal(resultValue)); - const isExpired = timestamp >= this.test.deadline; - let printed: string | null = null; - const shouldPrint = !(isComplete || (this.isNew && (isFailed || isSkipped))); - if (shouldPrint) { - const toPrint = isFailed || isSkipped || isWorse ? this.expected : (result as BettererResult); - const toPrintSerialised = this.test.serialiser.serialise(toPrint.value, config.resultsPath); - printed = forceRelativePaths(await this.test.printer(toPrintSerialised), config.versionControlPath); - } - - if (this.testMeta.isFileTest && !ci) { - if (isComplete) { - await this.globals.versionControl.api.clearCache(this.name); - } else if (isBetter || isSame || isUpdated || this.isNew) { - await this.globals.versionControl.api.updateCache(this.name, this.filePaths as Array); - } - } - - return new BettererRunSummaryΩ( - this, - resultSerialised, - baselineSerialised, - expectedSerialised, - status, - isComplete, - isExpired, - delta, - diff, - error, - printed, - timestamp + private _serialise(deserialised: BettererResult): BettererResultΩ | null { + try { + const { config } = getGlobals(); + const deserialisedΩ = deserialised as BettererResultΩ; + return new BettererResultΩ( + this.serialiser.serialise.call(this, deserialisedΩ.value, config.resultsPath), + deserialisedΩ.printed ); - }; + } catch { + return null; + } + } + private _run(timestamp: number): BettererRunning { return { done: async (result: BettererResultΩ): Promise => { if (this.isNew) { - return await end(BettererRunStatus.new, result); + return await this._end({ comparison: null, result, timestamp }); } - const comparison = await this.test.constraint(result.value, this.expected.value); + const comparison = await this.constraint(result.value, this.expected.value); if (comparison === BettererConstraintResult.same) { - return await end(BettererRunStatus.same, result); - } - - const diff = this.test.differ(this.expected.value, result.value); - if (comparison === BettererConstraintResult.better) { - return await end(BettererRunStatus.better, result, diff); + return await this._end({ comparison, result, timestamp }); } - const status = config.update ? BettererRunStatus.update : BettererRunStatus.worse; - return await end(status, result, diff); - }, - failed: async (error: BettererError): Promise => { - return await end(BettererRunStatus.failed, null, null, error); + const diff = await this.differ(this.expected.value, result.value); + return await this._end({ comparison, diff, result, timestamp }); }, skipped: async (): Promise => { - return await end(BettererRunStatus.skipped); + return await this._end({ timestamp, isSkipped: true }); } }; } + + private async _end(end: BettererRunningEnd): Promise { + const { comparison, diff, result, timestamp, isSkipped } = end; + const { config } = getGlobals(); + + const isWorse = comparison === BettererConstraintResult.worse; + const isUpdated = isWorse && config.update; + + const isComplete = !!result && (await this.goal(result.value)); + + const isExpired = timestamp >= this.deadline; + + const baselineValue = this.isNew ? null : this.baseline.value; + const delta = result ? await this.progress(baselineValue, result.value) : null; + + // Make sure to use the serialised result so it can be passed back to the main thread: + const serialisedResult = result ? this._serialise(result) : null; + const serialisedBaseline = !this.isNew ? this._serialise(this.baseline) : null; + const serialisedExpected = !this.isNew ? this._serialise(this.expected) : null; + + // `logger` isn't included here, which is why we need the `as` but it will + // definitely be assigned on the main thread so it's okay! + return new BettererRunSummaryΩ({ + baseline: serialisedBaseline, + delta, + diff: diff ?? null, + expected: serialisedExpected, + error: null, + filePaths: this.filePaths, + isBetter: comparison === BettererConstraintResult.better, + isComplete, + isExpired, + isFailed: false, + isNew: this.isNew, + isObsolete: this.isObsolete, + isRemoved: this.isRemoved, + isSame: comparison === BettererConstraintResult.same, + isSkipped: !!isSkipped, + isUpdated, + isWorse, + name: this.name, + result: serialisedResult, + timestamp + } as BettererRunSummary); + } +} + +export async function loadTest(testMeta: BettererTestMeta): Promise { + const { name } = testMeta; + + let test: BettererTest | null = null; + try { + const factory = await loadTestFactory(testMeta); + test = await factory(); + } catch (e) { + if (isBettererErrorΔ(e)) { + throw e; + } + } + const isTest = isBettererTest(test); + + if (!test || !isTest) { + throw new BettererError(`"${name}" must return a \`BettererTest\`.`); + } + + return test; +} + +async function loadTestFactory(testMeta: BettererTestMeta): Promise { + const { configPath, name } = testMeta; + try { + const exports = (await importTranspiled(configPath)) as BettererTestMap; + const factory = exports[name]; + if (!isFunction(factory)) { + throw new BettererError(`"${name}" must be a function.`); + } + return factory; + } catch (error) { + throw new BettererError(`could not create "${name}" from "${configPath}". 😔`, error as BettererError); + } } diff --git a/packages/betterer/src/runner/index.ts b/packages/betterer/src/runner/index.ts index f9e987626..7491645df 100644 --- a/packages/betterer/src/runner/index.ts +++ b/packages/betterer/src/runner/index.ts @@ -1,2 +1,3 @@ +export type { BettererRunner } from './types.js'; + export { BettererRunnerΩ } from './runner.js'; -export { BettererRunner } from './types.js'; diff --git a/packages/betterer/src/runner/public.ts b/packages/betterer/src/runner/public.ts deleted file mode 100644 index 024579c27..000000000 --- a/packages/betterer/src/runner/public.ts +++ /dev/null @@ -1 +0,0 @@ -export { BettererRunner } from './types.js'; diff --git a/packages/betterer/src/runner/runner.ts b/packages/betterer/src/runner/runner.ts index 54fbe6fd2..879cea7a5 100644 --- a/packages/betterer/src/runner/runner.ts +++ b/packages/betterer/src/runner/runner.ts @@ -1,81 +1,199 @@ -import type { BettererOptionsAll, BettererOptionsOverride } from '../config/index.js'; -import type { BettererFilePaths } from '../fs/index.js'; -import type { BettererSuiteSummary } from '../suite/index.js'; +import type { FSWatcher } from 'chokidar'; +import type { BettererOptions } from '../api/index.js'; +import type { BettererConfig, BettererOptionsOverride } from '../config/index.js'; +import type { BettererContextSummary } from '../context/index.js'; +import type { BettererFilePaths, BettererOptionsWatcher } from '../fs/index.js'; +import type { BettererReporterΩ } from '../reporters/index.js'; +import type { BettererSuiteSummary, BettererSuiteSummaryΩ, BettererSuiteΩ } from '../suite/index.js'; import type { BettererRunner } from './types.js'; import { BettererError } from '@betterer/errors'; +import minimatch from 'minimatch'; import { BettererContextΩ } from '../context/index.js'; -import { createGlobals } from '../globals.js'; +import { createWatcher, isTempFilePath, WATCHER_EVENTS } from '../fs/index.js'; +import { createGlobals, destroyGlobals, getGlobals } from '../globals.js'; import { normalisedPath } from '../utils.js'; -import { createWatcher, WATCHER_EVENTS } from './watcher.js'; const DEBOUNCE_TIME = 200; export class BettererRunnerΩ implements BettererRunner { + public config: BettererConfig; + public readonly lifecycle = Promise.withResolvers(); + + private _reporterContextStart: Promise; + private _isRunOnce = false; + private _isStopped = false; private _jobs: Array = []; - private _running: Promise | null = null; + private _running: Promise | null = null; + + private constructor( + private readonly _context: BettererContextΩ, + private readonly _watcher: FSWatcher | null + ) { + const { config, reporter } = getGlobals(); - private constructor(private _context: BettererContextΩ) {} + this.config = config; - public static async create(options: BettererOptionsAll): Promise { - const globals = await createGlobals(options); - const watcher = await createWatcher(globals); + const reporterΩ = reporter as BettererReporterΩ; + // Don't await here! A custom reporter could be awaiting + // the lifecycle promise which is unresolved right now! + this._reporterContextStart = reporterΩ.contextStart(this, this.lifecycle.promise); - const context = new BettererContextΩ(globals, watcher); - const runner = new BettererRunnerΩ(context); + // eslint-disable-next-line @typescript-eslint/no-misused-promises -- SIGTERM doesn't care about Promises + process.on('SIGTERM', this._sigterm); - if (watcher) { - watcher.on('all', (event: string, filePath: string) => { - if (WATCHER_EVENTS.includes(event)) { - void runner.queue([filePath]); + if (this._watcher) { + this._watcher.on('all', (event: string, filePath: string) => { + if (this._shouldQueue(event, filePath)) { + void this.queue([filePath]); } }); } + } - return runner; + public static async create( + options: BettererOptions, + optionsWatcher: BettererOptionsWatcher = {} + ): Promise { + await createGlobals(options, optionsWatcher); + const watcher = await createWatcher(); + const context = new BettererContextΩ(); + + return new BettererRunnerΩ(context, watcher); } public async options(optionsOverride: BettererOptionsOverride): Promise { await this._context.options(optionsOverride); + await this._restart(optionsOverride); } - public run(): Promise { - return this._context.runOnce(); + public async run(): Promise { + this._isRunOnce = true; + await this.queue([]); + return await this.stop(); } - public queue(filePathOrPaths: string | BettererFilePaths = []): Promise { + public async queue(filePathOrPaths: string | BettererFilePaths = []): Promise { const filePaths: BettererFilePaths = Array.isArray(filePathOrPaths) ? filePathOrPaths : [filePathOrPaths as string]; - if (this._context.isDestroyed) { + if (this._isStopped) { throw new BettererError('You cannot queue a test run after the runner has been stopped! 💥'); } this._addJob(filePaths); - return new Promise((resolve) => { - setTimeout(() => { - void (async () => { - await this._processQueue(); - resolve(); - })(); - }, DEBOUNCE_TIME); - }); + try { + await new Promise((resolve, reject) => { + setTimeout(() => { + void (async () => { + try { + await this._processQueue(); + resolve(); + } catch (error) { + reject(error as BettererError); + } + })(); + }, DEBOUNCE_TIME); + }); + } catch (error) { + await this.stop(); + throw error; + } } - public async stop(): Promise; - public async stop(force: true): Promise; - public async stop(force?: true): Promise { + public async stop(): Promise; + public async stop(force: true): Promise; + public async stop(force?: true): Promise { + if (this._isStopped) { + return null; + } + + const { reporter } = getGlobals(); + const reporterΩ = reporter as BettererReporterΩ; + try { - if (!force) { - await this._running; + this._isStopped = true; + + if (this._watcher) { + await this._watcher.close(); } - return await this._context.stop(); - } catch (error) { + if (force) { return null; } + + await this._running; + + const contextSummary = await this._context.stop(); + const suiteSummaryΩ = contextSummary.lastSuite as BettererSuiteSummaryΩ; + + const { config, fs, results } = getGlobals(); + + if (!config.ci) { + const didWrite = await results.api.write(suiteSummaryΩ.result); + if (didWrite && config.precommit) { + await fs.api.add(config.resultsPath); + } + } + + if (config.cache) { + await fs.api.writeCache(); + } + + // Lifecycle promise is resolved, so it's safe to await + // the result of `reporter.contextStart`: + this.lifecycle.resolve(contextSummary); + await this._reporterContextStart; + + await reporterΩ.contextEnd(contextSummary); + + return contextSummary; + } catch (error) { + // Lifecycle promise is rejected, so it's safe to await + // the result of `reporter.contextStart`: + this.lifecycle.reject(error as BettererError); + await this._reporterContextStart; + + await reporterΩ.contextError(this, error as BettererError); + throw error; + } finally { + await destroyGlobals(); + // eslint-disable-next-line @typescript-eslint/no-misused-promises -- SIGTERM doesn't care about Promises + process.off('SIGTERM', this._sigterm); } } + private _shouldQueue(event: string, itemPath: string): boolean { + if (!WATCHER_EVENTS.includes(event)) { + return false; + } + + const { config } = getGlobals(); + const { cachePath, cwd, resultsPath } = config; + + itemPath = normalisedPath(itemPath); + const normalisedCwd = normalisedPath(cwd); + const isCwd = itemPath === normalisedPath(normalisedCwd); + if (isCwd) { + return true; + } + + const isGitPath = itemPath.includes('.git'); + const isResultsPath = itemPath === normalisedPath(resultsPath); + const isCachePath = itemPath === normalisedPath(cachePath); + const isTempPath = isTempFilePath(itemPath); + if (isGitPath || isResultsPath || isCachePath || isTempPath) { + return false; + } + + // read `ignores` here so that it can be updated by watch mode: + const { ignores } = config; + const watchIgnores = ignores.map((ignore) => `${normalisedCwd}/${ignore}`); + const isIgnored = watchIgnores.some((ignore) => minimatch(itemPath, ignore, { matchBase: true })); + return !isIgnored; + } + + private _sigterm = () => this.stop(true); + private _addJob(filePaths: BettererFilePaths = []): void { const normalisedPaths = filePaths.map(normalisedPath); this._jobs.push(normalisedPaths); @@ -83,7 +201,7 @@ export class BettererRunnerΩ implements BettererRunner { private async _processQueue(): Promise { // It's possible for the queue debounce to trigger *after* `this.stop()` has been called: - if (this._context.isDestroyed) { + if (this._isStopped) { this._jobs = []; return; } @@ -98,11 +216,35 @@ export class BettererRunnerΩ implements BettererRunner { const runPaths = Array.from(filePaths).sort(); this._jobs = []; - this._running = this._context.run(runPaths); + this._running = this._context.run(runPaths, this._isRunOnce); + await this._running; + } + } + + private async _restart(optionsOverride: BettererOptionsOverride): Promise { + if (optionsOverride.reporters) { + const { reporter } = getGlobals(); + + const reporterΩ = reporter as BettererReporterΩ; + // Don't await here! A custom reporter could be awaiting + // the lifecycle promise which is unresolved right now! + this._reporterContextStart = reporterΩ.contextStart(this, this.lifecycle.promise); + } + + if (optionsOverride.filters) { + // Wait for any pending run to finish, and any existing reporter to render: + let lastSuiteΩ: BettererSuiteΩ | null = null; try { - await this._running; + const lastSuite = this._context.lastSuite; + lastSuiteΩ = lastSuite as BettererSuiteΩ; + try { + // This might throw or reject, but we want to rerun either way: + await lastSuiteΩ.lifecycle.promise; + } finally { + void this._context.run(lastSuite.filePaths); + } } catch { - // Errors will be handled by reporters + // It's okay if there's not a pending suite! } } } diff --git a/packages/betterer/src/runner/types.ts b/packages/betterer/src/runner/types.ts index cb401bbfa..ba50248f6 100644 --- a/packages/betterer/src/runner/types.ts +++ b/packages/betterer/src/runner/types.ts @@ -1,15 +1,10 @@ -import type { BettererOptionsOverride } from '../config/index.js'; +import type { BettererContext, BettererContextSummary } from '../context/types.js'; import type { BettererFilePaths } from '../fs/index.js'; -import type { BettererSuiteSummary } from '../suite/index.js'; /** * @public The JS API for controlling **Betterer** runs. */ -export interface BettererRunner { - /** - * Make changes to the runner config. The updated config will be used for the next run. - */ - options(optionsOverride: BettererOptionsOverride): void; +export interface BettererRunner extends BettererContext { /** * Queue a **Betterer** run. * @@ -20,18 +15,19 @@ export interface BettererRunner { */ queue(filePaths?: string | BettererFilePaths): Promise; /** - * Stop the runner, but first wait for it to finish running the suite. + * Stop the runner, but first wait for it to finish running the current suite. * - * @returns the most recent {@link @betterer/betterer#BettererSuiteSummary | `BettererSuiteSummary`}. + * @returns the {@link @betterer/betterer#BettererContextSummary | `BettererContextSummary`} containing + * details of all successful runs. * @throws the error if something went wrong while stopping everything. */ - stop(): Promise; + stop(): Promise; /** * Stop the runner, without waiting for it to finish running the suite. * * @param force - when `true`, the runner will stop immediately and any errors will be ignored. - * @returns the most recent {@link @betterer/betterer#BettererSuiteSummary | `BettererSuiteSummary`}. - * (or `null` if a run hasn't finished yet). + * @returns the {@link @betterer/betterer#BettererContextSummary | `BettererContextSummary`} containing + * details of all successful runs, (or `null` if a run hasn't finished yet). */ - stop(force: true): Promise; + stop(force?: true): Promise; } diff --git a/packages/betterer/src/runner/watcher.ts b/packages/betterer/src/runner/watcher.ts deleted file mode 100644 index 1b1e6ceae..000000000 --- a/packages/betterer/src/runner/watcher.ts +++ /dev/null @@ -1,51 +0,0 @@ -import type { FSWatcher } from 'chokidar'; - -import type { BettererGlobals } from '../types.js'; - -import { watch } from 'chokidar'; -import minimatch from 'minimatch'; -import path from 'node:path'; - -import { normalisedPath } from '../utils.js'; - -export const WATCHER_EVENTS = ['add', 'change']; - -export async function createWatcher(globals: BettererGlobals): Promise { - const { config } = globals; - - if (!config.watch) { - return null; - } - - const { cachePath, cwd, resultsPath } = config; - - const watcher = watch(cwd, { - ignoreInitial: true, - ignored: (itemPath: string) => { - itemPath = normalisedPath(itemPath); - const isCwd = itemPath === normalisedPath(cwd); - if (isCwd) { - return false; - } - - const isResultsPath = itemPath === normalisedPath(resultsPath); - const isCachePath = itemPath === normalisedPath(cachePath); - if (isResultsPath || isCachePath) { - return true; - } - - // read `ignores` here so that it can be updated by watch mode: - const { ignores } = config; - const watchIgnores = ignores.map((ignore) => path.join(cwd, ignore)); - const isIgnored = watchIgnores.some((ignore) => minimatch(itemPath, ignore, { matchBase: true })); - return isIgnored; - } - }); - - await new Promise((resolve, reject) => { - watcher.on('ready', resolve); - watcher.on('error', reject); - }); - - return watcher; -} diff --git a/packages/betterer/src/suite/index.ts b/packages/betterer/src/suite/index.ts index e154e97c6..115e2774a 100644 --- a/packages/betterer/src/suite/index.ts +++ b/packages/betterer/src/suite/index.ts @@ -1,3 +1,4 @@ -export { BettererSuiteΩ } from './suite.js'; export { BettererSuiteSummaryΩ } from './suite-summary.js'; -export { BettererSuite, BettererSuiteSummaries, BettererSuiteSummary } from './types.js'; + +export { BettererSuiteΩ } from './suite.js'; +export { BettererSuite, BettererSuiteSummaries, BettererSuiteSummary, BettererSuites } from './types.js'; diff --git a/packages/betterer/src/suite/public.ts b/packages/betterer/src/suite/public.ts deleted file mode 100644 index 822164cc7..000000000 --- a/packages/betterer/src/suite/public.ts +++ /dev/null @@ -1 +0,0 @@ -export { BettererSuite, BettererSuiteSummaries, BettererSuiteSummary } from './types.js'; diff --git a/packages/betterer/src/suite/suite-summary.ts b/packages/betterer/src/suite/suite-summary.ts index d79afa26e..731df106b 100644 --- a/packages/betterer/src/suite/suite-summary.ts +++ b/packages/betterer/src/suite/suite-summary.ts @@ -1,15 +1,38 @@ import type { BettererFilePaths } from '../fs/index.js'; +import type { BettererResultsSerialised, BettererResultΩ } from '../results/index.js'; import type { BettererRuns, BettererRunSummaries } from '../run/index.js'; import type { BettererTestNames } from '../test/index.js'; import type { BettererSuiteSummary } from './types.js'; +import { BettererError, invariantΔ } from '@betterer/errors'; + +import { getGlobals } from '../globals.js'; + export class BettererSuiteSummaryΩ implements BettererSuiteSummary { + public readonly error: BettererError | null = null; + public readonly result: BettererResultsSerialised; + constructor( public readonly filePaths: BettererFilePaths, public readonly runs: BettererRuns, - public readonly runSummaries: BettererRunSummaries, - public readonly changed: BettererTestNames - ) {} + public readonly runSummaries: BettererRunSummaries + ) { + this.result = this._mergeResult(); + + try { + this._handleContextErrors(); + } catch (error) { + this.error = error as BettererError; + } + } + + public get better(): BettererRunSummaries { + return this.runSummaries.filter((runSummary) => runSummary.isBetter); + } + + public get changed(): BettererTestNames { + return this._getChanged(); + } public get completed(): BettererRunSummaries { return this.runSummaries.filter((runSummary) => runSummary.isComplete); @@ -19,10 +42,6 @@ export class BettererSuiteSummaryΩ implements BettererSuiteSummary { return this.runSummaries.filter((runSummary) => runSummary.isExpired); } - public get better(): BettererRunSummaries { - return this.runSummaries.filter((runSummary) => runSummary.isBetter); - } - public get failed(): BettererRunSummaries { return this.runSummaries.filter((runSummary) => runSummary.isFailed); } @@ -33,12 +52,22 @@ export class BettererSuiteSummaryΩ implements BettererSuiteSummary { ); } + public get obsolete(): BettererRunSummaries { + return this.runSummaries.filter((runSummary) => runSummary.isObsolete && !runSummary.isRemoved); + } + public get ran(): BettererRunSummaries { - return this.runSummaries.filter((runSummary) => !(runSummary.isSkipped || runSummary.isFailed)); + return this.runSummaries.filter( + (runSummary) => !(runSummary.isSkipped || runSummary.isFailed || runSummary.isObsolete || runSummary.isRemoved) + ); + } + + public get removed(): BettererRunSummaries { + return this.runSummaries.filter((runSummary) => runSummary.isRemoved); } public get same(): BettererRunSummaries { - return this.runSummaries.filter((runSummary) => runSummary.isSame); + return this.runSummaries.filter((runSummary) => runSummary.isSame && !runSummary.isComplete); } public get skipped(): BettererRunSummaries { @@ -50,8 +79,91 @@ export class BettererSuiteSummaryΩ implements BettererSuiteSummary { } public get worse(): BettererRunSummaries { - return this.runSummaries.filter((runSummary) => runSummary.isWorse); + return this.runSummaries.filter((runSummary) => runSummary.isWorse && !runSummary.isUpdated); + } + + private _getChanged(): BettererTestNames { + const obsoleteRunNames = this.obsolete.map((runSummary) => runSummary.name); + const notFailedOrSkippedOrObsolete = this.runSummaries.filter( + (runSummary) => !runSummary.isFailed && !runSummary.isSkipped && !runSummary.isObsolete + ); + const changedRuns = notFailedOrSkippedOrObsolete + .filter((runSummary) => !runSummary.isNew) + .filter((runSummary) => { + const { result, expected } = runSummary; + invariantΔ(result, 'Test is not _new_, _failed_, or _skipped_ so it must have a result!'); + invariantΔ(expected, 'Test is not _new_ so it must have an expected result!'); + const resultΩ = result as BettererResultΩ; + const expectedΩ = expected as BettererResultΩ; + return resultΩ.printed !== expectedΩ.printed; + }); + const newRuns = notFailedOrSkippedOrObsolete.filter((runSummary) => runSummary.isNew && !runSummary.isComplete); + const newOrChangedRunNames = [...changedRuns, ...newRuns].map((runSummary) => runSummary.name); + return [...obsoleteRunNames, ...newOrChangedRunNames]; } -} -export type BettererSuiteSummariesΩ = ReadonlyArray; + private _mergeResult(): BettererResultsSerialised { + return this.runSummaries.reduce((results, runSummary) => { + const { isFailed, isSkipped, isNew, isObsolete, isRemoved, isWorse, isUpdated } = runSummary; + const isSkippedOrFailed = isSkipped || isFailed; + if (isRemoved || (isSkippedOrFailed && isNew)) { + return results; + } + const { expected, name, result } = runSummary; + if ((isSkippedOrFailed && !isNew) || (isWorse && !isUpdated) || isObsolete) { + invariantΔ(expected, 'Test has successfully run in the past so it must have an expected result!'); + const expectedΩ = expected as BettererResultΩ; + results[name] = { value: expectedΩ.printed }; + return results; + } + invariantΔ(result, 'Test has successfully run so it must have a new result!'); + const resultΩ = result as BettererResultΩ; + results[name] = { value: resultΩ.printed }; + return results; + }, {}); + } + + private _handleContextErrors(): void { + const { changed, expired, failed, worse } = this; + const hasChanged = changed.length > 0; + const hasExpired = expired.length > 0; + const hasFailed = failed.length > 0; + const hasWorse = worse.length > 0; + + if (!(hasChanged || hasExpired || hasFailed || hasWorse)) { + return; + } + + const errors = failed.flatMap((failed) => { + invariantΔ(failed.error, 'A failed run will always have an `error`!'); + return [failed.name, failed.error]; + }); + + const worseNames = worse.map((run) => run.name); + + const { config } = getGlobals(); + const { ci, precommit, strictDeadlines } = config; + if (strictDeadlines && hasExpired) { + const expiredNames = expired.map((run) => run.name); + throw new BettererError('Tests have passed their deadline without achieving their goal. ❌', ...expiredNames); + } + if (ci && hasFailed) { + throw new BettererError('Tests failed while running in CI mode. ❌', ...errors); + } + if (ci && hasChanged) { + throw new BettererError('Unexpected changes detected while running in CI mode. ❌', ...changed); + } + if (precommit && hasFailed) { + throw new BettererError('Tests failed while running in precommit mode. ❌', ...errors); + } + if (precommit && hasWorse) { + throw new BettererError('Tests got worse while running in precommit mode. ❌', ...worseNames); + } + if (hasFailed) { + throw new BettererError('Tests failed while running Betterer. ❌', ...errors); + } + if (hasWorse) { + throw new BettererError('Tests got worse while running Betterer. ❌', ...worseNames); + } + } +} diff --git a/packages/betterer/src/suite/suite.ts b/packages/betterer/src/suite/suite.ts index 302e286f5..78c922019 100644 --- a/packages/betterer/src/suite/suite.ts +++ b/packages/betterer/src/suite/suite.ts @@ -1,84 +1,95 @@ import type { BettererError } from '@betterer/errors'; -import type { BettererConfig } from '../config/index.js'; import type { BettererFilePaths } from '../fs/index.js'; import type { BettererReporterΩ } from '../reporters/index.js'; -import type { BettererResultsFileΩ } from '../results/index.js'; -import type { - BettererReporterRun, - BettererRuns, - BettererRunSummaries, - BettererRunSummary, - BettererRunsΩ -} from '../run/index.js'; -import type { Defer } from '../utils.js'; -import type { BettererSuite } from './types.js'; - -import assert from 'node:assert'; - -import { defer } from '../utils.js'; +import type { BettererRuns } from '../run/index.js'; +import type { BettererSuite, BettererSuiteSummary } from './types.js'; + +import { invariantΔ } from '@betterer/errors'; + +import { getGlobals } from '../globals.js'; +import { BettererResultΩ } from '../results/index.js'; +import { BettererRunObsoleteΩ, BettererRunΩ } from '../run/index.js'; import { BettererSuiteSummaryΩ } from './suite-summary.js'; const NEGATIVE_FILTER_TOKEN = '!'; export class BettererSuiteΩ implements BettererSuite { - private _reporter: BettererReporterΩ; + public readonly lifecycle = Promise.withResolvers(); - constructor( - private _config: BettererConfig, - private _resultsFile: BettererResultsFileΩ, + private constructor( public filePaths: BettererFilePaths, public runs: BettererRuns - ) { - this._reporter = this._config.reporter as BettererReporterΩ; + ) {} + + public static async create(filePaths: BettererFilePaths): Promise { + const { config, reporter, results, testMetaLoader } = getGlobals(); + const { configPaths, update } = config; + + const expectedTestNames = await results.api.getExpectedTestNames(); + + const testsMeta = await testMetaLoader.api.loadTestsMeta(configPaths); + const runsΩ = await Promise.all( + testsMeta.map(async (testMeta) => { + return await BettererRunΩ.create(testMeta, filePaths); + }) + ); + + const testNames = testsMeta.map((testMeta) => testMeta.name); + const obsoleteTestNames = expectedTestNames.filter((expectedTestName) => !testNames.includes(expectedTestName)); + + const obsoleteRuns = await Promise.all( + obsoleteTestNames.map(async (testName) => { + const baselineJSON = await results.api.getBaseline(testName); + const baseline = new BettererResultΩ(JSON.parse(baselineJSON), baselineJSON); + return new BettererRunObsoleteΩ(reporter, testName, baseline, update); + }) + ); + + return new BettererSuiteΩ(filePaths, [...obsoleteRuns, ...runsΩ]); } - public async run(isRunOnce = false): Promise { - // Attach lifecycle promises for Reporters: - const runLifecycles = this.runs.map((run) => { - const lifecycle = defer(); - (run as BettererReporterRun).lifecycle = lifecycle.promise; - return lifecycle; + public async run(): Promise { + const hasOnly = !!this.runs.find((run) => { + const runΩ = run as BettererRunΩ; + return runΩ.isOnly; }); - const runsLifecycle = defer(); - // Don't await here! A custom reporter could be awaiting - // the lifecycle promise which is unresolved right now! - const reportSuiteStart = this._reporter.suiteStart(this, runsLifecycle.promise); - try { - const runSummaries = await this._runTests(runLifecycles); - const changed = this._resultsFile.getChanged(runSummaries); - const suiteSummaryΩ = new BettererSuiteSummaryΩ(this.filePaths, this.runs, runSummaries, changed); - runsLifecycle.resolve(suiteSummaryΩ); - await reportSuiteStart; - await this._reporter.suiteEnd(suiteSummaryΩ); - - if (!isRunOnce && suiteSummaryΩ && !this._config.ci) { - await this._resultsFile.writeNew(suiteSummaryΩ); - } - - return suiteSummaryΩ; - } catch (error) { - runsLifecycle.reject(error as BettererError); - await reportSuiteStart; - await this._reporter.suiteError(this, error as BettererError); - throw error; - } - } + const { reporter } = getGlobals(); + const reporterΩ = reporter as BettererReporterΩ; - private async _runTests(runLifecycles: Array>): Promise { - const runsΩ = this.runs as BettererRunsΩ; + // Call the `runStart` reporter hook sequentially for all the tests: + const reportRunStarts = this.runs.map(async (run) => { + const runΩ = run as BettererRunΩ; + const reportRunStart = reporterΩ.runStart(runΩ, runΩ.lifecycle.promise); + // Don't await here! A custom reporter could be awaiting the lifecycle promise which is unresolved right now! + // eslint-disable-next-line @typescript-eslint/return-await -- see above + return reportRunStart; + }); + + const runSummaries = await Promise.all( + this.runs.map(async (run) => { + const { config, fs } = getGlobals(); - const hasOnly = !!runsΩ.find((run) => run.testMeta.isOnly); - const { filters } = this._config; + if (run.isObsolete) { + const runObsoleteΩ = run as BettererRunObsoleteΩ; - return await Promise.all( - runsΩ.map(async (runΩ, index) => { - const lifecycle = runLifecycles[index]; + const runSummary = await runObsoleteΩ.run(); + + if (runObsoleteΩ.isRemoved && config.cache) { + await fs.api.clearCache(runObsoleteΩ.name); + } + + return runSummary; + } + + const { filters } = config; // This is all a bit backwards because "filters" is named badly. const hasFilters = !!filters.length; + const runΩ = run as BettererRunΩ; + // And this is some madness which applies filters and negative filters in // the order they are read: // @@ -92,44 +103,67 @@ export class BettererSuiteΩ implements BettererSuite { const isNegated = filter.source.startsWith(NEGATIVE_FILTER_TOKEN); if (selected) { if (isNegated) { - const negativeFilter = new RegExp(filter.source.substr(1), filter.flags); + const negativeFilter = new RegExp(filter.source.substring(1), filter.flags); return !negativeFilter.test(runΩ.name); } return selected; } else { if (isNegated) { - const negativeFilter = new RegExp(filter.source.substr(1), filter.flags); + const negativeFilter = new RegExp(filter.source.substring(1), filter.flags); return !negativeFilter.test(runΩ.name); } return filter.test(runΩ.name); } }, false); - const isOtherTestOnly = hasOnly && !runΩ.testMeta.isOnly; - const isSkipped = (hasFilters && !isSelected) || isOtherTestOnly || runΩ.testMeta.isSkipped; + const isOtherTestOnly = hasOnly && !runΩ.isOnly; + const isFiltered = (hasFilters && !isSelected) || isOtherTestOnly; - // Don't await here! A custom reporter could be awaiting - // the lifecycle promise which is unresolved right now! - const reportRunStart = this._reporter.runStart(runΩ, lifecycle.promise); - const runSummary = await runΩ.run(isSkipped); + const runSummary = await runΩ.run(isFiltered); + + if (config.cache && runΩ.runMeta.isCacheable) { + const { isBetter, isComplete, isNew, isSame, isUpdated } = runSummary; + // The cache should update on `isSame` because the files still might have changed: + if (isBetter || isComplete || isNew || isUpdated || isSame) { + invariantΔ(runSummary.filePaths, `if a run is cacheable, then the summary will always have file paths!`); + await fs.api.updateCache(runΩ.testMeta, runSummary.filePaths); + } + } // `filePaths` will be updated in the worker if the test filters the files // so it needs to be updated runΩ.filePaths = runSummary.filePaths; - if (runSummary.isFailed) { - const { error } = runSummary; - assert(error); - lifecycle.reject(error); + return runSummary; + }) + ); + + // Call the `runEnd` and `runError` reporter hooks in the same order that they ran: + await Promise.all( + runSummaries.map(async (runSummary, index) => { + const run = this.runs[index]; + const reportRunStart = reportRunStarts[index]; + + const runΩ = run as BettererRunΩ; + if (runSummary.error) { + const error = runSummary.error; + runΩ.lifecycle.reject(error); + + // Lifecycle promise is resolved, so it's safe to await + // the result of `reporter.runStart`: await reportRunStart; - await this._reporter.runError(runΩ, error as BettererError); + await reporterΩ.runError(runSummary, error as BettererError); } else { - lifecycle.resolve(runSummary); + runΩ.lifecycle.resolve(runSummary); + + // Lifecycle promise is resolved, so it's safe to await + // the result of `reporter.runStart`: await reportRunStart; - await this._reporter.runEnd(runSummary); + await reporterΩ.runEnd(runSummary); } - return runSummary; }) ); + + return new BettererSuiteSummaryΩ(this.filePaths, this.runs, runSummaries); } } diff --git a/packages/betterer/src/suite/types.ts b/packages/betterer/src/suite/types.ts index 29d2a203c..f196e7246 100644 --- a/packages/betterer/src/suite/types.ts +++ b/packages/betterer/src/suite/types.ts @@ -28,8 +28,8 @@ import type { BettererTestNames } from '../test/index.js'; */ export interface BettererSuite { /** - * An array of file paths that will be tested. The file paths can be specified by the global {@link @betterer/betterer#BettererConfig.includes | `includes` } - * and {@link @betterer/betterer#BettererConfig.excludes | `excludes`} properties. Also used by + * An array of file paths that will be tested. The file paths can be specified by the global {@link @betterer/betterer#BettererConfigContext.includes | `includes` } + * and {@link @betterer/betterer#BettererConfigContext.excludes | `excludes`} properties. Also used by * watch mode to target individual files. */ readonly filePaths: BettererFilePaths; @@ -40,6 +40,8 @@ export interface BettererSuite { readonly runs: BettererRuns; } +export type BettererSuites = Array; + /** * @public The summary of a {@link @betterer/betterer#BettererSuite | `BettererSuite`} suite. Includes * everything from {@link @betterer/betterer#BettererSuite | `BettererSuite`}. @@ -83,7 +85,6 @@ export interface BettererSuiteSummary extends BettererSuite { * stayed the same but still changed in some way. */ readonly changed: BettererTestNames; - /** * An array containing a {@link @betterer/betterer#BettererRunSummary | `BettererRunSummary`} * for each test that got better. @@ -94,6 +95,15 @@ export interface BettererSuiteSummary extends BettererSuite { * for each test that met its goal. */ readonly completed: BettererRunSummaries; + /** + * The `error` that caused the suite to fail. Will be present in the following situations: + * + * * A test run has failed. + * * A test run has got worse. + * * `strictDeadlines` is enabled and a test has expired. + * * `ci` mode is enabled and a test has changed (in any way!). + */ + readonly error: Error | null; /** * An array containing a {@link @betterer/betterer#BettererRunSummary | `BettererRunSummary`} * for each test that has expired. @@ -109,11 +119,21 @@ export interface BettererSuiteSummary extends BettererSuite { * for each test that was run for the first time. */ readonly new: BettererRunSummaries; + /** + * An array containing a {@link @betterer/betterer#BettererRunSummary | `BettererRunSummary`} + * for each test that has a previous saved result but is no longer defined. + */ + readonly obsolete: BettererRunSummaries; /** * An array containing a {@link @betterer/betterer#BettererRunSummary | `BettererRunSummary`} * for each test that didn't fail and wasn't skipped. */ readonly ran: BettererRunSummaries; + /** + * An array containing a {@link @betterer/betterer#BettererRunSummary | `BettererRunSummary`} + * for each test that is obsolete, but the `--update` option was enabled. + */ + readonly removed: BettererRunSummaries; /** * An array containing a {@link @betterer/betterer#BettererRunSummary | `BettererRunSummary`} * for each test that stayed the same. diff --git a/packages/betterer/src/test/config.ts b/packages/betterer/src/test/config.ts index 0099e28ec..64a2a5cf4 100644 --- a/packages/betterer/src/test/config.ts +++ b/packages/betterer/src/test/config.ts @@ -1,57 +1,91 @@ -import type { BettererLogs } from '@betterer/logger'; - import type { + BettererDiff, + BettererDiffer, + BettererPrinter, + BettererProgress, + BettererSerialiser, BettererTestConfig, - BettererTestOptions, - BettererTestOptionsComplex, + BettererTestConstraint, + BettererTestFunction, BettererTestGoal, - BettererDiff + BettererTestOptions } from './types.js'; import { BettererError } from '@betterer/errors'; -import { diff__ } from '@betterer/logger'; -import prettier from 'prettier'; +import { format } from 'prettier'; import { isFunction } from '../utils.js'; -export function createTestConfig( - options: BettererTestOptions -): BettererTestConfig | BettererTestConfig { - if (options.constraint == null) { - throw new BettererError('for a test to work, it must have a `constraint` function. ❌'); +export class BettererTestConfigΩ + implements BettererTestConfig +{ + public constraint: BettererTestConstraint; + public goal: BettererTestGoal; + public deadline: number; + + constructor(private _options: BettererTestOptions) { + // The `createTestConfig` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `Partial>`, + // but that would imply that it was optional, but it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (this._options.constraint == null) { + throw new BettererError('for a test to work, it must have a `constraint` function. ❌'); + } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (this._options.test == null) { + throw new BettererError('for a test to work, it must have a `test` function. ❌'); + } + + this.constraint = this._options.constraint; + this.deadline = createDeadline(this._options); + this.goal = createGoal(this._options); } - if (options.test == null) { - throw new BettererError('for a test to work, it must have a `test` function. ❌'); + public get differ(): BettererDiffer { + return this._options.differ ?? (this._defaultDiffer as BettererDiffer); } - const deadline = createDeadline(options); - const goal = createGoal(options); + public get printer(): BettererPrinter { + return this._options.printer ?? this._defaultPrinter; + } - if (isComplex(options)) { - return { - configPath: '', - printer: defaultPrinter, - progress: defaultProgress, - ...options, - goal, - deadline - } as BettererTestConfig; + public get progress(): BettererProgress { + return this._options.progress ?? this._defaultProgress; + } + + public get serialiser(): BettererSerialiser { + const defaultSerialiser = { + deserialise: this._defaultDeserialiser, + serialise: this._defaultSerialiser + } as BettererSerialiser; + return this._options.serialiser ?? defaultSerialiser; + } + + public get test(): BettererTestFunction { + return this._options.test; } - return { - ...options, - configPath: '', - differ: defaultDiffer, - printer: defaultPrinter, - progress: defaultProgress, - serialiser: { - deserialise: defaultDeserialiser, - serialise: defaultSerialiser - }, - goal, - deadline - } as BettererTestConfig; + private _defaultDiffer = (): BettererDiff => { + return { + diff: null + } as BettererDiff; + }; + + private _defaultPrinter = async (serialised: unknown): Promise => { + return await format(JSON.stringify(serialised), { parser: 'json' }); + }; + + private _defaultProgress = (): null => { + return null; + }; + + private _defaultDeserialiser = (serialised: unknown): unknown => { + return serialised; + }; + + private _defaultSerialiser = (deserialised: unknown): unknown => { + return deserialised; + }; } export function createDeadline( @@ -61,8 +95,11 @@ export function createDeadline( if (deadline == null) { return Infinity; } - const maybeDate = new Date(deadline).getTime(); - return !isNaN(maybeDate) ? maybeDate : Infinity; + const parsed = new Date(deadline).getTime(); + if (isNaN(parsed)) { + throw new BettererError(`invalid deadline: ${String(deadline)}`); + } + return parsed; } export function createGoal( @@ -72,40 +109,8 @@ export function createGoal( if (goal == null) { return () => false; } - if (isFunction>(goal)) { - return goal; + if (isFunction(goal)) { + return goal as BettererTestGoal; } return (value: DeserialisedType): boolean => value === goal; } - -function isComplex( - options: BettererTestOptions -): options is BettererTestOptionsComplex { - const maybeComplex = options as BettererTestOptionsComplex; - return !!maybeComplex.differ && !!maybeComplex.serialiser; -} - -export function defaultDiffer(expected: unknown, result: unknown): BettererDiff { - const diff = diff__(expected, result, { aAnnotation: 'Expected', bAnnotation: 'Result' }); - const logs: BettererLogs = diff ? [{ error: diff }] : []; - return { - diff: null, - logs - }; -} - -function defaultPrinter(serialised: unknown): string { - return prettier.format(JSON.stringify(serialised), { parser: 'json' }); -} - -function defaultProgress(): null { - return null; -} - -function defaultDeserialiser(serialised: unknown): unknown { - return serialised; -} - -function defaultSerialiser(deserialised: unknown): unknown { - return deserialised; -} diff --git a/packages/betterer/src/test/file-test/constraint.ts b/packages/betterer/src/test/file-test/constraint.ts index 7ae826355..546c051e6 100644 --- a/packages/betterer/src/test/file-test/constraint.ts +++ b/packages/betterer/src/test/file-test/constraint.ts @@ -1,25 +1,30 @@ +import type { BettererRun } from '../../run/index.js'; import type { BettererFileTestResult } from './types.js'; import { BettererConstraintResult } from '@betterer/constraints'; -import { differ } from './differ.js'; +import { diff } from './differ.js'; -export function constraint(result: BettererFileTestResult, expected: BettererFileTestResult): BettererConstraintResult { - const { diff } = differ(expected, result); +export function constraint( + this: BettererRun, + result: BettererFileTestResult, + expected: BettererFileTestResult +): BettererConstraintResult { + const fileDiff = diff.call(this, expected, result); - const filePaths = Object.keys(diff); + const filePaths = Object.entries(fileDiff.diff); if (filePaths.length === 0) { return BettererConstraintResult.same; } - const hasNew = filePaths.filter((filePath) => !!diff[filePath].new?.length); + const hasNew = filePaths.filter(([, fileDiff]) => !!fileDiff.new?.length); if (hasNew.length) { return BettererConstraintResult.worse; } - const hasFixed = filePaths.filter((filePath) => !!diff[filePath].fixed?.length); + const hasFixed = filePaths.filter(([, fileDiff]) => !!fileDiff.fixed?.length); if (hasFixed.length) { return BettererConstraintResult.better; diff --git a/packages/betterer/src/test/file-test/differ.ts b/packages/betterer/src/test/file-test/differ.ts index fbfc695fe..702cffffd 100644 --- a/packages/betterer/src/test/file-test/differ.ts +++ b/packages/betterer/src/test/file-test/differ.ts @@ -1,21 +1,26 @@ -import type { BettererLogs } from '@betterer/logger'; +import type { BettererLogger } from '@betterer/logger'; -import type { BettererFileΩ } from './file.js'; +import type { BettererRun } from '../../run/index.js'; import type { BettererFileTestResultΩ } from './file-test-result.js'; +import type { BettererFileΩ } from './file.js'; import type { - BettererFileTestDiff, + BettererFileBase, BettererFileIssue, BettererFileIssueSerialised, BettererFilesDiff, - BettererFileTestResult, - BettererFileBase + BettererFileTestDiff, + BettererFileTestResult } from './types.js'; -import assert from 'node:assert'; +import { invariantΔ } from '@betterer/errors'; const FORMATTER = Intl.NumberFormat(); -export function differ(expected: BettererFileTestResult, result: BettererFileTestResult): BettererFileTestDiff { +export async function differ(this: BettererRun, expected: BettererFileTestResult, result: BettererFileTestResult) { + return await differLog.call(this, expected, result); +} + +export function diff(expected: BettererFileTestResult, result: BettererFileTestResult): BettererFileTestDiff { const diff: BettererFilesDiff = {}; const expectedΩ = expected as BettererFileTestResultΩ; const resultΩ = result as BettererFileTestResultΩ; @@ -45,6 +50,7 @@ export function differ(expected: BettererFileTestResult, result: BettererFileTes // Multiple possibilities means that the same content has been moved into multiple new files. // So just count the first one as a move, the rest will be new files: const [moved] = possibilities; + invariantΔ(moved, `\`possibilities.length\` should be at least \`1\`!`, possibilities.length); movedFiles.set(moved, fixedOrMovedFile); // Remove the moved file from the fixedOrMovedFiles array: @@ -71,7 +77,7 @@ export function differ(expected: BettererFileTestResult, result: BettererFileTes const existingFiles = [...unchangedResultFiles, ...changedResultFiles, ...Array.from(movedFiles.keys())]; existingFiles.forEach((resultFile) => { - const expectedFile = movedFiles.get(resultFile) || expectedΩ.getFile(resultFile.absolutePath); + const expectedFile = movedFiles.get(resultFile) ?? expectedΩ.getFile(resultFile.absolutePath); // Convert all issues to their deserialised form for easier diffing: const resultIssues = [...resultFile.issues]; @@ -108,10 +114,11 @@ export function differ(expected: BettererFileTestResult, result: BettererFileTes } // Start by marking the first possibility as best: let best = possibilities.shift(); + invariantΔ(best, `\`best\` should be set!`, best); // And then search through all the possibilities to find the closest issue: possibilities.forEach((possibility) => { - assert(best); + invariantΔ(best, `\`possibilities.length\` should be at least \`1\`!`, possibilities.length); if (Math.abs(line - possibility.line) >= Math.abs(line - best.line)) { return; } @@ -126,8 +133,6 @@ export function differ(expected: BettererFileTestResult, result: BettererFileTes } }); - assert(best); - // Remove the moved issue from the newOrMovedIssues array: newOrMovedIssues.splice(newOrMovedIssues.indexOf(best), 1); @@ -135,7 +140,13 @@ export function differ(expected: BettererFileTestResult, result: BettererFileTes }); // Find the raw issue data so that diffs can be logged: - const newIssues = newOrMovedIssues.map((newIssue) => resultFile.issues[resultIssues.indexOf(newIssue)]); + const newIssues = newOrMovedIssues.map((newIssue) => { + const issue = resultFile.issues[resultIssues.indexOf(newIssue)]; + // `newOrMovedIssues` comes from a filter on `resultIssues`, + // which comes from `[...resultFile.issues]`, so this should always be valid. + invariantΔ(issue, `\`issue\` should definitely exist within \`resultFile.issues\`!`, issue, resultFile.issues); + return issue; + }); // If there's no change, move on: if (!newIssues.length && !fixedIssues.length) { @@ -150,38 +161,58 @@ export function differ(expected: BettererFileTestResult, result: BettererFileTes }; }); - const filePaths = Object.keys(diff); + return { + diff + }; +} - const logs: BettererLogs = []; - filePaths.forEach((filePath) => { - const existing = diff[filePath].existing || []; - const fixed = diff[filePath].fixed || []; - if (fixed?.length) { - logs.push({ success: `${fixed.length} fixed ${getIssues(fixed.length)} in "${filePath}".` }); - } - if (existing?.length) { - logs.push({ warn: `${existing.length} existing ${getIssues(existing.length)} in "${filePath}".` }); - } - const newIssues = diff[filePath].new || []; - const nIssues = newIssues.length; - if (nIssues) { - logs.push({ error: `New ${getIssues(nIssues)} in "${filePath}"!` }); - if (nIssues > 1) { - logs.push({ error: `Showing first of ${FORMATTER.format(nIssues)} new issues:` }); +async function differLog(this: BettererRun, expected: BettererFileTestResult, result: BettererFileTestResult) { + const fileDiff = diff(expected, result); + const resultΩ = result as BettererFileTestResultΩ; + + // Sort by file path: + const diffEntries = Object.entries(fileDiff.diff).sort(([aPath], [bPath]) => (aPath < bPath ? -1 : 1)); + + await Promise.all( + diffEntries.map(async ([filePath, diff]) => { + const existing = diff.existing ?? []; + const fixed = diff.fixed ?? []; + const newIssues = diff.new ?? []; + const nExisting = existing.length; + const nFixed = fixed.length; + const nIssues = newIssues.length; + + let type: keyof BettererLogger = 'success'; + const messages: Array = []; + if (nFixed > 0) { + messages.push(`${FORMATTER.format(nFixed)} fixed`); + } + if (nExisting > 0) { + type = 'warn'; + messages.push(`${FORMATTER.format(nExisting)} existing`); } + if (nIssues > 0) { + type = 'error'; + messages.push(`${FORMATTER.format(nIssues)} new`); + } + await this.logger[type](`${messages.join(', ')} ${getIssues(nFixed + nExisting + nIssues)} in "${filePath}".`); - const [firstIssue] = newIssues; - const fileΩ = resultΩ.getFile(filePath) as BettererFileΩ; - const { fileText } = fileΩ; - const [line, column, length, message] = firstIssue; - logs.push({ code: { message, filePath, fileText, line, column, length } }); - } - }); + if (nIssues) { + if (nIssues > 1) { + await this.logger.error(`Showing first of ${FORMATTER.format(nIssues)} new issues:`); + } - return { - diff, - logs - }; + const [firstIssue] = newIssues; + invariantΔ(firstIssue, `\`nIssues\` should be at least \`1\`!`, nIssues); + const fileΩ = resultΩ.getFile(filePath) as BettererFileΩ; + const { fileText } = fileΩ; + const [line, column, length, message] = firstIssue; + await this.logger.code({ message, filePath, fileText, line, column, length }); + } + }) + ); + + return fileDiff; } function getIssues(count: number): string { diff --git a/packages/betterer/src/test/file-test/file-test-result.ts b/packages/betterer/src/test/file-test/file-test-result.ts index a6fc124bb..19a679793 100644 --- a/packages/betterer/src/test/file-test/file-test-result.ts +++ b/packages/betterer/src/test/file-test/file-test-result.ts @@ -7,11 +7,16 @@ import path from 'node:path'; import { BettererFileΩ } from './file.js'; export class BettererFileTestResultΩ implements BettererFileTestResult { + public isBettererFileTestResult = true; + private _fileMap: Record = {}; private _files: Array = []; private _filePaths: Array = []; - constructor(private _resolver: BettererFileResolver, private _resultsPath: string) {} + constructor( + private _resolver: BettererFileResolver, + private _resultsPath: string + ) {} // Previously the `files` getter was just doing `Object.values(this._fileMap)`, // but that's pretty slow and this gets hit a lot, so instead the `this._files` diff --git a/packages/betterer/src/test/file-test/file-test.ts b/packages/betterer/src/test/file-test/file-test.ts index 5cbae1c43..13381813a 100644 --- a/packages/betterer/src/test/file-test/file-test.ts +++ b/packages/betterer/src/test/file-test/file-test.ts @@ -1,23 +1,14 @@ +import type { BettererRun } from '../../run/index.js'; import type { - BettererFileGlobs, - BettererFilePatterns, - BettererFilePaths, - BettererFileResolver -} from '../../fs/index.js'; -import type { BettererRun, BettererWorkerRunΩ } from '../../run/index.js'; -import type { BettererTestConstraint, BettererTestDeadline, BettererTestFunction, BettererTestGoal } from '../types.js'; -import type { - BettererFileTestBase, - BettererFileTestConfig, BettererFileTestFunction, - BettererFileTestResult + BettererFileTestResult, + BettererFileTestResultSerialised, + BettererFilesDiff } from './types.js'; -import assert from 'node:assert'; -import path from 'node:path'; +import { invariantΔ } from '@betterer/errors'; -import { BettererFileResolverΩ } from '../../fs/index.js'; -import { createDeadline, createGoal, createTestConfig } from '../config.js'; +import { BettererResolverTest } from '../resolver-test/index.js'; import { constraint } from './constraint.js'; import { differ } from './differ.js'; import { BettererFileTestResultΩ } from './file-test-result.js'; @@ -25,10 +16,12 @@ import { goal } from './goal.js'; import { printer } from './printer.js'; import { progress } from './progress.js'; import { deserialise, serialise } from './serialiser.js'; +import { getGlobals } from '../../globals.js'; +import { checkBaseName } from '../utils.js'; /** * @public A very common usecase for **Betterer** is to track issues across all the files in a - * project. `BettererFileTest` provides a wrapper around {@link @betterer/betterer#BettererTest | `BettererTest` } + * project. `BettererFileTest` provides a wrapper around {@link @betterer/betterer#BettererResolverTest | `BettererResolverTest` } * that makes it easier to implement such a test. * * @remarks `BettererFileTest` provides a useful example for the more complex possibilities of the {@link @betterer/betterer#BettererTestOptions | `BettererTestOptions` } @@ -49,187 +42,32 @@ import { deserialise, serialise } from './serialiser.js'; * * @param fileTest - The test function that will detect issues in specific files. */ -export class BettererFileTest implements BettererFileTestBase { - /** - * The complete configuration for the test. - */ - public readonly config: BettererFileTestConfig; - - private _isOnly = false; - private _isSkipped = false; - private _resolver: BettererFileResolver; - +export class BettererFileTest extends BettererResolverTest< + BettererFileTestResult, + BettererFileTestResultSerialised, + BettererFilesDiff +> { constructor(fileTest: BettererFileTestFunction) { - this._resolver = new BettererFileResolverΩ(); - this.config = createTestConfig({ - test: createTest(this._resolver, fileTest), + super({ + test: async (run: BettererRun): Promise => { + const { filePaths } = run; + invariantΔ(filePaths, `\`filePaths\` should always exist for a \`BettererFileTest\` run!`); + + const { config } = getGlobals(); + const result = new BettererFileTestResultΩ(this.resolver, config.resultsPath); + await fileTest(filePaths, result, this.resolver); + return result; + }, constraint, goal, serialiser: { deserialise, serialise }, differ, printer, progress - }) as BettererFileTestConfig; - } - - /** - * When `true`, all other tests will be skipped. Calling `only()` will set this to `true`. - */ - public get isOnly(): boolean { - return this._isOnly; - } - - /** - * When `true`, this test will be skipped. Calling `skip()` will set this to `true`. - */ - public get isSkipped(): boolean { - return this._isSkipped; - } - - /** - * Override the constraint in the test configuration. - * - * @param constraintOverride - The new constraint for the test. - * @returns This {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, so it is chainable. - */ - public constraint(constraintOverride: BettererTestConstraint): this { - this.config.constraint = constraintOverride; - return this; - } - - /** - * Override the deadline in the test configuration. - * - * @param deadlineOverride - The new deadline for the test. - * @returns This {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, so it is chainable. - */ - public deadline(deadlineOverride: BettererTestDeadline): this { - this.config.deadline = createDeadline({ ...this.config, deadline: deadlineOverride }); - return this; - } - - /** - * Add a list of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } filters for files to exclude when running the test. - * - * @param excludePatterns - RegExp filters to match file paths that should be excluded. - * @returns This {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, so it is chainable. - */ - public exclude(...excludePatterns: BettererFilePatterns): this { - const resolverΩ = this._resolver as BettererFileResolverΩ; - resolverΩ.exclude(...excludePatterns); - return this; - } - - /** - * Override the goal in the test configuration. - * - * @param goalOverride - The new goal for the test. - * @returns This {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, so it is chainable. - */ - public goal(goalOverride: BettererTestGoal): this { - this.config.goal = createGoal({ ...this.config, goal: goalOverride }); - return this; - } - - /** - * Add a list of {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } - * patterns for files to include when running the test. - * - * @param includePatterns - Glob patterns to match file paths that should be included. All - * `includes` should be relative to the {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file}. - * @returns This {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, so it is chainable. - */ - public include(...includePatterns: BettererFileGlobs): this { - const resolverΩ = this._resolver as BettererFileResolverΩ; - resolverΩ.include(...includePatterns); - return this; - } - - /** - * Run only this test. All other tests will be marked as skipped. - * - * @returns This {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, so it is chainable. - */ - public only(): this { - this._isOnly = true; - return this; + }); } - - /** - * Skip this test. - * - * @returns This {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, so it is chainable. - */ - public skip(): this { - this._isSkipped = true; - return this; - } -} - -function createTest( - resolver: BettererFileResolver, - fileTest: BettererFileTestFunction -): BettererTestFunction { - return async (run: BettererRun): Promise => { - const resolverΩ = resolver as BettererFileResolverΩ; - const runΩ = run as BettererWorkerRunΩ; - assert(runΩ.filePaths); - - const baseDirectory = path.dirname(runΩ.test.configPath); - - const { config, versionControl } = runΩ.globals; - resolverΩ.init(baseDirectory, versionControl); - - const hasSpecifiedFiles = runΩ.filePaths.length > 0; - - // Get the maximal set of files that the test could run on: - const testFiles = await resolverΩ.files(); - - // Get the set of files that the test will run on: - let runFiles: BettererFilePaths; - - // Specified files will include files from a global `includes`. - if (hasSpecifiedFiles) { - // Validate that they are relevant for this file test: - runFiles = await resolverΩ.validate(runΩ.filePaths); - } else { - runFiles = testFiles; - } - - let isFullRun = runFiles === testFiles; - - if (!run.isNew) { - const cacheMisses = await versionControl.api.filterCached(run.name, runFiles); - isFullRun = isFullRun && cacheMisses.length === runFiles.length; - runFiles = cacheMisses; - } - - // Set the final files back on the `BettererRun`: - runΩ.filePaths = runFiles; - - const result = new BettererFileTestResultΩ(resolver, config.resultsPath); - await fileTest(runFiles, result, resolver); - - if (isFullRun) { - return result; - } - - // Get any filePaths that have expected issues but weren't included in this run: - const expectedΩ = runΩ.expected.value as BettererFileTestResultΩ; - const excludedFilesWithIssues = expectedΩ.files - .map((file) => file.absolutePath) - .filter((filePath) => !runFiles.includes(filePath)); - - // Filter them based on the resolver: - const relevantExcludedFilePaths = await resolver.validate(excludedFilesWithIssues); - - // Add the existing issues to the new result: - relevantExcludedFilePaths.forEach((filePath) => result.addExpected(expectedΩ.getFile(filePath))); - - return result; - }; } -export function isBettererFileTest(test: unknown): test is BettererFileTest { - return !!test && (test as BettererFileTest).constructor.name === BettererFileTest.name; +export function isBettererFileTest(test: unknown): test is BettererResolverTest { + return !!test && checkBaseName(test.constructor, BettererFileTest.name); } diff --git a/packages/betterer/src/test/file-test/file.ts b/packages/betterer/src/test/file-test/file.ts index 9866c8d50..e8e250507 100644 --- a/packages/betterer/src/test/file-test/file.ts +++ b/packages/betterer/src/test/file-test/file.ts @@ -1,10 +1,17 @@ -import type { BettererFileIssue, BettererFileIssues, BettererFile } from './types.js'; +import type { BettererFile, BettererFileIssue, BettererFileIssues, BettererFileTestResultKey } from './types.js'; -import assert from 'node:assert'; +import { invariantΔ } from '@betterer/errors'; import { LinesAndColumns } from 'lines-and-columns'; +import path from 'node:path'; import { createHash } from '../../hasher.js'; -import { isString, normalisedPath, normaliseNewlines } from '../../utils.js'; +import { + isString, + normalisedPath, + normaliseNewlines, + replaceAbsolutePaths, + replaceRelativePaths +} from '../../utils.js'; const UNKNOWN_LOCATION = { line: 0, @@ -18,11 +25,15 @@ type BettererIssueOverride = BettererIssueStartEnd | BettererIssueLineColLength export class BettererFileΩ implements BettererFile { public readonly hash: string; - public readonly key: string; + public readonly key: BettererFileTestResultKey; private _issues: BettererFileIssues = []; - constructor(public readonly absolutePath: string, private _relativePath: string, public readonly fileText: string) { + constructor( + public readonly absolutePath: string, + private _relativePath: string, + public readonly fileText: string + ) { this.absolutePath = normalisedPath(absolutePath); this.hash = createHash(this.fileText); this.key = `${normalisedPath(this._relativePath)}:${this.hash}`; @@ -43,25 +54,38 @@ export class BettererFileΩ implements BettererFile { private _handleIssue(issueOverride: BettererIssueOverride, fileText: string): BettererFileIssue { const lc = new LinesAndColumns(fileText); - const issue = - getIssueFromStartEnd(lc, issueOverride) || - getIssueFromLineColLength(issueOverride) || - getIssueFromPositions(lc, issueOverride); - assert(issue); + let issue: BettererIssueLineColLength | null = null; + if (isStartEnd(issueOverride)) { + issue = getIssueFromStartEnd(lc, issueOverride); + } else if (isLineColLength(issueOverride)) { + issue = getIssueFromLineColLength(issueOverride); + } else if (isPositions(issueOverride)) { + issue = getIssueFromPositions(lc, issueOverride); + } - const [line, column, length, message, overrideHash] = issue; - const start = lc.indexForLocation({ line, column }) || 0; + invariantΔ(issue, '`issue` must start with 2, 3, or 4 numbers designating the start and end position in a file!'); + + const [line, column, length, rawMessage, overrideHash] = issue; + + let message = rawMessage; + const dirname = path.dirname(this.absolutePath); + message = replaceRelativePaths(message, dirname, path.posix); + message = replaceRelativePaths(message, dirname, path.win32); + message = replaceAbsolutePaths(message, dirname, path.posix); + message = replaceAbsolutePaths(message, dirname, path.win32); + + const start = lc.indexForLocation({ line, column }) ?? 0; const issueText = fileText.substring(start, start + length); const normalisedText = normaliseNewlines(issueText); - const hash = overrideHash || createHash(normalisedText); + let hash = overrideHash; + if (!hash) { + hash = normalisedText ? createHash(normalisedText) : createHash(message); + } return { line, column, length: normalisedText.length, message, hash }; } } -function getIssueFromLineColLength(issueOverride: BettererIssueOverride): BettererIssueLineColLength | null { - if (!isLineColLength(issueOverride)) { - return null; - } +function getIssueFromLineColLength(issueOverride: BettererIssueLineColLength): BettererIssueLineColLength { return issueOverride; } @@ -70,15 +94,9 @@ function isLineColLength(issueOverride: BettererIssueOverride): issueOverride is return isString(message); } -function getIssueFromStartEnd( - lc: LinesAndColumns, - issueOverride: BettererIssueOverride -): BettererIssueLineColLength | null { - if (!isStartEnd(issueOverride)) { - return null; - } +function getIssueFromStartEnd(lc: LinesAndColumns, issueOverride: BettererIssueStartEnd): BettererIssueLineColLength { const [start, end, message, overrideHash] = issueOverride; - const { line, column } = lc.locationForIndex(start) || UNKNOWN_LOCATION; + const { line, column } = lc.locationForIndex(start) ?? UNKNOWN_LOCATION; const length = end - start; return [line, column, length, message, overrideHash]; } @@ -88,18 +106,14 @@ function isStartEnd(issueOverride: BettererIssueOverride): issueOverride is Bett return isString(message); } -function getIssueFromPositions( - lc: LinesAndColumns, - issueOverride: BettererIssueOverride -): BettererIssueLineColLength | null { - if (!isPositions(issueOverride)) { - return null; - } +function getIssueFromPositions(lc: LinesAndColumns, issueOverride: BettererIssuePositions): BettererIssueLineColLength { const [line, column, endLine, endColumn, message, overrideHash] = issueOverride; - const start = lc.indexForLocation({ line, column }) || 0; - const end = lc.indexForLocation({ line: endLine, column: endColumn }) || 0; + const absStartColumn = Math.max(0, column); + const absEndColumn = Math.max(0, endColumn); + const start = lc.indexForLocation({ line, column: absStartColumn }) ?? 0; + const end = lc.indexForLocation({ line: endLine, column: absEndColumn }) ?? 0; const length = end - start; - return [line, column, length, message, overrideHash]; + return [line, absStartColumn, length, message, overrideHash]; } function isPositions(issueOverride: BettererIssueOverride): issueOverride is BettererIssuePositions { diff --git a/packages/betterer/src/test/file-test/index.ts b/packages/betterer/src/test/file-test/index.ts index ac7e27692..d3f2cd3b8 100644 --- a/packages/betterer/src/test/file-test/index.ts +++ b/packages/betterer/src/test/file-test/index.ts @@ -1,16 +1,18 @@ -export { BettererFileTest, isBettererFileTest } from './file-test.js'; -export type { BettererFileTestResultΩ } from './file-test-result.js'; -export { - BettererFileTestResult, - BettererFileTestResultSerialised, - BettererFileTestFunction, - BettererFileBase, +export type { BettererFile, + BettererFileBase, BettererFileDiff, - BettererFilesDiff, - BettererFileTestDiff, BettererFileIssue, BettererFileIssueSerialised, BettererFileIssues, - BettererFileIssuesSerialised + BettererFileIssuesSerialised, + BettererFileTestDiff, + BettererFileTestFunction, + BettererFileTestResult, + BettererFileTestResultKey, + BettererFileTestResultSerialised, + BettererFilesDiff } from './types.js'; + +export { BettererFileTestResultΩ } from './file-test-result.js'; +export { BettererFileTest, isBettererFileTest } from './file-test.js'; diff --git a/packages/betterer/src/test/file-test/printer.ts b/packages/betterer/src/test/file-test/printer.ts index bad4f44c4..6c3983c10 100644 --- a/packages/betterer/src/test/file-test/printer.ts +++ b/packages/betterer/src/test/file-test/printer.ts @@ -1,15 +1,22 @@ import type { BettererFileTestResultSerialised } from './types.js'; +import { isKey } from './serialiser.js'; + export function printer(serialised: BettererFileTestResultSerialised): string { + const keys = Object.keys(serialised); + if (keys.length === 0) { + return '{}'; + } let printed = '{\n'; - Object.keys(serialised) + keys .sort() + .filter(isKey) .forEach((filePath, index) => { const file = ` "${filePath}": [\n`; printed += prependNewline(index, file); - serialised[filePath].forEach((issue, index) => { + serialised[filePath]?.forEach((issue, index) => { const [line, column, length, message, hash] = issue; - const printedIssue = ` [${line}, ${column}, ${length}, ${JSON.stringify(message)}, ${JSON.stringify( + const printedIssue = ` [${String(line)}, ${String(column)}, ${String(length)}, ${JSON.stringify(message)}, ${JSON.stringify( hash )}]`; printed += prependNewline(index, printedIssue); diff --git a/packages/betterer/src/test/file-test/public.ts b/packages/betterer/src/test/file-test/public.ts deleted file mode 100644 index 057c1e784..000000000 --- a/packages/betterer/src/test/file-test/public.ts +++ /dev/null @@ -1,15 +0,0 @@ -export { BettererFileTest } from './file-test.js'; -export { - BettererFileBase, - BettererFile, - BettererFileTestResult, - BettererFileTestResultSerialised, - BettererFileDiff, - BettererFilesDiff, - BettererFileTestDiff, - BettererFileTestFunction, - BettererFileIssue, - BettererFileIssueSerialised, - BettererFileIssues, - BettererFileIssuesSerialised -} from './types.js'; diff --git a/packages/betterer/src/test/file-test/serialiser.ts b/packages/betterer/src/test/file-test/serialiser.ts index 2b77797b7..0bee232b3 100644 --- a/packages/betterer/src/test/file-test/serialiser.ts +++ b/packages/betterer/src/test/file-test/serialiser.ts @@ -1,10 +1,13 @@ import type { - BettererFileTestResult, + BettererFileBase, BettererFileIssues, - BettererFileTestResultSerialised, - BettererFileBase + BettererFileTestResult, + BettererFileTestResultKey, + BettererFileTestResultKeyParts, + BettererFileTestResultSerialised } from './types.js'; +import { invariantΔ } from '@betterer/errors'; import path from 'node:path'; import { BettererFileResolverΩ } from '../../fs/index.js'; @@ -13,44 +16,59 @@ import { BettererFileTestResultΩ } from './file-test-result.js'; export function deserialise(serialised: BettererFileTestResultSerialised, resultsPath: string): BettererFileTestResult { const resolver = new BettererFileResolverΩ(path.dirname(resultsPath)); const deserialised = new BettererFileTestResultΩ(resolver, resultsPath); - Object.keys(serialised).map((key) => { - const [relativePath, fileHash] = key.split(':'); - const issues = serialised[key].map((issue) => { - const [line, column, length, message, hash] = issue; - return { line, column, length, message, hash }; + Object.entries(serialised) + .filter(([key]) => isKey(key)) + .map(([key, issuesForFile]) => { + const { relativePath, hash } = splitKey(key as BettererFileTestResultKey); + const issues = issuesForFile.map((issue) => { + const [line, column, length, message, hash] = issue; + return { line, column, length, message, hash }; + }); + const absolutePath = resolver.resolve(relativePath); + const relativeKey: BettererFileTestResultKey = `${relativePath}:${hash}`; + deserialised.addExpected({ absolutePath, key: relativeKey, hash, issues }); }); - const absolutePath = resolver.resolve(relativePath); - key = `${relativePath}:${fileHash}`; - deserialised.addExpected({ absolutePath, key, hash: fileHash, issues }); - }); return deserialised as BettererFileTestResult; } export function serialise(result: BettererFileTestResult): BettererFileTestResultSerialised { const resultΩ = result as BettererFileTestResultΩ; - return resultΩ.files - .filter((file) => file.issues.length) - .sort((fileA, fileB) => { - if (fileA.absolutePath < fileB.absolutePath) { - return -1; - } - if (fileA.absolutePath > fileB.absolutePath) { - return 1; - } - return 0; - }) - .reduce((serialised: BettererFileTestResultSerialised, file: BettererFileBase) => { - serialised[file.key] = sortLinesAndColumns(file.issues).map((issue) => [ - issue.line, - issue.column, - issue.length, - issue.message, - issue.hash - ]); - return serialised; - }, {} as BettererFileTestResultSerialised); + return ( + resultΩ.files + .filter((file) => file.issues.length) + // Sort based on absolute file path, assuming that each file `resultΩ.files` has a unique path: + .sort((fileA, fileB) => (fileA.absolutePath < fileB.absolutePath ? -1 : 1)) + .reduce( + (serialised: BettererFileTestResultSerialised, file: BettererFileBase) => { + serialised[file.key] = sortLinesAndColumns(file.issues).map((issue) => [ + issue.line, + issue.column, + issue.length, + issue.message, + issue.hash + ]); + return serialised; + }, + {} + ) + ); } function sortLinesAndColumns(issues: BettererFileIssues): BettererFileIssues { return [...issues].sort((a, b) => (a.line !== b.line ? a.line - b.line : a.column - b.column)); } + +export function isKey(key: string): key is BettererFileTestResultKey { + return /.*:.*/.test(key); +} + +function splitKey(key: BettererFileTestResultKey): BettererFileTestResultKeyParts { + const [relativePath, hash] = key.split(':'); + const parts = { relativePath, hash }; + assertKey(parts); + return parts; +} + +function assertKey(key: Partial): asserts key is BettererFileTestResultKeyParts { + invariantΔ(key.relativePath != null && key.hash != null, 'Invalid serialised key parts, cannot deserialise!'); +} diff --git a/packages/betterer/src/test/file-test/types.ts b/packages/betterer/src/test/file-test/types.ts index 2add5a6dd..7fa96dde8 100644 --- a/packages/betterer/src/test/file-test/types.ts +++ b/packages/betterer/src/test/file-test/types.ts @@ -1,7 +1,6 @@ import type { BettererFilePaths, BettererFileResolver } from '../../fs/index.js'; -import type { BettererDiff } from '../../test/index.js'; import type { MaybeAsync } from '../../types.js'; -import type { BettererTestBase, BettererTestConfig } from '../types.js'; +import type { BettererDiff } from '../types.js'; /** * @public A serialised {@link @betterer/betterer#BettererFileIssue | `BettererFileIssue`}. @@ -13,10 +12,25 @@ export type BettererFileIssueSerialised = [line: number, column: number, length: */ export type BettererFileIssuesSerialised = ReadonlyArray; +/** + * @internal This could change at any point! Please don't use! + * + * The properties that create a key for a specific issue on a serialised BettererFileTestResult + */ +export interface BettererFileTestResultKeyParts { + relativePath: string; + hash: string; +} + +/** + * @public A lookup key for a specific issue on a serialised BettererFileTestResult + */ +export type BettererFileTestResultKey = `${string}:${string}`; + /** * @public A map from file path to {@link @betterer/betterer#BettererFileIssuesSerialised | `BettererFileIssuesSerialised`}. */ -export type BettererFileTestResultSerialised = Record; +export type BettererFileTestResultSerialised = Record; /** * @public A diff object for a single file. @@ -51,8 +65,8 @@ export type BettererFileTestDiff = BettererDiff; * * @param filePaths - The relevant file paths for this test run. Determined by taking the input file * paths (defined by Watch mode or the {@link @betterer/betterer#BettererConfig | global `includes`/`excludes` config}) - * and then validating them with the test {@link @betterer/betterer#BettererFileTest.include | `BettererFileTest.include()` } - * and {@link @betterer/betterer#BettererFileTest.exclude | `BettererFileTest.exclude()` }. + * and then validating them with the test {@link @betterer/betterer#BettererResolverTest.include | `BettererResolverTest.include()` } + * and {@link @betterer/betterer#BettererResolverTest.exclude | `BettererResolverTest.exclude()` }. * @param fileTestResult - The {@link @betterer/betterer#BettererFileTestResult | `result`} for this test. * @param resolver - The {@link @betterer/betterer#BettererFileResolver | `resolver`} for this test. */ @@ -114,7 +128,7 @@ export interface BettererFileBase { /** * The key used for identifying the file in the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. */ - readonly key: string; + readonly key: BettererFileTestResultKey; } /** @@ -176,25 +190,3 @@ export interface BettererFileTestResult { */ getIssues(absolutePath?: string): BettererFileIssues; } - -/** - * @internal This could change at any point! Please don't use! - * - * Utility type to improve readability - */ -export type BettererFileTestBase = BettererTestBase< - BettererFileTestResult, - BettererFileTestResultSerialised, - BettererFilesDiff ->; - -/** - * @internal This could change at any point! Please don't use! - * - * Utility type to improve readability - */ -export type BettererFileTestConfig = BettererTestConfig< - BettererFileTestResult, - BettererFileTestResultSerialised, - BettererFilesDiff ->; diff --git a/packages/betterer/src/test/index.ts b/packages/betterer/src/test/index.ts index e4b1440ff..0039f5c65 100644 --- a/packages/betterer/src/test/index.ts +++ b/packages/betterer/src/test/index.ts @@ -1,20 +1,28 @@ -export { - BettererFileTest, - BettererFileTestResult, - BettererFileTestFunction, - BettererFileBase, +export type { BettererFile, - BettererFilesDiff, - BettererFileTestDiff, + BettererFileBase, BettererFileDiff, BettererFileIssue, + BettererFileIssueSerialised, BettererFileIssues, - isBettererFileTest + BettererFileIssuesSerialised, + BettererFileTestDiff, + BettererFileTestFunction, + BettererFileTestResult, + BettererFileTestResultKey, + BettererFileTestResultSerialised, + BettererFileTestResultΩ, + BettererFilesDiff } from './file-test/index.js'; -export type { BettererFileTestResultΩ } from './file-test/index.js'; -export { loadTestMeta } from './loader.js'; -export { BettererTest, isBettererTest } from './test.js'; -export { +export type { + BettererTestFactory, + BettererTestMetaLoaderWorker, + BettererTestMap, + BettererTestNames, + BettererTestMeta, + BettererTestsMeta +} from './test-meta/index.ts'; +export type { BettererDeserialise, BettererDiff, BettererDiffer, @@ -22,20 +30,14 @@ export { BettererProgress, BettererSerialise, BettererSerialiser, - BettererTestFactory, - BettererTestFactoryMeta, - BettererTestFactoryMetaMap, - BettererTestMap, - BettererTestBase, + BettererTestConfig, BettererTestConstraint, BettererTestDeadline, BettererTestFunction, BettererTestGoal, - BettererTestOptions, - BettererTestOptionsBasic, - BettererTestOptionsComplex, - BettererTestConfig, - BettererTestMeta, - BettererTestNames, - BettererTestLoaderWorker + BettererTestOptions } from './types.js'; + +export { BettererFileTest, isBettererFileTest } from './file-test/index.js'; +export { BettererResolverTest, isBettererResolverTest } from './resolver-test/index.js'; +export { BettererTest, isBettererTest } from './test.js'; diff --git a/packages/betterer/src/test/loader.ts b/packages/betterer/src/test/loader.ts deleted file mode 100644 index 29f294841..000000000 --- a/packages/betterer/src/test/loader.ts +++ /dev/null @@ -1,33 +0,0 @@ -import type { BettererConfigPaths } from '../config/index.js'; -import type { BettererTestMap, BettererTestFactoryMetaMap } from './types.js'; - -import { BettererError } from '@betterer/errors'; - -import { isFunction } from '../utils.js'; -import { importDefault } from '../import.js'; - -export function loadTestMeta(configPaths: BettererConfigPaths): BettererTestFactoryMetaMap { - let testMetaMap: BettererTestFactoryMetaMap = {}; - configPaths.map((configPath) => { - const testMeta = loadTestMetaFromConfig(configPath); - testMetaMap = { ...testMetaMap, ...testMeta }; - }); - return testMetaMap; -} - -function loadTestMetaFromConfig(configPath: string): BettererTestFactoryMetaMap { - try { - const testMeta: BettererTestFactoryMetaMap = {}; - const exports = importDefault(configPath); - Object.keys(exports).forEach((name) => { - const factory = exports[name]; - if (!isFunction(factory)) { - throw new BettererError(`"${name}" must be a function.`); - } - testMeta[name] = { name, configPath, factory }; - }); - return testMeta; - } catch (error) { - throw new BettererError(`could not import config from "${configPath}". 😔`, error as BettererError); - } -} diff --git a/packages/betterer/src/test/loader.worker.ts b/packages/betterer/src/test/loader.worker.ts deleted file mode 100644 index 76d714430..000000000 --- a/packages/betterer/src/test/loader.worker.ts +++ /dev/null @@ -1,20 +0,0 @@ -import type { BettererConfigPaths } from '../config/types.js'; -import type { BettererTestNames } from './types.js'; - -import { exposeToMain__ } from '@betterer/worker'; - -import { registerExtensions } from '../config/register.js'; -import { loadTestMeta } from './loader.js'; - -export async function loadTestNames( - tsconfigPath: string | null, - configPaths: BettererConfigPaths -): Promise { - await registerExtensions(tsconfigPath); - const testMeta = loadTestMeta(configPaths); - return Object.keys(testMeta); -} - -exposeToMain__({ - loadTestNames -}); diff --git a/packages/betterer/src/test/public.ts b/packages/betterer/src/test/public.ts deleted file mode 100644 index adf9d9649..000000000 --- a/packages/betterer/src/test/public.ts +++ /dev/null @@ -1,35 +0,0 @@ -export { - BettererFileTest, - BettererFileTestFunction, - BettererFileBase, - BettererFile, - BettererFileTestResult, - BettererFileTestResultSerialised, - BettererFileDiff, - BettererFilesDiff, - BettererFileTestDiff, - BettererFileIssue, - BettererFileIssueSerialised, - BettererFileIssues, - BettererFileIssuesSerialised -} from './file-test/public.js'; -export { BettererTest } from './test.js'; -export { - BettererDeserialise, - BettererDiff, - BettererDiffer, - BettererPrinter, - BettererProgress, - BettererSerialise, - BettererSerialiser, - BettererTestBase, - BettererTestConstraint, - BettererTestDeadline, - BettererTestFunction, - BettererTestGoal, - BettererTestConfig, - BettererTestOptions, - BettererTestOptionsBasic, - BettererTestOptionsComplex, - BettererTestNames -} from './types.js'; diff --git a/packages/betterer/src/test/resolver-test/index.ts b/packages/betterer/src/test/resolver-test/index.ts new file mode 100644 index 000000000..cf95f4f98 --- /dev/null +++ b/packages/betterer/src/test/resolver-test/index.ts @@ -0,0 +1 @@ +export { BettererResolverTest, isBettererResolverTest } from './resolver-test.js'; diff --git a/packages/betterer/src/test/resolver-test/resolver-test.ts b/packages/betterer/src/test/resolver-test/resolver-test.ts new file mode 100644 index 000000000..ec964009c --- /dev/null +++ b/packages/betterer/src/test/resolver-test/resolver-test.ts @@ -0,0 +1,138 @@ +import type { BettererFileGlobs, BettererFilePatterns, BettererFileResolver } from '../../fs/index.js'; +import type { BettererRun, BettererWorkerRunΩ } from '../../run/index.js'; +import type { BettererFileTestResultΩ } from '../file-test/index.js'; +import type { BettererTestOptions } from '../types.js'; + +import { invariantΔ } from '@betterer/errors'; + +import { BettererCacheStrategy, BettererFileResolverΩ } from '../../fs/index.js'; +import { getGlobals } from '../../globals.js'; +import { BettererTest } from '../test.js'; +import { checkBaseName } from '../utils.js'; + +/** + * @public A very common need for a **Betterer** test is to resolve file paths, and include and exclude files + * from being tested. + * + * `BettererResolverTest` provides a wrapper around {@link @betterer/betterer#BettererTest | `BettererTest` } + * that makes it easier to implement such a test. + */ +export class BettererResolverTest< + DeserialisedType = unknown, + SerialisedType = DeserialisedType, + DiffType = null +> extends BettererTest { + /** + * The file resolver relative to this test's config file. + */ + public readonly resolver: BettererFileResolver; + + constructor(options: BettererTestOptions) { + super({ + ...options, + test: async (run: BettererRun): Promise => { + const runΩ = run as BettererWorkerRunΩ; + + const { filePaths } = runΩ; + invariantΔ(filePaths, `\`filePaths\` should always exist for a \`BettererResolverTest\` run!`); + + const resolverΩ = this.resolver as BettererFileResolverΩ; + // Get the maximal set of files `included()` for the test: + const testFilePaths = await resolverΩ.files(); + + // If there are specified file paths, validate them with the resolver, or just use the full set of included files: + let runFilePaths = filePaths.length > 0 ? await resolverΩ.validate(filePaths) : testFilePaths; + + let isFullRun = runFilePaths === testFilePaths; + + let hasCached = false; + if (!run.isNew) { + const { config } = getGlobals(); + const cacheMisses = config.cache ? await resolverΩ.filterCached(runΩ.testMeta, runFilePaths) : runFilePaths; + hasCached = cacheMisses.length !== runFilePaths.length; + isFullRun = isFullRun && !hasCached; + runFilePaths = cacheMisses; + } + + // Set the final files back on the `BettererRun`: + runΩ.setFilePaths(runFilePaths); + + const { config } = getGlobals(); + if (!hasCached && runFilePaths.length === 0 && !config.precommit) { + await run.logger.info( + 'No relevant files found. Are the `include()`/`exclude()` options for this test correct?' + ); + } + + const result = (await options.test.call(run, run)) as DeserialisedType; + if (isFullRun) { + return result; + } + + // Get any filePaths that have expected issues but weren't included in this run: + const expectedΩ = runΩ.expected.value as BettererFileTestResultΩ; + const excludedFilesWithIssues = expectedΩ.files + .map((file) => file.absolutePath) + .filter((filePath) => !filePaths.includes(filePath)); + + // Filter them based on the resolver: + const relevantExcludedFilePaths = await resolverΩ.validate(excludedFilesWithIssues); + + // Add the existing issues to the new result: + relevantExcludedFilePaths.forEach((filePath) => { + const resultΩ = result as BettererFileTestResultΩ; + resultΩ.addExpected(expectedΩ.getFile(filePath)); + }); + + return result; + } + }); + const { config } = getGlobals(); + this.resolver = new BettererFileResolverΩ(config.basePath); + } + + /** + * Add a list of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } filters for files to exclude when running the test. + * + * @param excludePatterns - RegExp filters to match file paths that should be excluded. + * @returns This {@link @betterer/betterer#BettererResolverTest | `BettererResolverTest`}, so it is chainable. + */ + public exclude(...excludePatterns: BettererFilePatterns): this { + const resolverΩ = this.resolver as BettererFileResolverΩ; + resolverΩ.exclude(...excludePatterns); + return this; + } + + /** + * Add a list of {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } + * patterns for files to include when running the test. + * + * @param includePatterns - Glob patterns to match file paths that should be included. All + * `includes` should be relative to the {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file}. + * @returns This {@link @betterer/betterer#BettererResolverTest | `BettererResolverTest`}, so it is chainable. + */ + public include(...includePatterns: BettererFileGlobs): this { + const resolverΩ = this.resolver as BettererFileResolverΩ; + resolverΩ.include(...includePatterns); + return this; + } + + /** + * Tell **Betterer** how this test should be cached. Currently this handles two different scenarios: + * + * * `FilePath` - for when each individual file is independent from all others, e.g. linters + * * `FilePaths` - for when a group of files must be treated as one unit, e.g. compilers + * + * @param strategy - The {@link @betterer/betterer#BettererCacheStrategy} to use. + * @returns This {@link @betterer/betterer#BettererResolverTest | `BettererResolverTest`}, so it is chainable. + */ + public cache(strategy: BettererCacheStrategy = BettererCacheStrategy.FilePath): this { + const resolverΩ = this.resolver as BettererFileResolverΩ; + resolverΩ.cache(strategy); + return this; + } +} + +export function isBettererResolverTest(test: unknown): test is BettererResolverTest { + return !!test && checkBaseName(test.constructor, BettererResolverTest.name); +} diff --git a/packages/betterer/src/test/test-meta/index.ts b/packages/betterer/src/test/test-meta/index.ts new file mode 100644 index 000000000..88eb2047e --- /dev/null +++ b/packages/betterer/src/test/test-meta/index.ts @@ -0,0 +1,8 @@ +export type { + BettererTestFactory, + BettererTestMetaLoaderWorker, + BettererTestMap, + BettererTestMeta, + BettererTestsMeta, + BettererTestNames +} from './types.js'; diff --git a/packages/betterer/src/test/test-meta/loader.worker.ts b/packages/betterer/src/test/test-meta/loader.worker.ts new file mode 100644 index 000000000..d50ae08cc --- /dev/null +++ b/packages/betterer/src/test/test-meta/loader.worker.ts @@ -0,0 +1,37 @@ +import type { BettererFilePath, BettererFilePaths } from '../../fs/types.js'; +import type { BettererTestMap, BettererTestsMeta } from './types.js'; + +import { BettererError } from '@betterer/errors'; +import { exposeToMainΔ } from '@betterer/worker'; + +import { importTranspiledHashed } from '../../fs/index.js'; + +/** @knipignore part of worker API */ +export async function loadTestsMeta(configPaths: BettererFilePaths): Promise { + const testsMetaForConfigs = await Promise.all(configPaths.map(async (configPath) => await loadTestMeta(configPath))); + const testsMeta = testsMetaForConfigs.flat(); + + const allTests: Record = {}; + testsMeta.forEach((testMeta) => { + const { name, configPath } = testMeta; + const existingConfigPath = allTests[name]; + if (existingConfigPath) { + throw new BettererError(`Duplicate test name found in "${existingConfigPath}" and "${configPath}": "${name}"`); + } + allTests[name] = configPath; + }); + return testsMeta; +} + +async function loadTestMeta(configPath: BettererFilePath): Promise { + try { + const [exports, configHash] = (await importTranspiledHashed(configPath)) as [BettererTestMap, string]; + return Object.keys(exports).map((name) => ({ configPath, configHash, name })); + } catch (error) { + throw new BettererError(`could not import config from "${configPath}". 😔`, error as BettererError); + } +} + +exposeToMainΔ({ + loadTestsMeta +}); diff --git a/packages/betterer/src/test/test-meta/types.ts b/packages/betterer/src/test/test-meta/types.ts new file mode 100644 index 000000000..511615daa --- /dev/null +++ b/packages/betterer/src/test/test-meta/types.ts @@ -0,0 +1,22 @@ +import type { BettererWorkerAPI } from '@betterer/worker'; +import type { MaybeAsync } from '../../types.js'; +import type { BettererTest } from '../test.js'; + +export type BettererTestFactory = () => MaybeAsync; + +export type BettererTestMap = Record; + +export interface BettererTestMeta { + readonly configPath: string; + readonly configHash: string; + readonly name: string; +} + +export type BettererTestsMeta = Array; + +/** + * @public An array of test names. + */ +export type BettererTestNames = ReadonlyArray; + +export type BettererTestMetaLoaderWorker = BettererWorkerAPI; diff --git a/packages/betterer/src/test/test.ts b/packages/betterer/src/test/test.ts index ae5b41604..706567120 100644 --- a/packages/betterer/src/test/test.ts +++ b/packages/betterer/src/test/test.ts @@ -1,5 +1,4 @@ import type { - BettererTestBase, BettererTestConfig, BettererTestConstraint, BettererTestDeadline, @@ -7,7 +6,8 @@ import type { BettererTestOptions } from './types.js'; -import { createDeadline, createGoal, createTestConfig } from './config.js'; +import { BettererTestConfigΩ, createDeadline, createGoal } from './config.js'; +import { checkBaseName } from './utils.js'; /** * @public The main interface to the **Betterer** {@link https://phenomnomnominal.github.io/betterer/docs/tests | test system}. @@ -26,19 +26,20 @@ import { createDeadline, createGoal, createTestConfig } from './config.js'; * * @param options - The options that define the test. */ -export class BettererTest - implements BettererTestBase -{ - /** - * The complete configuration for the test. - */ - public readonly config: BettererTestConfig; - +export class BettererTest { + private _config: BettererTestConfigΩ; private _isOnly = false; private _isSkipped = false; constructor(options: BettererTestOptions) { - this.config = createTestConfig(options) as BettererTestConfig; + this._config = new BettererTestConfigΩ(options); + } + + /** + * The complete configuration for the test. + */ + public get config(): BettererTestConfig { + return this._config; } /** @@ -62,7 +63,7 @@ export class BettererTest): this { - this.config.constraint = constraintOverride; + this._config.constraint = constraintOverride; return this; } @@ -73,7 +74,7 @@ export class BettererTest): this { - this.config.goal = createGoal({ ...this.config, goal: goalOverride }); + this._config.goal = createGoal({ ...this.config, goal: goalOverride }); return this; } @@ -109,17 +110,6 @@ export class BettererTest = ( + this: BettererRun, result: DeserialisedType, expected: DeserialisedType ) => MaybeAsync; @@ -53,7 +52,10 @@ export type BettererTestDeadline = Date | string; * * @param run - The current run. */ -export type BettererTestFunction = (run: BettererRun) => MaybeAsync; +export type BettererTestFunction = ( + this: BettererRun, + run: BettererRun +) => MaybeAsync; /** * @public A function that returns whether the test has met its goal. @@ -67,7 +69,7 @@ export type BettererTestFunction = (run: BettererRun) => Maybe * * @param result - Result from the current test run. */ -export type BettererTestGoal = (result: DeserialisedType) => MaybeAsync; +export type BettererTestGoal = (this: BettererRun, result: DeserialisedType) => MaybeAsync; /** * @public The result of computing the difference between two results. @@ -77,11 +79,6 @@ export interface BettererDiff { * The difference between `expected` and `result`. */ diff: DiffType; - /** - * A set of logging instructions that provide insight about the diff. The default reporter will - * show these to the user once the test is complete. - */ - logs: BettererLogs; } /** @@ -91,9 +88,10 @@ export interface BettererDiff { * @param result - Result from the current test run. */ export type BettererDiffer = ( + this: BettererRun, expected: DeserialisedType, result: DeserialisedType -) => BettererDiff; +) => MaybeAsync>; /** * @public A function that converts a serialised test result into the string that will be saved in @@ -111,6 +109,7 @@ export type BettererPrinter = (serialised: SerialisedType) => Ma * @param result - The result from the current test run. */ export type BettererProgress = ( + this: BettererRun, baseline: DeserialisedType | null, result: DeserialisedType | null ) => MaybeAsync; @@ -122,6 +121,7 @@ export type BettererProgress = ( * @param resultsPath - The path to the {@link https://phenomnomnominal.github.io/betterer/docs/results-file | results file}. */ export type BettererSerialise = ( + this: BettererRun, result: DeserialisedType, resultsPath: string ) => SerialisedType; @@ -141,50 +141,45 @@ export type BettererDeserialise = ( * @public The functions that convert between `SerialisedType` and `DeserialisedType`. */ export interface BettererSerialiser { - serialise: BettererSerialise; - deserialise: BettererDeserialise; -} - -/** - * @public The least complex version of a {@link @betterer/betterer#BettererTest | `BettererTest` } - * operates on simple numbers and can be defined with just a few properties. - */ -export interface BettererTestOptionsBasic { - /** - * The constraint function for the test. - */ - constraint: BettererTestConstraint; - /** - * The function that runs the actual test. - */ - test: BettererTestFunction; /** - * The goal function or goal value for the test. + * The function that converts from a `DeserialisedType` to a `SerialisedType`. */ - goal?: number | BettererTestGoal; + serialise: BettererSerialise; /** - * The deadline for the test. + * The function that converts from a `SerialisedType` to a `DeserialisedType`. */ - deadline?: BettererTestDeadline; + deserialise: BettererDeserialise; } /** - * @public For a more complex version of a {@link @betterer/betterer#BettererTest | `BettererTest`} that + * @public Options for creating a {@link @betterer/betterer#BettererTest | `BettererTest`}. + * + * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererTestConfig | `BettererTestConfig`}. + * There is a lot of power (and therefore complexity) in this options object. + * + * The default version of a {@link @betterer/betterer#BettererTest | `BettererTest` } + * operates on simple numbers and can be defined with just a few properties. + * + * For a more complex version of a {@link @betterer/betterer#BettererTest | `BettererTest`} that * operates on more complex objects, you need to define more complex behaviour. + * + * @typeParam DeserialisedType - The deserialised result type of a test. + * @typeParam SerialisedType - The serialised type of a test result. + * @typeParam DiffType - The diff between two results. */ -export interface BettererTestOptionsComplex { +export interface BettererTestOptions { /** * The constraint function for the test. */ constraint: BettererTestConstraint; /** - * The function that runs the actual test. + * A hook to perform any configuration before running the test. */ test: BettererTestFunction; /** * The function that compares two test results. */ - differ: BettererDiffer; + differ?: BettererDiffer; /** * The function that converts a serialised test result to the string that will be saved in the [test results file](./results-file) */ @@ -196,92 +191,53 @@ export interface BettererTestOptionsComplex; + serialiser?: BettererSerialiser; /** * The goal function or goal value for the test. */ goal: DeserialisedType | BettererTestGoal; /** * The deadline for the test. + * + * @remarks Will be transformed into a UNIX timestamp. */ deadline?: BettererTestDeadline; } -/** - * @public Options for creating a {@link @betterer/betterer#BettererTest | `BettererTest`}. - * - * @remarks The options object will be validated by **Betterer** and turned into a {@link @betterer/betterer#BettererTestConfig | `BettererTestConfig`}. - * There is a lot of power (and therefore complexity) in this options object. - * - * @typeParam DeserialisedType - The deserialised result type of a test. - * @typeParam SerialisedType - The serialised type of a test result. - * @typeParam DiffType - The diff between two results. - */ -export type BettererTestOptions = - | BettererTestOptionsBasic - | BettererTestOptionsComplex; - /** * @public The validated configuration for a {@link @betterer/betterer#BettererTest | `BettererTest`}. */ export interface BettererTestConfig { - configPath: string; - constraint: BettererTestConstraint; - deadline: number; - goal: BettererTestGoal; - test: BettererTestFunction; - differ: BettererDiffer; - printer: BettererPrinter; - progress: BettererProgress; - serialiser: BettererSerialiser; -} - -/** - * @internal This could change at any point! Please don't use! - * - * The base interface for a {@link @betterer/betterer#BettererTest | `BettererTest`}. - */ -export interface BettererTestBase { - config: BettererTestConfig; - isOnly: boolean; - isSkipped: boolean; - constraint(constraintOverride: BettererTestConstraint): this; - goal(goalOverride: BettererTestGoal): this; - only(): this; - skip(): this; -} - -export type BettererTestFactory = () => MaybeAsync; -export interface BettererTestFactoryMeta { - readonly configPath: string; - readonly factory: BettererTestFactory; - readonly name: string; + /** + * The constraint function for the test. + */ + readonly constraint: BettererTestConstraint; + /** + * The deadline for the test, as a UNIX timestamp. + */ + readonly deadline: number; + /** + * The goal function for the test. + */ + readonly goal: BettererTestGoal; + /** + * The function that runs the actual test. + */ + readonly test: BettererTestFunction; + /** + * The function that compares two test results. + */ + readonly differ: BettererDiffer; + /** + * The function that converts a serialised test result to the string that will be saved in the [test results file](./results-file) + */ + readonly printer: BettererPrinter; + /** + * The function that converts a test result to a numeric value that represents the progress towards the goal. + */ + readonly progress: BettererProgress; + /** + * The functions that serialises and deserialises a test result between the [`DeserialisedType`](#deserialisedtype-default-unknown) and [`SerialisedType`](#serialisedtype-default-deserialisedtype). + */ + readonly serialiser: BettererSerialiser; } -export type BettererTestFactoryMetaMap = Record; -export type BettererTestMap = Record; - -export type BettererTestMeta = { - readonly configPath: string; - readonly name: string; - readonly isFileTest: boolean; - readonly isOnly: boolean; - readonly isSkipped: boolean; -} & ( - | { - readonly isNew: true; - readonly baselineJSON: null; - readonly expectedJSON: null; - } - | { - readonly isNew: false; - readonly baselineJSON: string; - readonly expectedJSON: string; - } -); - -/** - * @public An array of test names. - */ -export type BettererTestNames = ReadonlyArray; - -export type BettererTestLoaderWorker = BettererWorkerAPI; diff --git a/packages/betterer/src/test/utils.ts b/packages/betterer/src/test/utils.ts new file mode 100644 index 000000000..e7e2087d9 --- /dev/null +++ b/packages/betterer/src/test/utils.ts @@ -0,0 +1,10 @@ +export function checkBaseName(input: unknown, name: string): boolean { + if (input && (input as FunctionConstructor).name === name) { + return true; + } + const proto: unknown = Object.getPrototypeOf(input); + if (proto == null) { + return false; + } + return checkBaseName(proto, name); +} diff --git a/packages/betterer/src/types.ts b/packages/betterer/src/types.ts index c1bb6bc2b..79da709d9 100644 --- a/packages/betterer/src/types.ts +++ b/packages/betterer/src/types.ts @@ -1,11 +1,10 @@ -import type { BettererConfig } from './config/index.js'; -import type { BettererVersionControlWorker } from './fs/index.js'; -import type { BettererResultsFileΩ } from './results/index.js'; - +/** + * @public Utility type to allow results that are async or sync. + */ export type MaybeAsync = T | Promise; -export interface BettererGlobals { - config: BettererConfig; - resultsFile: BettererResultsFileΩ; - versionControl: BettererVersionControlWorker; -} +/** + * @public Utility type for Function-like things: + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any -- it izz what it izz +export type Func = (...args: Array) => any; diff --git a/packages/betterer/src/utils.ts b/packages/betterer/src/utils.ts index 4a5a79647..230723c87 100644 --- a/packages/betterer/src/utils.ts +++ b/packages/betterer/src/utils.ts @@ -1,11 +1,13 @@ -import assert from 'node:assert'; +import type { PlatformPath } from 'node:path'; + +import { invariantΔ } from '@betterer/errors'; import path from 'node:path'; export function isBoolean(value: unknown): value is boolean { return typeof value === 'boolean'; } -export function isFunction(value: unknown): value is T { +export function isFunction(value: unknown): value is (...args: Array) => unknown { return typeof value === 'function'; } @@ -26,29 +28,11 @@ export function isUndefined(value: unknown): value is undefined { } export function normalisedPath(filePath: string): string { - return path.sep === path.posix.sep ? filePath : filePath.split(path.sep).join(path.posix.sep); -} - -type Resolve = (value: T) => void; -type Reject = (error: Error) => void; -export interface Defer { - promise: Promise; - resolve: Resolve; - reject: Reject; + return filePath.split(path.win32.sep).join(path.posix.sep); } -export function defer(): Defer { - let resolve: Resolve | null = null; - let reject: Reject | null = null; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - // Catch here to avoid global unhandledRejection: - promise.catch(() => void 0); - assert(resolve); - assert(reject); - return { promise, resolve, reject }; +export function sortEntriesKeys([keyA]: [string, unknown], [keyB]: [string, unknown]): 0 | -1 | 1 { + return keyA === keyB ? 0 : keyA < keyB ? -1 : 1; } const NEW_LINE = '\n'; @@ -61,15 +45,79 @@ export function normaliseNewlines(str: string): string { export function flatten(toFlatten: ReadonlyArray>): Array { const flattened: Array = []; toFlatten.forEach((t) => { - if (isItem(t)) { - flattened.push(t); - } else { + if (Array.isArray(t)) { flattened.push(...t); + } else { + flattened.push(t as T); } }); return flattened; } -function isItem(pattern: unknown): pattern is T { - return !Array.isArray(pattern); +const WRAPPERS: Array<[string, string]> = [ + [' ', ' '], + ["'", "'"], + ['"', '"'], + ['`', '`'], + ['(', ')'], + ['[', ']'], + ['{', '}'], + ['<', '>'] +]; +const WIN32_ROOT_REGEXP = /([A-Za-z]:(?:\\.*?)+)/; +const WIN32_RELATIVE_REGEXP = /(.{0,2}(?:\\.*?)+)/; +const POSIX_ROOT_REGEXP = /((?:\/.*?)+)/; +const POSIX_RELATIVE_REGEXP = /(.{1,2}(?:\/.*?)+)/; +const REGEXP_REGEXP = /\/(.*)\//; + +const WIN32_ROOT_REGEXP_WRAPPED = WRAPPERS.map((wrapper) => wrapRegExp(WIN32_ROOT_REGEXP, wrapper)); +const WIN32_RELATIVE_REGEXP_WRAPPED = WRAPPERS.map((wrapper) => wrapRegExp(WIN32_RELATIVE_REGEXP, wrapper)); +const POSIX_ROOT_REGEXP_WRAPPED = WRAPPERS.map((wrapper) => wrapRegExp(POSIX_ROOT_REGEXP, wrapper)); +const POSIX_RELATIVE_REGEXP_WRAPPED = WRAPPERS.map((wrapper) => wrapRegExp(POSIX_RELATIVE_REGEXP, wrapper)); + +function wrapRegExp(regexp: RegExp, [l, r]: [string, string]): RegExp { + return new RegExp(`\\${l}${regexp.source}\\${r}`, 'g'); +} + +export function replaceAbsolutePaths(input: string, fromPath: string, path: PlatformPath): string { + const regexps = path === path.posix ? POSIX_ROOT_REGEXP_WRAPPED : WIN32_ROOT_REGEXP_WRAPPED; + return replaceWrappedPaths(input, fromPath, regexps); +} + +export function replaceRelativePaths(input: string, fromPath: string, path: PlatformPath): string { + const regexps = path === path.posix ? POSIX_RELATIVE_REGEXP_WRAPPED : WIN32_RELATIVE_REGEXP_WRAPPED; + return replaceWrappedPaths(input, fromPath, regexps); +} + +function replaceWrappedPaths(input: string, fromPath: string, regexps: Array): string { + let message = input; + const foundWrappers = regexps.filter((regexp) => input.match(regexp)); + if (foundWrappers.length) { + foundWrappers.forEach((regexp) => { + const matches = [...message.matchAll(regexp)]; + matches.forEach((match) => { + const [, maybePath] = match; + invariantΔ(maybePath, 'All wrapper RegExps results must contain a group!'); + // A RegExp might look like a Posix file path: + const regexMatch = REGEXP_REGEXP.exec(maybePath); + if (regexMatch) { + const [, maybeRegexp] = regexMatch; + invariantΔ(maybeRegexp, 'The RegExp matching RegExp must contain a group!'); + // new RegExp(...) on something file path-esque e.g. /foo/bar/baz/ will transform to /foo\/bar\/baz/ + // I guess there is a false negative here for a root directory e.g. /foo/, but that would be pretty weird to + // in an error message? + if (new RegExp(maybeRegexp).source === maybeRegexp) { + return; + } + } + const resolved = normalisedPath(path.resolve(fromPath, maybePath)); + let relative = normalisedPath(path.relative(fromPath, resolved)); + if (path.dirname(resolved) === fromPath) { + relative = `./${relative}`; + } + message = message.replace(maybePath, relative); + }); + }); + } + return message; } diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 00e1a1c32..8b4fe684d 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -3,6 +3,38 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/cli + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) + + +* feat(betterer ✨)!: allow cache in CI mode (#1218) ([8cf8207](https://github.com/phenomnomnominal/betterer/commit/8cf8207ff3e23c7fd439b067e2c2981c0e4fae44)), closes [#1218](https://github.com/phenomnomnominal/betterer/issues/1218) [#1164](https://github.com/phenomnomnominal/betterer/issues/1164) + + +### Features + +* **beterer ✨:** make logo optional ([#1137](https://github.com/phenomnomnominal/betterer/issues/1137)) ([b3d9cac](https://github.com/phenomnomnominal/betterer/commit/b3d9cac3633aa2e6365f196d06e4acd5937d4dbe)) + + +### BREAKING CHANGES + +* ci: true no longer disables the cache + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) **Note:** Version bump only for package @betterer/cli diff --git a/packages/cli/LICENSE.md b/packages/cli/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/cli/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/cli/api-extractor.json b/packages/cli/api-extractor.json index dae7b1544..6923858f4 100644 --- a/packages/cli/api-extractor.json +++ b/packages/cli/api-extractor.json @@ -4,7 +4,7 @@ "messages": { "extractorMessageReporting": { - // We add a suffix __ instead + // We add a suffix Δ instead "ae-internal-missing-underscore": { "logLevel": "none", "addToApiReportFile": false diff --git a/packages/cli/bin/betterer b/packages/cli/bin/betterer deleted file mode 100755 index 467f88bf3..000000000 --- a/packages/cli/bin/betterer +++ /dev/null @@ -1,2 +0,0 @@ -#!/usr/bin/env node -require('../dist/cli').cli__(process.cwd(), process.argv); diff --git a/packages/cli/bin/betterer.js b/packages/cli/bin/betterer.js new file mode 100755 index 000000000..5c63b6cd5 --- /dev/null +++ b/packages/cli/bin/betterer.js @@ -0,0 +1,3 @@ +#!/usr/bin/env node +import { cliΔ } from '../dist/cli.js'; +void cliΔ(globalThis.process.cwd(), globalThis.process.argv); diff --git a/packages/cli/package.json b/packages/cli/package.json index bf40cd3bd..41ac0f80c 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,19 +1,20 @@ { "name": "@betterer/cli", "description": "betterer CLI", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "bin", "dist" ], "bin": { - "betterer": "./bin/betterer" + "betterer": "./bin/betterer.js" }, "author": "Craig Spence ", "homepage": "https://phenomnomnominal.github.io/betterer", @@ -29,24 +30,21 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "@betterer/render": "^5.3.4", - "@betterer/tasks": "^5.3.6", - "@betterer/worker": "^5.3.4", - "@phenomnomnominal/tsquery": "^4.1.1", + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/tasks": "^6.0.0-alpha.1", + "@betterer/worker": "^6.0.0-alpha.1", + "@phenomnomnominal/tsquery": "^6.1.3", "@phenomnomnominal/tstemplate": "^0.1.0", - "chalk": "^4.1.2", + "chalk": "^5.3.0", "commander": "^8.3.0", - "find-up": "^5.0.0", - "jest-diff": "^27.1.0", - "prettier": "^2.3.2", - "tslib": "^2.3.1" + "find-up": "^7.0.0", + "prettier": "^3.2.5" }, - "devDependencies": { - "@types/prettier": "^2.3.2" - } + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/cli/src/ci.ts b/packages/cli/src/ci.ts index 3c2676617..f4326aa2f 100644 --- a/packages/cli/src/ci.ts +++ b/packages/cli/src/ci.ts @@ -1,24 +1,23 @@ -import type { BettererOptionsStart } from '@betterer/betterer'; +import type { BettererOptions } from '@betterer/betterer'; import type { Command } from 'commander'; import type { BettererCLIConfig } from './types.js'; import { betterer } from '@betterer/betterer'; -import { cliCommand, setEnv } from './options.js'; -import { BettererCommand } from './types.js'; +import { ciCommand } from './options.js'; /** * Run **Betterer** in `ci` mode. */ export function ci(cwd: string): Command { - const command = cliCommand(BettererCommand.ci); + const command = ciCommand(); command.description('run Betterer in CI mode'); command.action(async (config: BettererCLIConfig, command: Command): Promise => { - setEnv(config); - - // Mark options as unknown... - const options: unknown = { + // Cast the options to BettererOptions. This is possibly invalid, + // but it's nicer to do the validation in @betterer/betterer + const { error } = await betterer({ + basePath: config.basePath, cache: config.cache, cachePath: config.cachePath, ci: true, @@ -27,22 +26,17 @@ export function ci(cwd: string): Command { excludes: config.exclude, filters: config.filter, includes: command.args, + logo: config.logo, reporters: config.reporter, + repoPath: config.repoPath, resultsPath: config.results, silent: config.silent, - tsconfigPath: config.tsconfig, + strictDeadlines: config.strictDeadlines, workers: config.workers - }; + } as BettererOptions); - try { - // And then cast to BettererOptionsStart. This is possibly invalid, - // but it's nicer to do the options validation in @betterer/betterer - const suiteSummary = await betterer(options as BettererOptionsStart); - if (suiteSummary.changed.length > 0 || suiteSummary.failed.length > 0) { - process.exitCode = 1; - } - } catch { - process.exitCode = 1; + if (error) { + throw error; } }); diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts index 84ec97879..451681379 100644 --- a/packages/cli/src/cli.ts +++ b/packages/cli/src/cli.ts @@ -1,5 +1,7 @@ +import type { BettererErrorDetails } from '@betterer/errors'; import type { BettererCLIArguments, BettererCommandName } from './types.js'; +import { isBettererErrorΔ } from '@betterer/errors'; import { Command } from 'commander'; import { ci } from './ci.js'; @@ -18,7 +20,12 @@ import { getVersion } from './version.js'; * * Run the **Betterer** command-line interface. */ -export async function cli__(cwd: string, argv: BettererCLIArguments, isCI = process.env.CI === 'true'): Promise { +export async function cliΔ( + cwd: string, + argv: BettererCLIArguments, + isCI = process.env.CI === 'true', + isTest = process.env.TEST === 'true' +): Promise { const program = new Command('Betterer'); const version = await getVersion(); program.version(version); @@ -49,9 +56,50 @@ export async function cli__(cwd: string, argv: BettererCLIArguments, isCI = proc const args = argv.slice(0); const [, , command] = args; + // `BettererCommand` is an enum, so this conditional *is* necessary! + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! if (!BettererCommand[command as BettererCommandName]) { args.splice(2, 0, BettererCommand.start); } - await program.parseAsync(args); + try { + await program.parseAsync(args); + } catch (error) { + if (isBettererErrorΔ(error)) { + error.details = flattenErrors(error.details); + } + if (!isTest) { + /* v8 ignore next */ + process.exitCode = 1; + } + throw error; + } +} + +function flattenErrors(details: BettererErrorDetails): BettererErrorDetails { + return details + .flatMap((detail) => { + if (isBettererErrorΔ(detail)) { + const flattened = [detail, ...flattenErrors(detail.details)]; + detail.details = []; + return flattened; + } + return detail; + }) + .map((detail) => { + const error = new Error(); + if (isError(detail)) { + error.message = detail.message; + error.name = detail.name; + error.stack = detail.stack; + } else { + error.message = detail; + } + return error; + }); +} + +function isError(value: unknown): value is Error { + const { message, stack } = value as Partial; + return message != null && stack != null; } diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index 9711c2530..b945edf18 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -8,5 +8,6 @@ * @packageDocumentation */ -export { cli__ } from './cli.js'; -export { BettererCLIArguments, BettererPackageJSON } from './types.js'; +export type { BettererCLIArguments, BettererPackageJSON } from './types.js'; + +export { cliΔ } from './cli.js'; diff --git a/packages/cli/src/init.tsx b/packages/cli/src/init.tsx index fa381ef9e..788270676 100644 --- a/packages/cli/src/init.tsx +++ b/packages/cli/src/init.tsx @@ -2,15 +2,14 @@ import type { Command } from 'commander'; import type { BettererCLIInitConfig } from './types.js'; -import { React, getRenderOptions, render } from '@betterer/render'; +import { React, getRenderOptionsΔ, render } from '@betterer/render'; import path from 'node:path'; import { Init } from './init/init.js'; -import { initCommand, setEnv } from './options.js'; +import { initCommand } from './options.js'; const BETTERER_TS = './.betterer.ts'; const BETTERER_RESULTS = './.betterer.results'; -const TS_EXTENSION = '.ts'; /** * Run the **Betterer** `init` command to initialise **Betterer** in a new project. @@ -19,12 +18,12 @@ export function init(cwd: string): Command { const command = initCommand(); command.description('init Betterer in a project'); command.action(async (config: BettererCLIInitConfig): Promise => { - setEnv(config); - const finalConfig = config.config || BETTERER_TS; + const finalRepo = config.repoPath || cwd; const finalResults = config.results || BETTERER_RESULTS; + const ext = path.extname(finalConfig); - const ts = ext === TS_EXTENSION; + const ts = ext === path.extname(BETTERER_TS); const app = render( , - getRenderOptions(process.env.NODE_ENV) + getRenderOptionsΔ(process.env.NODE_ENV) ); await app.waitUntilExit(); }); diff --git a/packages/cli/src/init/create-test-file.worker.ts b/packages/cli/src/init/create-test-file.worker.ts index 66635384a..732ba5a95 100644 --- a/packages/cli/src/init/create-test-file.worker.ts +++ b/packages/cli/src/init/create-test-file.worker.ts @@ -1,23 +1,25 @@ import type { BettererLogger } from '@betterer/logger'; import { BettererError } from '@betterer/errors'; -import { exposeToMain__ } from '@betterer/worker'; +import { exposeToMainΔ } from '@betterer/worker'; import { promises as fs } from 'node:fs'; import path from 'node:path'; -const TEMPLATE_JS = `module.exports = { - // Add tests here ☀️ -}; -`; -const TEMPLATE_TS = `export default { +const TEMPLATE = `export default { // Add tests here ☀️ }; `; -export async function run(logger: BettererLogger, cwd: string, configPath: string, ts: boolean): Promise { +/** @knipignore part of worker API */ +export async function run( + logger: BettererLogger, + status: BettererLogger, + cwd: string, + configPath: string +): Promise { configPath = path.resolve(cwd, configPath); - await logger.progress(`creating "${configPath}" file...`); + await status.progress(`creating "${configPath}" file...`); let exists = false; try { @@ -32,12 +34,11 @@ export async function run(logger: BettererLogger, cwd: string, configPath: strin } try { - const template = ts ? TEMPLATE_TS : TEMPLATE_JS; - await fs.writeFile(configPath, template, 'utf8'); + await fs.writeFile(configPath, TEMPLATE, 'utf8'); await logger.success(`created "${configPath}"!`); - } catch { - throw new BettererError(`could not create "${configPath}".`); + } catch (error) { + throw new BettererError(`could not create "${configPath}".`, error as Error); } } -exposeToMain__({ run }); +exposeToMainΔ({ run }); diff --git a/packages/cli/src/init/enable-automerge.worker.ts b/packages/cli/src/init/enable-automerge.worker.ts index de80ff242..7e9f26127 100644 --- a/packages/cli/src/init/enable-automerge.worker.ts +++ b/packages/cli/src/init/enable-automerge.worker.ts @@ -1,7 +1,7 @@ import type { BettererLogger } from '@betterer/logger'; import { BettererError } from '@betterer/errors'; -import { exposeToMain__ } from '@betterer/worker'; +import { exposeToMainΔ } from '@betterer/worker'; import { promises as fs } from 'node:fs'; import path from 'node:path'; @@ -10,15 +10,21 @@ const NEW_LINE = '\n'; const MERGE_CONFIG = '[merge "betterer"]'; const MERGE_DIRECTIVE = 'merge=betterer'; -export async function run(logger: BettererLogger, cwd: string, resultsPath: string): Promise { - resultsPath = path.resolve(cwd, resultsPath); - - await logger.progress(`enabling Betterer merge for "${resultsPath}" file...`); +/** @knipignore part of worker API */ +export async function run( + logger: BettererLogger, + status: BettererLogger, + cwd: string, + repoPath: string, + resultsPath: string +): Promise { + const gitDir = await validateGitRepo(repoPath); + const rootPath = path.dirname(gitDir); - const gitDir = await findGitRoot(cwd); - const rootDir = path.dirname(gitDir); + resultsPath = path.resolve(cwd, resultsPath); - await Promise.all([gitconfig(logger, gitDir), gitattributes(logger, rootDir, resultsPath)]); + await status.progress(`enabling Betterer merge for "${resultsPath}" file...`); + await Promise.all([gitconfig(logger, gitDir), gitattributes(logger, rootPath, resultsPath)]); } async function gitconfig(logger: BettererLogger, gitDir: string): Promise { @@ -41,16 +47,16 @@ async function gitconfig(logger: BettererLogger, gitDir: string): Promise } const cliPath = require.resolve('@betterer/cli'); - const mergePath = path.resolve(cliPath, '../../bin/betterer-merge'); - const mergeCommand = `\tdriver = ${mergePath} %A %B`; + const mergePath = path.resolve(cliPath, '../../bin/betterer.js'); + const mergeCommand = `\tdriver = ${mergePath} merge %A %B`; lines.push(MERGE_CONFIG, mergeCommand, ''); try { await fs.writeFile(gitconfigPath, lines.join(NEW_LINE), 'utf-8'); await logger.success(`added Betterer merge config to "${gitconfigPath}"!`); - } catch { - throw new BettererError(`could not write "${gitconfigPath}".`); + } catch (error) { + throw new BettererError(`could not write "${gitconfigPath}".`, error as Error); } } @@ -84,23 +90,21 @@ async function gitattributes(logger: BettererLogger, rootDir: string, resultsPat try { await fs.writeFile(gitattributesPath, lines.join(NEW_LINE), 'utf-8'); await logger.success(`added Betterer merge attribute to "${gitattributesPath}"!`); - } catch { - throw new BettererError(`could not write "${gitattributesPath}".`); + } catch (error) { + throw new BettererError(`could not write "${gitattributesPath}".`, error as Error); } } -async function findGitRoot(cwd: string): Promise { - let dir = cwd; - while (dir !== path.parse(dir).root) { - try { - const gitPath = path.join(dir, '.git'); - await fs.access(gitPath); - return gitPath; - } catch (err) { - dir = path.join(dir, '..'); - } +async function validateGitRepo(repoPath: string): Promise { + try { + const gitPath = path.join(repoPath, '.git'); + await fs.access(gitPath); + return gitPath; + } catch { + throw new BettererError( + `".git" directory not found in "${repoPath}". \`--automerge\` only works within a Git repository.` + ); } - throw new BettererError('.git directory not found. Betterer must be used within a git repository.'); } -exposeToMain__({ run }); +exposeToMainΔ({ run }); diff --git a/packages/cli/src/init/init.tsx b/packages/cli/src/init/init.tsx index 801b24fa4..31bbeb9c9 100644 --- a/packages/cli/src/init/init.tsx +++ b/packages/cli/src/init/init.tsx @@ -4,48 +4,53 @@ import type { CreateTestFileWorker, EnableAutomergeWorker, UpdatePackageJSONWork import { Box, React, useCallback } from '@betterer/render'; import { BettererLogo, BettererTaskLogger, BettererTasksLogger } from '@betterer/tasks'; -import { exposeToWorker__, importWorker__ } from '@betterer/worker'; +import { exposeToWorkerΔ, importWorkerΔ } from '@betterer/worker'; +/** @knipignore used by an exported function */ export interface InitProps { automerge: boolean; configPath: string; cwd: string; logo: boolean; + repoPath: string; resultsPath: string; ts: boolean; } -export const Init: FC = function Init({ automerge, cwd, configPath, logo, resultsPath, ts }) { +export const Init: FC = function Init({ automerge, cwd, configPath, logo, repoPath, resultsPath, ts }) { const runCreateTestFile = useCallback( - async (logger: BettererLogger) => { - const createTestFile: CreateTestFileWorker = importWorker__('./create-test-file.worker.js'); + async (logger: BettererLogger, status: BettererLogger) => { + const createTestFile: CreateTestFileWorker = await importWorkerΔ('./create-test-file.worker.js'); try { - await createTestFile.api.run(exposeToWorker__(logger), cwd, configPath, ts); + await createTestFile.api.run(exposeToWorkerΔ(logger), exposeToWorkerΔ(status), cwd, configPath); } finally { await createTestFile.destroy(); } }, - [cwd, configPath, ts] + [cwd, configPath] ); const runUpdatePackageJSON = useCallback( - async (logger: BettererLogger) => { - const updatePackageJSON: UpdatePackageJSONWorker = importWorker__('./update-package-json.worker.js'); + async (logger: BettererLogger, status: BettererLogger) => { + const updatePackageJSON: UpdatePackageJSONWorker = await importWorkerΔ('./update-package-json.worker.js'); try { - await updatePackageJSON.api.run(exposeToWorker__(logger), cwd, ts); + await updatePackageJSON.api.run(exposeToWorkerΔ(logger), exposeToWorkerΔ(status), cwd, ts); } finally { await updatePackageJSON.destroy(); } }, [cwd, ts] ); - const runEnableAutomerge = useCallback(async (logger: BettererLogger) => { - const enableAutomerge: EnableAutomergeWorker = importWorker__('./enable-automerge.worker.js'); - try { - await enableAutomerge.api.run(exposeToWorker__(logger), cwd, resultsPath); - } finally { - await enableAutomerge.destroy(); - } - }, []); + const runEnableAutomerge = useCallback( + async (logger: BettererLogger, status: BettererLogger) => { + const enableAutomerge: EnableAutomergeWorker = await importWorkerΔ('./enable-automerge.worker.js'); + try { + await enableAutomerge.api.run(exposeToWorkerΔ(logger), exposeToWorkerΔ(status), cwd, repoPath, resultsPath); + } finally { + await enableAutomerge.destroy(); + } + }, + [cwd, resultsPath] + ); return ( diff --git a/packages/cli/src/init/update-package-json.worker.ts b/packages/cli/src/init/update-package-json.worker.ts index 5be5fc4c9..af016f076 100644 --- a/packages/cli/src/init/update-package-json.worker.ts +++ b/packages/cli/src/init/update-package-json.worker.ts @@ -3,14 +3,15 @@ import type { BettererLogger } from '@betterer/logger'; import type { BettererPackageJSON } from '../types.js'; import { BettererError } from '@betterer/errors'; -import { exposeToMain__ } from '@betterer/worker'; -import findUp from 'find-up'; +import { exposeToMainΔ } from '@betterer/worker'; +import { findUp } from 'find-up'; import { promises as fs } from 'node:fs'; import { getVersion } from '../version.js'; -export async function run(logger: BettererLogger, cwd: string, ts: boolean): Promise { - await logger.progress('adding "betterer" to package.json file...'); +/** @knipignore part of worker API */ +export async function run(logger: BettererLogger, status: BettererLogger, cwd: string, ts: boolean): Promise { + await status.progress('adding "betterer" to package.json file...'); let packageJSON; let packageJSONPath; @@ -20,19 +21,21 @@ export async function run(logger: BettererLogger, cwd: string, ts: boolean): Pro throw new BettererError('could not find "package.json".'); } packageJSON = JSON.parse(await fs.readFile(packageJSONPath, 'utf-8')) as BettererPackageJSON; - } catch { - throw new BettererError('could not read "package.json".'); + } catch (error) { + throw new BettererError('could not read "package.json".', error as Error); } - packageJSON.scripts = packageJSON.scripts || {}; - if (packageJSON.scripts.betterer) { + packageJSON.scripts = packageJSON.scripts ?? { betterer: '' }; + // eslint-disable-next-line @typescript-eslint/dot-notation -- prefer computed key + if (packageJSON.scripts['betterer']) { await logger.warn('"betterer" script already exists, moving on...'); } else { - packageJSON.scripts.betterer = 'betterer'; - await logger.success('added "betterer" script to package.json file.'); + // eslint-disable-next-line @typescript-eslint/dot-notation -- prefer computed key + packageJSON.scripts['betterer'] = 'betterer'; + await logger.success('added "betterer" script to package.json file'); } - packageJSON.devDependencies = packageJSON.devDependencies || {}; + packageJSON.devDependencies = packageJSON.devDependencies ?? {}; if (packageJSON.devDependencies['@betterer/cli']) { await logger.warn('"@betterer/cli" dependency already exists, moving on...'); } else { @@ -42,19 +45,21 @@ export async function run(logger: BettererLogger, cwd: string, ts: boolean): Pro } if (ts) { + // eslint-disable-next-line @typescript-eslint/dot-notation -- prefer computed key if (packageJSON.devDependencies['typescript']) { await logger.warn('"typescript" dependency already exists, moving on...'); } else { - packageJSON.devDependencies['typescript'] = `^4`; + // eslint-disable-next-line @typescript-eslint/dot-notation -- prefer computed key + packageJSON.devDependencies['typescript'] = `^5`; await logger.success('added "typescript" dependency to package.json file'); } } try { await fs.writeFile(packageJSONPath, `${JSON.stringify(packageJSON, null, 2)}\n`, 'utf-8'); - } catch { - throw new BettererError('could not write "package.json".'); + } catch (error) { + throw new BettererError('could not write "package.json".', error as Error); } } -exposeToMain__({ run }); +exposeToMainΔ({ run }); diff --git a/packages/cli/src/merge.ts b/packages/cli/src/merge.ts index de77c42d5..4dfdb36e6 100644 --- a/packages/cli/src/merge.ts +++ b/packages/cli/src/merge.ts @@ -5,7 +5,7 @@ import type { BettererCLIMergeConfig } from './types.js'; import { betterer } from '@betterer/betterer'; -import { mergeCommand, setEnv } from './options.js'; +import { mergeCommand } from './options.js'; /** * Run the **Betterer** `merge` command to resolve any merge conflicts in the @@ -15,8 +15,6 @@ export function merge(cwd: string): Command { const command = mergeCommand(); command.description('merge the Betterer results file'); command.action(async (config: BettererCLIMergeConfig, command: Command): Promise => { - setEnv(config); - // Mark options as unknown... const options: unknown = { contents: command.args, @@ -24,11 +22,7 @@ export function merge(cwd: string): Command { resultsPath: config.results }; - try { - await betterer.merge(options as BettererOptionsMerge); - } catch { - process.exitCode = 1; - } + await betterer.merge(options as BettererOptionsMerge); }); return command; diff --git a/packages/cli/src/options.ts b/packages/cli/src/options.ts index 083df375e..b9996e402 100644 --- a/packages/cli/src/options.ts +++ b/packages/cli/src/options.ts @@ -1,4 +1,4 @@ -import type { BettererCLIArguments, BettererCLIEnvConfig } from './types.js'; +import type { BettererCLIArguments } from './types.js'; import { Command } from 'commander'; @@ -6,18 +6,51 @@ import { BettererCommand } from './types.js'; let command: Command; -export function cliCommand(name: BettererCommand): Command { - command = new Command(name); +const DEPRECATED_V7 = 'This is now a noop and will be removed in v7.0.0 🚨'; + +export function ciCommand(): Command { + command = new Command(BettererCommand.ci); cacheOption(); configPathsOption(); excludesOption(); filtersOption(); - ignoresOption(); - logoOption(); - reportersOption(); + pathOptions(); + reportersOptions(); + resultsPathOption(); + strictDeadlinesOption(); + tsconfigPathOption(); + workersOption(); + debug(); + return command; +} + +export function precommitCommand(): Command { + command = new Command(BettererCommand.precommit); + cacheOption(); + configPathsOption(); + excludesOption(); + filtersOption(); + pathOptions(); + reportersOptions(); + resultsPathOption(); + strictDeadlinesOption(); + tsconfigPathOption(); + workersOption(); + debug(); + return command; +} + +export function startCommand(): Command { + command = new Command(BettererCommand.start); + cacheOption(); + configPathsOption(); + excludesOption(); + filtersOption(); + pathOptions(); + reportersOptions(); resultsPathOption(); - silentOption(); strictOption(); + strictDeadlinesOption(); tsconfigPathOption(); updateOption(); workersOption(); @@ -25,12 +58,28 @@ export function cliCommand(name: BettererCommand): Command { return command; } +export function watchCommand(): Command { + command = new Command(BettererCommand.watch); + cacheOption(); + configPathsOption(); + filtersOption(); + ignoresOption(); + pathOptions(); + reportersOptions(); + resultsPathOption(); + tsconfigPathOption(); + workersOption(); + debug(); + return command; +} + export function initCommand(): Command { command = new Command(BettererCommand.init); automergeOption(); configPathOption(); logoOption(); resultsPathOption(); + repoPathOption(); debug(); return command; } @@ -48,6 +97,7 @@ export function resultsCommand(): Command { excludesOption(); filtersOption(); logoOption(); + pathOptions(); resultsPathOption(); debug(); return command; @@ -63,19 +113,12 @@ export function upgradeCommand(): Command { } function debug(): void { - command.option('-d, --debug', 'Enable verbose debug logging', false); - command.option('-l, --debug-log [value]', 'File path to save verbose debug logging to disk', './betterer.log'); -} - -export function setEnv(config: BettererCLIEnvConfig): void { - if (config.debug) { - process.env.BETTERER_DEBUG = '1'; - process.env.BETTERER_DEBUG_TIME = '1'; - process.env.BETTERER_DEBUG_VALUES = '1'; - if (config.debugLog) { - process.env.BETTERER_DEBUG_LOG = config.debugLog; - } - } + command.option('-d, --debug', `Enable verbose debug logging. ${DEPRECATED_V7}`); + command.option('-l, --debug-log [value]', `File path to save verbose debug logging to disk. ${DEPRECATED_V7}`); +} + +function tsconfigPathOption(): void { + command.option('-t, --tsconfig [value]', `Path to TypeScript config file relative to CWD. ${DEPRECATED_V7}`); } function cacheOption(): void { @@ -96,17 +139,16 @@ function configPathsOption(): void { } function automergeOption(): void { - command.option('--automerge', 'Enable automatic merging for the Betterer results file'); + command.option( + '--automerge', + 'Enable automatic merging for the Betterer results file. Only valid in a Git repository' + ); } function resultsPathOption(): void { command.option('-r, --results [value]', 'Path to test results file relative to CWD'); } -function tsconfigPathOption(): void { - command.option('-t, --tsconfig [value]', 'Path to TypeScript config file relative to CWD'); -} - function filtersOption(): void { command.option( '-f, --filter [value]', @@ -123,19 +165,24 @@ function ignoresOption(): void { command.option('-i, --ignore [value]', 'Glob pattern for files to ignore. Takes multiple values', argsToArray); } -function logoOption(): void { +function reportersOptions(): void { command.option( - '--logo', - 'When set to `false` the default reporter will not emit a logo. Defaults to `true`', - argsToPrimitive + '-R, --reporter [value]', + 'npm package name for a Betterer reporter. Takes multiple values', + argsToArray + ); + command.option( + '-s, --silent', + 'When present, all default reporters will be disabled. Custom reporters will still work normally.' ); + logoOption(); } -function reportersOption(): void { +function logoOption(): void { command.option( - '-R, --reporter [value]', - 'npm package name for a Betterer reporter. Takes multiple values', - argsToArray + '--logo', + 'When set to `false` the default reporter will not emit a logo. Defaults to `true`', + argsToPrimitive ); } @@ -143,17 +190,17 @@ function saveOption(): void { command.option('--save', 'When present, Betterer will save the result of an upgrade to disk.'); } -function silentOption(): void { +function strictOption(): void { command.option( - '-s, --silent', - 'When present, all default reporters will be disabled. Custom reporters will still work normally.' + '--strict', + 'When present, the "how to update" message will not be shown and the `--update` option will be set to false.' ); } -function strictOption(): void { +function strictDeadlinesOption(): void { command.option( - '--strict', - 'When present, the "how to update" message will not be shown and the `--update` option will be set to false.' + '--strictDeadlines', + 'When present, Betterer will throw an error if any tests have passed their deadline without meeting their goal.' ); } @@ -169,6 +216,19 @@ function workersOption(): void { ); } +function pathOptions(): void { + basePathOption(); + repoPathOption(); +} + +function basePathOption(): void { + command.option('--basePath [value]', 'The path to the directory containing the code to be covered by Betterer.'); +} + +function repoPathOption(): void { + command.option('--repoPath [value]', 'The path to the root of the repository.'); +} + function argsToArray(value: string, previous: BettererCLIArguments = []): BettererCLIArguments { return previous.concat([value]); } diff --git a/packages/cli/src/precommit.ts b/packages/cli/src/precommit.ts index dd8f47ca0..912b980c2 100644 --- a/packages/cli/src/precommit.ts +++ b/packages/cli/src/precommit.ts @@ -1,24 +1,23 @@ -import type { BettererOptionsStart } from '@betterer/betterer'; +import type { BettererOptions } from '@betterer/betterer'; import type { Command } from 'commander'; import type { BettererCLIConfig } from './types.js'; import { betterer } from '@betterer/betterer'; -import { cliCommand, setEnv } from './options.js'; -import { BettererCommand } from './types.js'; +import { precommitCommand } from './options.js'; /** * Run **Betterer** in `precommit` mode. */ export function precommit(cwd: string): Command { - const command = cliCommand(BettererCommand.precommit); + const command = precommitCommand(); command.description('run Betterer in precommit mode'); command.action(async (config: BettererCLIConfig, command: Command): Promise => { - setEnv(config); - - // Mark options as unknown... - const options: unknown = { + // Cast the options to BettererOptions. This is possibly invalid, + // but it's nicer to do the validation in @betterer/betterer + const { error } = await betterer({ + basePath: config.basePath, cache: config.cache, cachePath: config.cachePath, configPaths: config.config, @@ -29,21 +28,15 @@ export function precommit(cwd: string): Command { logo: config.logo, precommit: true, reporters: config.reporter, + repoPath: config.repoPath, resultsPath: config.results, silent: config.silent, - tsconfigPath: config.tsconfig, + strictDeadlines: config.strictDeadlines, workers: config.workers - }; + } as BettererOptions); - try { - // And then cast to BettererOptionsStart. This is possibly invalid, - // but it's nicer to do the options validation in @betterer/betterer - const suiteSummary = await betterer(options as BettererOptionsStart); - if (suiteSummary.worse.length > 0 || suiteSummary.failed.length > 0) { - process.exitCode = 1; - } - } catch { - process.exitCode = 1; + if (error) { + throw error; } }); diff --git a/packages/cli/src/results.tsx b/packages/cli/src/results.tsx index 7fb214457..9c5199ab8 100644 --- a/packages/cli/src/results.tsx +++ b/packages/cli/src/results.tsx @@ -3,9 +3,9 @@ import type { Command } from 'commander'; import type { BettererCLIResultsConfig } from './types.js'; -import { React, getRenderOptions, render } from '@betterer/render'; +import { React, getRenderOptionsΔ, render } from '@betterer/render'; -import { resultsCommand, setEnv } from './options.js'; +import { resultsCommand } from './options.js'; import { Results } from './results/results.js'; /** @@ -16,29 +16,25 @@ export function results(cwd: string): Command { const command = resultsCommand(); command.description(); command.action(async (config: BettererCLIResultsConfig, command: Command): Promise => { - setEnv(config); - // Mark options as unknown... const options: unknown = { + basePath: config.basePath, configPaths: config.config, cwd, excludes: config.exclude, filters: config.filter, includes: command.args, + repoPath: config.repoPath, resultsPath: config.results }; - try { - // And then cast to BettererOptionsResults. This is possibly invalid, - // but it's nicer to do the options validation in @betterer/betterer - const app = render( - , - getRenderOptions(process.env.NODE_ENV) - ); - await app.waitUntilExit(); - } catch { - process.exitCode = 1; - } + // And then cast to BettererOptionsResults. This is possibly invalid, + // but it's nicer to do the options validation in @betterer/betterer + const app = render( + , + getRenderOptionsΔ(process.env.NODE_ENV) + ); + await app.waitUntilExit(); }); return command; } diff --git a/packages/cli/src/results/get-results-summary.worker.ts b/packages/cli/src/results/get-results-summary.worker.ts index 4acd59f71..d98b9bbb8 100644 --- a/packages/cli/src/results/get-results-summary.worker.ts +++ b/packages/cli/src/results/get-results-summary.worker.ts @@ -1,10 +1,11 @@ import type { BettererOptionsResults, BettererResultsSummary } from '@betterer/betterer'; import { betterer } from '@betterer/betterer'; -import { exposeToMain__ } from '@betterer/worker'; +import { exposeToMainΔ } from '@betterer/worker'; +/** @knipignore part of worker API */ export function run(options: BettererOptionsResults): Promise { return betterer.results(options); } -exposeToMain__({ run }); +exposeToMainΔ({ run }); diff --git a/packages/cli/src/results/results.tsx b/packages/cli/src/results/results.tsx index 4f95fb811..c3e9d4c31 100644 --- a/packages/cli/src/results/results.tsx +++ b/packages/cli/src/results/results.tsx @@ -4,8 +4,9 @@ import type { GetResultsSummaryWorker } from './types.js'; import { React, Box, Text, useApp, useEffect, useState } from '@betterer/render'; import { BettererLogo } from '@betterer/tasks'; -import { importWorker__ } from '@betterer/worker'; +import { importWorkerΔ } from '@betterer/worker'; +/** @knipignore used by an exported function */ export interface ResultsProps { options: BettererOptionsResults; logo: boolean; @@ -15,7 +16,7 @@ export const Results: FC = function Results({ options, logo }) { const [resultsSummary, setResultsSummary] = useState(null); useEffect(() => { void (async () => { - const getResultsSummary: GetResultsSummaryWorker = importWorker__('./get-results-summary.worker.js'); + const getResultsSummary: GetResultsSummaryWorker = await importWorkerΔ('./get-results-summary.worker.js'); try { setResultsSummary(await getResultsSummary.api.run(options)); } finally { @@ -27,7 +28,9 @@ export const Results: FC = function Results({ options, logo }) { const app = useApp(); useEffect(() => { if (resultsSummary) { - setImmediate(() => app.exit()); + setImmediate(() => { + app.exit(); + }); } }, [resultsSummary]); @@ -42,8 +45,7 @@ export const Results: FC = function Results({ options, logo }) { {`${resultSummary.name}: `} - {Object.keys(resultSummary.details).map((filePath) => { - const issues = resultSummary.details[filePath]; + {Object.entries(resultSummary.details).map(([filePath, issues]) => { return issues.map((issue, index) => ( {issue.message} diff --git a/packages/cli/src/start.ts b/packages/cli/src/start.ts index 2607ffe1d..86003efcb 100644 --- a/packages/cli/src/start.ts +++ b/packages/cli/src/start.ts @@ -1,24 +1,23 @@ -import type { BettererOptionsStart } from '@betterer/betterer'; +import type { BettererOptions } from '@betterer/betterer'; import type { Command } from 'commander'; import type { BettererCLIConfig } from './types.js'; import { betterer } from '@betterer/betterer'; -import { cliCommand, setEnv } from './options.js'; -import { BettererCommand } from './types.js'; +import { startCommand } from './options.js'; /** * Run **Betterer** in the default mode. */ export function start(cwd: string, ci: boolean): Command { - const command = cliCommand(BettererCommand.start); + const command = startCommand(); command.description('run Betterer'); command.action(async (config: BettererCLIConfig, command: Command): Promise => { - setEnv(config); - - // Mark options as unknown... - const options: unknown = { + // Cast the options to BettererOptions. This is possibly invalid, + // but it's nicer to do the validation in @betterer/betterer + const { error } = await betterer({ + basePath: config.basePath, cache: config.cache, cachePath: config.cachePath, configPaths: config.config, @@ -29,23 +28,17 @@ export function start(cwd: string, ci: boolean): Command { includes: command.args, logo: config.logo, reporters: config.reporter, + repoPath: config.repoPath, resultsPath: config.results, silent: config.silent, strict: config.strict, - tsconfigPath: config.tsconfig, + strictDeadlines: config.strictDeadlines, update: config.update, workers: config.workers - }; + } as BettererOptions); - try { - // And then cast to BettererOptionsStart. This is possibly invalid, - // but it's nicer to do the options validation in @betterer/betterer - const suiteSummary = await betterer(options as BettererOptionsStart); - if (suiteSummary.worse.length > 0 || suiteSummary.failed.length > 0) { - process.exitCode = 1; - } - } catch { - process.exitCode = 1; + if (error) { + throw error; } }); return command; diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts index b5109358f..ee44f0eba 100644 --- a/packages/cli/src/types.ts +++ b/packages/cli/src/types.ts @@ -18,12 +18,8 @@ export enum BettererCommand { export type BettererCommandName = `${BettererCommand}`; -export interface BettererCLIEnvConfig { - debug: boolean; - debugLog: string; -} - -export interface BettererCLIConfig extends BettererCLIEnvConfig { +export interface BettererCLIConfig { + basePath: string; cache: boolean; cachePath: string; config: BettererCLIArguments; @@ -33,38 +29,43 @@ export interface BettererCLIConfig extends BettererCLIEnvConfig { include: BettererCLIArguments; logo: boolean; reporter: BettererCLIArguments; + repoPath: string; results: string; silent: boolean; strict: boolean; + strictDeadlines: boolean; tsconfig: string; update: boolean; workers: number | boolean; } -export interface BettererCLIInitConfig extends BettererCLIEnvConfig { +export interface BettererCLIInitConfig { automerge: boolean; config: string; logo: boolean; + repoPath: string; results: string; } -export interface BettererCLIMergeConfig extends BettererCLIEnvConfig { +export interface BettererCLIMergeConfig { contents: Array; logo: boolean; results: string; } -export interface BettererCLIResultsConfig extends BettererCLIEnvConfig { +export interface BettererCLIResultsConfig { + basePath: string; config: BettererCLIArguments; exclude: BettererCLIArguments; filter: BettererCLIArguments; include: BettererCLIArguments; logo: boolean; + repoPath: string; results: string; } -export interface BettererCLIUpgradeConfig extends BettererCLIEnvConfig { - config: BettererCLIArguments; +export interface BettererCLIUpgradeConfig { + config?: BettererCLIArguments; logo: boolean; save: boolean; } @@ -75,7 +76,16 @@ export interface BettererCLIUpgradeConfig extends BettererCLIEnvConfig { * A basic representation of the package.json configuration file. */ export interface BettererPackageJSON { + /** + * the current version of the package + */ version: string; - scripts: Record & { betterer: string }; - devDependencies: Record; + /** + * "scripts" will be updated to add new `betterer` run commands + */ + scripts?: Record; + /** + * "devDependencies" will be updated to add `betterer@latest` + */ + devDependencies?: Record; } diff --git a/packages/cli/src/upgrade.tsx b/packages/cli/src/upgrade.tsx index 3ca25952d..89d07ea91 100644 --- a/packages/cli/src/upgrade.tsx +++ b/packages/cli/src/upgrade.tsx @@ -1,11 +1,14 @@ import type { Command } from 'commander'; +import type { BettererConfigPaths } from '@betterer/betterer'; import type { BettererCLIUpgradeConfig } from './types.js'; -import { React, getRenderOptions, render } from '@betterer/render'; +import { React, getRenderOptionsΔ, render } from '@betterer/render'; import { Upgrade } from './upgrade/upgrade.js'; -import { setEnv, upgradeCommand } from './options.js'; +import { upgradeCommand } from './options.js'; + +const DEFAULT_CONFIG_PATHS: BettererConfigPaths = ['./.betterer.ts']; /** * Run the **Betterer** `upgrade` command to upgrade **Betterer** in an existing project. @@ -14,13 +17,11 @@ export function upgrade(cwd: string): Command { const command = upgradeCommand(); command.description('upgrade Betterer files in a project'); command.action(async (config: BettererCLIUpgradeConfig): Promise => { - setEnv(config); - - const configPaths = config.config ? config.config : ['./.betterer.ts']; + const configPaths = config.config ? config.config : DEFAULT_CONFIG_PATHS; const app = render( - , - getRenderOptions(process.env.NODE_ENV) + , + getRenderOptionsΔ(process.env.NODE_ENV) ); await app.waitUntilExit(); }); diff --git a/packages/cli/src/upgrade/diff.ts b/packages/cli/src/upgrade/diff.ts index 0f33846fc..c56b7559f 100644 --- a/packages/cli/src/upgrade/diff.ts +++ b/packages/cli/src/upgrade/diff.ts @@ -1,16 +1,16 @@ -import { diffStrings__ } from '@betterer/logger'; -import { greenBright, gray } from 'chalk'; +import { diffStringsΔ } from '@betterer/logger'; +import chalk from 'chalk'; const DIFF_OPTIONS = { aAnnotation: 'Before', aIndicator: '-', - aColor: gray, + aColor: chalk.gray, bAnnotation: 'After', - bColor: greenBright, + bColor: chalk.greenBright, bIndicator: '+', expand: true }; export function diff(before: string, after: string): string { - return diffStrings__(before, after, DIFF_OPTIONS); + return diffStringsΔ(before, after, DIFF_OPTIONS); } diff --git a/packages/cli/src/upgrade/types.ts b/packages/cli/src/upgrade/types.ts index 85f96499d..64ac31c13 100644 --- a/packages/cli/src/upgrade/types.ts +++ b/packages/cli/src/upgrade/types.ts @@ -1,3 +1,3 @@ import type { BettererWorkerAPI } from '@betterer/worker'; -export type UpgradeConfigFileWorker = BettererWorkerAPI; +export type UpgradeConfigFileWorker = BettererWorkerAPI; diff --git a/packages/cli/src/upgrade/upgrade-cjs.ts b/packages/cli/src/upgrade/upgrade-cjs.ts index 9bb85e807..751e3ce02 100644 --- a/packages/cli/src/upgrade/upgrade-cjs.ts +++ b/packages/cli/src/upgrade/upgrade-cjs.ts @@ -29,7 +29,7 @@ export function upgradeCJS(originalSourceFile: SourceFile, configPath: string): upgraded = reparse( tsquery.map(upgraded, EXPORT_TEST_QUERY, (configExportConst) => { const { left, operatorToken, right } = configExportConst as BinaryExpression; - const wrapped = !!right && wrapTest(right); + const wrapped = wrapTest(right); if (!wrapped) { return configExportConst; } diff --git a/packages/cli/src/upgrade/upgrade-config-file.worker.ts b/packages/cli/src/upgrade/upgrade-config-file.worker.ts index e4210315c..f70230829 100644 --- a/packages/cli/src/upgrade/upgrade-config-file.worker.ts +++ b/packages/cli/src/upgrade/upgrade-config-file.worker.ts @@ -2,10 +2,10 @@ import type { BettererLogger } from '@betterer/logger'; import type { SourceFile } from 'typescript'; import { BettererError } from '@betterer/errors'; -import { exposeToMain__ } from '@betterer/worker'; +import { exposeToMainΔ } from '@betterer/worker'; import { tsquery } from '@phenomnomnominal/tsquery'; import { promises as fs } from 'node:fs'; -import { format, resolveConfig } from 'prettier'; +import { format } from 'prettier'; import { createPrinter, ModuleKind } from 'typescript'; import { diff } from './diff.js'; @@ -14,12 +14,14 @@ import { upgradeESM } from './upgrade-esm.js'; const printer = createPrinter(); -// module.exports -const EXPORT_MODULE_EXPORTS_QUERY = - 'PropertyAccessExpression:has(Identifier[name="module"]):has(Identifier[name="exports"])'; - -export async function run(logger: BettererLogger, configPath: string, save: boolean): Promise { - await logger.progress(`upgrading "${configPath}"...`); +/** @knipignore part of worker API */ +export async function run( + logger: BettererLogger, + status: BettererLogger, + configPath: string, + save: boolean +): Promise { + await status.progress(`upgrading "${configPath}"...`); const fileText = await fs.readFile(configPath, 'utf8'); const replaceNewLines = fileText.split('\n\n').join('/* BLANK LINE */'); @@ -34,12 +36,13 @@ export async function run(logger: BettererLogger, configPath: string, save: bool const upgrade = moduleType === ModuleKind.CommonJS ? upgradeCJS : upgradeESM; const upgradedSourceFile = upgrade(originalSourceFile, configPath); - const config = await resolveConfig(configPath); const printed = printUpgraded(originalSourceFile, upgradedSourceFile); - const formatOptions = { ...config, parser: 'typescript' }; - const formattedOriginal = format(fileText, formatOptions); - const formatted = format(printed, formatOptions); + const formatOptions = { parser: 'typescript' }; + const [formattedOriginal, formatted] = await Promise.all([ + format(fileText, formatOptions), + format(printed, formatOptions) + ]); if (formattedOriginal !== formatted) { if (!save) { @@ -53,7 +56,7 @@ export async function run(logger: BettererLogger, configPath: string, save: bool } if (save) { - await logger.progress(`Saving upgraded config to "${configPath}"...`); + await status.progress(`Saving upgraded config to "${configPath}"...`); await fs.writeFile(configPath, formatted); await logger.success(`Saved upgraded config to "${configPath}"! ☀️`); } @@ -66,6 +69,10 @@ const EXPORT_QUERY = 'ExportDeclaration, ExportAssignment'; // export const thing = 'foo'; const EXPORT_VARIABLE_DECLARATION_QUERY = 'VariableStatement:has(ExportKeyword)'; +// module.exports +const EXPORT_MODULE_EXPORTS_QUERY = + 'PropertyAccessExpression:has(Identifier[name="module"]):has(Identifier[name="exports"])'; + function getModuleType(originalSourceFile: SourceFile): ModuleKind | null { const [exportStatement] = tsquery(originalSourceFile, EXPORT_QUERY); const [exportVariableDeclaration] = tsquery(originalSourceFile, EXPORT_VARIABLE_DECLARATION_QUERY); @@ -128,4 +135,4 @@ function print(upgradedSourceFile: SourceFile): string { return printed.replace(/\/\* BLANK LINE \*\//g, '\n\n'); } -exposeToMain__({ run }); +exposeToMainΔ({ run }); diff --git a/packages/cli/src/upgrade/upgrade-esm.ts b/packages/cli/src/upgrade/upgrade-esm.ts index 69644a8b9..3eebcde80 100644 --- a/packages/cli/src/upgrade/upgrade-esm.ts +++ b/packages/cli/src/upgrade/upgrade-esm.ts @@ -14,9 +14,9 @@ const EXPORT_TESTS_QUERY = 'ExportAssignment:has(PropertyAssignment)'; export function upgradeESM(originalSourceFile: SourceFile, configPath: string): SourceFile { let upgraded = reparse( tsquery.map(originalSourceFile, EXPORT_TESTS_QUERY, (configExports) => { - const { expression, decorators, modifiers, isExportEquals } = configExports as ExportAssignment; + const { expression, modifiers, isExportEquals } = configExports as ExportAssignment; if (isObjectLiteralExpression(expression)) { - return factory.createExportAssignment(decorators, modifiers, isExportEquals, wrapTests(expression)); + return factory.createExportAssignment(modifiers, isExportEquals, wrapTests(expression)); } return configExports; }), diff --git a/packages/cli/src/upgrade/upgrade.tsx b/packages/cli/src/upgrade/upgrade.tsx index 277653bb3..df7b3e8db 100644 --- a/packages/cli/src/upgrade/upgrade.tsx +++ b/packages/cli/src/upgrade/upgrade.tsx @@ -5,9 +5,10 @@ import type { UpgradeConfigFileWorker } from './types.js'; import { React, Box, useCallback } from '@betterer/render'; import { BettererLogo, BettererTaskLogger, BettererTasksLogger } from '@betterer/tasks'; -import { exposeToWorker__, importWorker__ } from '@betterer/worker'; +import { exposeToWorkerΔ, importWorkerΔ } from '@betterer/worker'; import path from 'node:path'; +/** @knipignore used by an exported function */ export interface UpgradeProps { configPaths: BettererConfigPaths; cwd: string; @@ -22,10 +23,15 @@ export const Upgrade: FC = function Upgrade({ configPaths, cwd, lo {configPaths.map((configPath) => { const runUpgradeConfigFile = useCallback( - async (logger: BettererLogger) => { - const upgradeConfigFile: UpgradeConfigFileWorker = importWorker__('./upgrade-config-file.worker.js'); + async (logger: BettererLogger, status: BettererLogger) => { + const upgradeConfigFile: UpgradeConfigFileWorker = await importWorkerΔ('./upgrade-config-file.worker.js'); try { - await upgradeConfigFile.api.run(exposeToWorker__(logger), path.resolve(cwd, configPath), save); + await upgradeConfigFile.api.run( + exposeToWorkerΔ(logger), + exposeToWorkerΔ(status), + path.resolve(cwd, configPath), + save + ); } finally { await upgradeConfigFile.destroy(); } diff --git a/packages/cli/src/version.ts b/packages/cli/src/version.ts index e57e7943a..093b6296b 100644 --- a/packages/cli/src/version.ts +++ b/packages/cli/src/version.ts @@ -2,8 +2,10 @@ import type { BettererPackageJSON } from './types.js'; import { promises as fs } from 'node:fs'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; export async function getVersion(): Promise { + const __dirname = path.dirname(fileURLToPath(import.meta.url)); const packageJSONPath = path.resolve(__dirname, '../package.json'); const cliPackageJSON = await fs.readFile(packageJSONPath, 'utf-8'); const { version } = JSON.parse(cliPackageJSON) as BettererPackageJSON; diff --git a/packages/cli/src/watch.ts b/packages/cli/src/watch.ts index 1295f1f51..53dadc371 100644 --- a/packages/cli/src/watch.ts +++ b/packages/cli/src/watch.ts @@ -5,20 +5,19 @@ import type { BettererCLIConfig } from './types.js'; import { betterer } from '@betterer/betterer'; -import { cliCommand, setEnv } from './options.js'; -import { BettererCommand } from './types.js'; +import { watchCommand } from './options.js'; /** * Run **Betterer** in `watch` mode. */ export function watch(cwd: string): Command { - const command = cliCommand(BettererCommand.watch); + const command = watchCommand(); command.description('run Betterer in watch mode'); command.action(async (config: BettererCLIConfig): Promise => { - setEnv(config); - - // Mark options as unknown... - const options: unknown = { + // Cast the options to BettererOptions. This is possibly invalid, + // but it's nicer to do the validation in @betterer/betterer + await betterer.watch({ + basePath: config.basePath, cache: config.cache, cachePath: config.cachePath, configPaths: config.config, @@ -27,17 +26,11 @@ export function watch(cwd: string): Command { ignores: config.ignore, logo: config.logo, reporters: config.reporter, + repoPath: config.repoPath, resultsPath: config.results, silent: config.silent, - strict: config.strict, - tsconfigPath: config.tsconfig, - update: config.update, workers: config.workers - }; - - // And then cast to BettererOptionsWatch. This is possibly invalid, - // but it's nicer to do the options validation in @betterer/betterer - await betterer.watch(options as BettererOptionsWatch); + } as BettererOptionsWatch); }); return command; } diff --git a/packages/constraints/CHANGELOG.md b/packages/constraints/CHANGELOG.md index 74ee8909f..9c03ffc4b 100644 --- a/packages/constraints/CHANGELOG.md +++ b/packages/constraints/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/constraints + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + +**Note:** Version bump only for package @betterer/constraints + + + + + # [5.3.0](https://github.com/phenomnomnominal/betterer/compare/v5.2.4...v5.3.0) (2022-04-13) **Note:** Version bump only for package @betterer/constraints diff --git a/packages/constraints/LICENSE.md b/packages/constraints/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/constraints/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/constraints/package.json b/packages/constraints/package.json index 88a410f6c..acc87690c 100644 --- a/packages/constraints/package.json +++ b/packages/constraints/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/constraints", "description": "default constraints for @betterer/betterer", - "version": "5.3.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,9 +26,7 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, - "dependencies": { - "tslib": "^2.3.1" - } + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/coverage/CHANGELOG.md b/packages/coverage/CHANGELOG.md index 2c55ff455..04effc7c2 100644 --- a/packages/coverage/CHANGELOG.md +++ b/packages/coverage/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/coverage + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** improve docs, handle include and exclude, add tests, simplify ([#1219](https://github.com/phenomnomnominal/betterer/issues/1219)) ([285d432](https://github.com/phenomnomnominal/betterer/commit/285d4323896ac00dbf5cf44f94cba961d0605f37)) + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) **Note:** Version bump only for package @betterer/coverage diff --git a/packages/coverage/LICENSE.md b/packages/coverage/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/coverage/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/coverage/package.json b/packages/coverage/package.json index fc23f11d7..250d64973 100644 --- a/packages/coverage/package.json +++ b/packages/coverage/package.json @@ -1,17 +1,21 @@ { "name": "@betterer/coverage", "description": "A betterer test which ensures that test coverage increases over time", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], - "author": "Lucas Treffenstädt ", + "contributors": [ + "Lucas Treffenstädt ", + "Craig Spence " + ], "homepage": "https://phenomnomnominal.github.io/betterer", "repository": { "type": "git", @@ -25,18 +29,16 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/constraints": "^5.3.0", - "@betterer/errors": "^5.3.0", - "@betterer/logger": "^5.3.4", - "minimatch": "^5.0.1", - "tslib": "^2.3.1" + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/constraints": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1" }, "devDependencies": { - "@types/istanbul-lib-coverage": "2.0.4", - "@types/minimatch": "^3.0.5" - } + "@types/istanbul-lib-coverage": "2.0.4" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/coverage/src/constraint.ts b/packages/coverage/src/constraint.ts index 45d1b2ac7..53603e851 100644 --- a/packages/coverage/src/constraint.ts +++ b/packages/coverage/src/constraint.ts @@ -1,11 +1,16 @@ +import type { BettererRun } from '@betterer/betterer'; import type { BettererCoverageDiff, BettererCoverageIssues } from './types.js'; import { BettererConstraintResult } from '@betterer/constraints'; import { differ } from './differ.js'; -export function constraint(result: BettererCoverageIssues, expected: BettererCoverageIssues): BettererConstraintResult { - const { diff } = differ(result, expected); +export async function constraint( + this: BettererRun, + result: BettererCoverageIssues, + expected: BettererCoverageIssues +): Promise { + const { diff } = await differ.call(this, result, expected); if (isWorse(diff)) { return BettererConstraintResult.worse; } @@ -16,15 +21,15 @@ export function constraint(result: BettererCoverageIssues, expected: BettererCov } function isWorse(diff: BettererCoverageDiff): boolean { - return Object.keys(diff).some((filePath) => { - const { lines, statements, functions, branches } = diff[filePath]; + return Object.entries(diff).some(([, fileDiff]) => { + const { lines, statements, functions, branches } = fileDiff; return lines < 0 || statements < 0 || functions < 0 || branches < 0; }); } function isBetter(diff: BettererCoverageDiff): boolean { - return Object.keys(diff).some((filePath) => { - const { lines, statements, functions, branches } = diff[filePath]; + return Object.entries(diff).some(([, fileDiff]) => { + const { lines, statements, functions, branches } = fileDiff; return lines > 0 || statements > 0 || functions > 0 || branches > 0; }); } diff --git a/packages/coverage/src/coverage-test.ts b/packages/coverage/src/coverage-test.ts index a8c63ebb0..fd7b973d3 100644 --- a/packages/coverage/src/coverage-test.ts +++ b/packages/coverage/src/coverage-test.ts @@ -1,72 +1,26 @@ -import type { BettererFileGlobs, BettererFilePatterns, BettererRun } from '@betterer/betterer'; - -import type { BettererCoverageDiff, BettererCoverageIssues, BettererCoverageTestFunction } from './types.js'; +import type { + BettererCoverageDiff, + BettererCoverageIssues, + BettererCoverageTest, + BettererCoverageTestFunction +} from './types.js'; -import { BettererTest } from '@betterer/betterer'; +import { BettererResolverTest } from '@betterer/betterer'; import { constraint } from './constraint.js'; import { differ } from './differ.js'; import { goal } from './goal.js'; -import { deserialise, serialise } from './serialiser.js'; -import { flatten } from './utils.js'; - -/** - * @public `BettererCoverageTest` provides a wrapper around {@link @betterer/betterer#BettererTest | `BettererTest` } - * that makes it easier to implement coverage tests. - * - * @remarks `BettererCoverageTest` provides a useful example for the more complex possibilities of the {@link @betterer/betterer#BettererTestOptions | `BettererTestOptions` } - * interface. - */ -export class BettererCoverageTest extends BettererTest< - BettererCoverageIssues, - BettererCoverageIssues, - BettererCoverageDiff -> { - private _excluded: Array = []; - private _included: Array = []; - /** - * @internal This could change at any point! Please don't use! - * - * You should not construct a `BettererCoverageTest` directly. - */ +export class BettererCoverageTestΩ + extends BettererResolverTest + implements BettererCoverageTest +{ constructor(test: BettererCoverageTestFunction, coverageSummaryPath = './coverage/coverage-summary.json') { super({ - test: (run: BettererRun) => test(run, coverageSummaryPath, this._included, this._excluded), + test: async () => await test(coverageSummaryPath, this.resolver), constraint, differ, - goal, - serialiser: { - serialise, - deserialise - } + goal }); } - - /** - * Add a list of {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions | Regular Expression } filters for files to exclude when running the test. - * - * @param excludePatterns - RegExp filters to match file paths that should be excluded. - * @returns This {@link @betterer/coverage#BettererCoverageTest | `BettererCoverageTest`}, so it is chainable. - */ - public exclude(...excludePatterns: BettererFilePatterns): this { - if (!this._included.length) { - this.include('**/*'); - } - this._excluded = [...this._excluded, ...flatten(excludePatterns)]; - return this; - } - - /** - * Add a list of {@link https://www.npmjs.com/package/glob#user-content-glob-primer | glob } - * patterns for files to include when running the test. - * - * @param includePatterns - Glob patterns to match file paths that should be included. All - * `includes` should be relative to the {@link https://phenomnomnominal.github.io/betterer/docs/test-definition-file | test definition file}. - * @returns This {@link @betterer/coverage#BettererCoverageTest | `BettererCoverageTest`}, so it is chainable. - */ - public include(...includePatterns: BettererFileGlobs): this { - this._included = [...this._included, ...flatten(includePatterns)]; - return this; - } } diff --git a/packages/coverage/src/coverage.ts b/packages/coverage/src/coverage.ts index 5b7a250a5..c72c88d83 100644 --- a/packages/coverage/src/coverage.ts +++ b/packages/coverage/src/coverage.ts @@ -1,4 +1,6 @@ -import { BettererCoverageTest } from './coverage-test.js'; +import type { BettererCoverageTest } from './types.js'; + +import { BettererCoverageTestΩ } from './coverage-test.js'; import { test, testTotal } from './test.js'; /** @@ -6,10 +8,10 @@ import { test, testTotal } from './test.js'; * Use this test to track your per-file test coverage. Reads a {@link https://github.com/istanbuljs/istanbuljs/blob/master/packages/istanbul-reports/lib/json-summary/index.js | json-summary format} * coverage summary. Make sure to run your tests separately before running Betterer. * - * @param coverageSummaryPath - relative path to the coverage summary. Defaults to './coverage/coverage-summary.json'. + * @param coverageSummaryPath - relative path to the coverage summary. Defaults to `'./coverage/coverage-summary.json'`. */ export function coverage(coverageSummaryPath?: string): BettererCoverageTest { - return new BettererCoverageTest(test, coverageSummaryPath); + return new BettererCoverageTestΩ(test, coverageSummaryPath); } /** @@ -17,8 +19,8 @@ export function coverage(coverageSummaryPath?: string): BettererCoverageTest { * Use this test to track your total test coverage. Reads a {@link https://github.com/istanbuljs/istanbuljs/blob/master/packages/istanbul-reports/lib/json-summary/index.js | json-summary format} * coverage summary. Make sure to run your tests separately before running Betterer. * - * @param coverageSummaryPath - relative path to the coverage summary. Defaults to './coverage/coverage-summary.json'. + * @param coverageSummaryPath - relative path to the coverage summary. Defaults to `'./coverage/coverage-summary.json'`. */ export function coverageTotal(coverageSummaryPath?: string): BettererCoverageTest { - return new BettererCoverageTest(testTotal, coverageSummaryPath); + return new BettererCoverageTestΩ(testTotal, coverageSummaryPath); } diff --git a/packages/coverage/src/differ.ts b/packages/coverage/src/differ.ts index 1d1f6ff90..f5cccda80 100644 --- a/packages/coverage/src/differ.ts +++ b/packages/coverage/src/differ.ts @@ -1,46 +1,47 @@ -import type { BettererDiff } from '@betterer/betterer'; -import type { BettererLog, BettererLogs } from '@betterer/logger'; +import type { BettererDiff, BettererRun } from '@betterer/betterer'; +import type { BettererLogger } from '@betterer/logger'; + import type { BettererCoverageDiff, BettererCoverageIssue, BettererCoverageIssues } from './types.js'; -export function differ( +export async function differ( + this: BettererRun, expected: BettererCoverageIssues, result: BettererCoverageIssues -): BettererDiff { - const logs: BettererLogs = []; +): Promise> { const diff: BettererCoverageDiff = { - ...detectNewOrUpdatedFiles(expected, result, logs), - ...detectRemovedFiles(expected, result, logs) + ...(await detectNewOrUpdatedFiles(expected, result, this.logger)), + ...(await detectRemovedFiles(expected, result, this.logger)) }; return { - diff, - logs + diff }; } -function detectNewOrUpdatedFiles( +async function detectNewOrUpdatedFiles( expected: BettererCoverageIssues, result: BettererCoverageIssues, - logs: Array -) { + logger: BettererLogger +): Promise { const diff: BettererCoverageDiff = {}; - Object.keys(result).forEach((filePath) => { - const issue = result[filePath]; - if (expected[filePath]) { - diff[filePath] = diffFileIssue(expected[filePath], issue, logs, filePath); - } else { - logs.push({ debug: `new file: ${filePath}` }); - diff[filePath] = issue; - } - }); + await Promise.all( + Object.entries(result).map(async ([filePath, issue]) => { + if (expected[filePath]) { + diff[filePath] = await diffFileIssue(expected[filePath], issue, filePath, logger); + } else { + await logger.debug(`new file: ${filePath}`); + diff[filePath] = issue; + } + }) + ); return diff; } -function diffFileIssue( +async function diffFileIssue( expected: BettererCoverageIssue, result: BettererCoverageIssue, - logs: Array, - filePath: string -): BettererCoverageIssue { + filePath: string, + logger: BettererLogger +): Promise { const fileDiff: BettererCoverageIssue = { branches: 0, functions: 0, @@ -48,34 +49,40 @@ function diffFileIssue( statements: 0 }; const coverageTypes = Object.keys(fileDiff) as Array; - coverageTypes.forEach((attribute: keyof BettererCoverageIssue) => { - const delta = result[attribute] - expected[attribute]; - if (delta < 0) { - logs.push({ - debug: `"${attribute}" coverage is better in "${filePath}": ${result[attribute]} < ${expected[attribute]}` - }); - } else if (delta > 0) { - logs.push({ - error: `"${attribute}" coverage is worse in "${filePath}": ${result[attribute]} > ${expected[attribute]}` - }); - } - fileDiff[attribute] = delta; - }); + await Promise.all( + coverageTypes.map(async (attribute: keyof BettererCoverageIssue) => { + const resultValue = result[attribute]; + const expectedValue = expected[attribute]; + const delta = resultValue - expectedValue; + if (delta < 0) { + await logger.debug( + `"${attribute}" coverage is better in "${filePath}": ${String(result[attribute])} < ${String(expected[attribute])}` + ); + } else if (delta > 0) { + await logger.error( + `"${attribute}" coverage is worse in "${filePath}": ${String(result[attribute])} > ${String(expected[attribute])}` + ); + } + fileDiff[attribute] = delta; + }) + ); return fileDiff; } -function detectRemovedFiles( +async function detectRemovedFiles( expected: BettererCoverageIssues, result: BettererCoverageIssues, - logs: Array -) { + logger: BettererLogger +): Promise { const diff: BettererCoverageDiff = {}; - Object.keys(expected).forEach((expectedFile) => { - if (!result[expectedFile]) { - logs.push({ debug: `${expectedFile} is gone.` }); - diff[expectedFile] = getNegativeIssue(expected[expectedFile]); - } - }); + await Promise.all( + Object.entries(expected).map(async ([expectedFile, issues]) => { + if (!result[expectedFile]) { + await logger.debug(`${expectedFile} is gone.`); + diff[expectedFile] = getNegativeIssue(issues); + } + }) + ); return diff; } diff --git a/packages/coverage/src/goal.ts b/packages/coverage/src/goal.ts index c7d99dc8b..2530bca53 100644 --- a/packages/coverage/src/goal.ts +++ b/packages/coverage/src/goal.ts @@ -1,8 +1,8 @@ import type { BettererCoverageIssues } from './types.js'; -export function goal(result: BettererCoverageIssues): boolean { - return Object.keys(result).every((filePath) => { - const { lines, statements, functions, branches } = result[filePath]; +export function goal(coverageIssues: BettererCoverageIssues): boolean { + return Object.entries(coverageIssues).every(([, issues]) => { + const { lines, statements, functions, branches } = issues; return lines === 0 && statements === 0 && functions === 0 && branches === 0; }); } diff --git a/packages/coverage/src/index.ts b/packages/coverage/src/index.ts index f9b0111ce..4927ef730 100644 --- a/packages/coverage/src/index.ts +++ b/packages/coverage/src/index.ts @@ -4,6 +4,12 @@ * @packageDocumentation */ +export type { + BettererCoverageTest, + BettererCoverageDiff, + BettererCoverageIssue, + BettererCoverageIssues, + BettererCoverageTypes +} from './types.js'; + export { coverage, coverageTotal } from './coverage.js'; -export type { BettererCoverageTest } from './coverage-test.js'; -export { BettererCoverageDiff, BettererCoverageIssue, BettererCoverageIssues, BettererCoverageTypes } from './types.js'; diff --git a/packages/coverage/src/serialiser.ts b/packages/coverage/src/serialiser.ts deleted file mode 100644 index f95366e1e..000000000 --- a/packages/coverage/src/serialiser.ts +++ /dev/null @@ -1,7 +0,0 @@ -export function deserialise(serialised: T): T { - return serialised; -} - -export function serialise(input: T): T { - return input; -} diff --git a/packages/coverage/src/test.ts b/packages/coverage/src/test.ts index adc3a97d0..eb8b793e2 100644 --- a/packages/coverage/src/test.ts +++ b/packages/coverage/src/test.ts @@ -1,5 +1,3 @@ -import type { BettererRun } from '@betterer/betterer'; - import type { BettererCoverageIssue, BettererCoverageIssues, @@ -8,45 +6,50 @@ import type { IstanbulFileCoverage } from './types.js'; -import { BettererError } from '@betterer/errors'; +import type { BettererFileResolver } from '@betterer/betterer'; +import { BettererError, invariantΔ } from '@betterer/errors'; import { promises as fs } from 'node:fs'; -import minimatch from 'minimatch'; -import path from 'node:path'; - -import { isNumber, normalisedPath } from './utils.js'; export async function test( - run: BettererRun, relativeCoverageSummaryPath: string, - included: Array, - excluded: Array + resolver: BettererFileResolver ): Promise { - const baseDirectory = getTestBaseDirectory(run); - const absoluteCoverageSummaryPath = path.resolve(baseDirectory, relativeCoverageSummaryPath); + const absoluteCoverageSummaryPath = resolver.resolve(relativeCoverageSummaryPath); const summary = await readCoverageSummary(absoluteCoverageSummaryPath); - delete summary.total; + + const absoluteFilePaths = Object.keys(summary).filter((key) => key !== 'total'); + const includedAbsoluteFilePaths = resolver.included(absoluteFilePaths); + const uncovered: BettererCoverageIssues = {}; - Object.keys(summary) - .filter((filePath) => !included.length || included.some((include) => minimatch(filePath, include))) - .filter((filePath) => !excluded.length || !excluded.some((exclude) => exclude.test(filePath))) - .forEach((filePath) => { - const fileCoverage = summary[filePath]; - const relativeFilePath = normalisedPath(path.relative(baseDirectory, filePath)); - uncovered[relativeFilePath] = getUncoveredIssues(fileCoverage); - }); + includedAbsoluteFilePaths.map((filePath) => { + const includedRelativeFilePath = resolver.relative(filePath); + const fileCoverage = summary[filePath]; + invariantΔ(fileCoverage, `\`filePath\` should be a valid key of \`summary\`!`, summary, filePath); + uncovered[includedRelativeFilePath] = getUncoveredIssues(fileCoverage); + }); + return uncovered; } export async function testTotal( - run: BettererRun, - relativeCoverageSummaryPath: string + relativeCoverageSummaryPath: string, + resolver: BettererFileResolver ): Promise { - const baseDirectory = getTestBaseDirectory(run); - const absoluteCoverageSummaryPath = path.resolve(baseDirectory, relativeCoverageSummaryPath); - const { total } = await readCoverageSummary(absoluteCoverageSummaryPath); - return { - total: getUncoveredIssues(total) + const uncovered = await test(relativeCoverageSummaryPath, resolver); + + const total: BettererCoverageIssue = { + lines: 0, + statements: 0, + functions: 0, + branches: 0 }; + Object.values(uncovered).forEach((fileCoverage) => { + total.branches += fileCoverage.branches; + total.functions += fileCoverage.functions; + total.lines += fileCoverage.lines; + total.statements += fileCoverage.statements; + }); + return { total }; } async function readCoverageSummary(coverageSummaryPath: string): Promise { @@ -61,39 +64,37 @@ async function readCoverageSummary(coverageSummaryPath: string): Promise { try { const coverageReport = await fs.readFile(coverageSummaryPath, 'utf-8'); - return decodeCoverageSummary(JSON.parse(coverageReport)); - } catch (e) { + const parsed: unknown = JSON.parse(coverageReport); + return assertIstanbulSummary(parsed) ? parsed : null; + } catch { return null; } } -function decodeCoverageSummary(data: IstanbulCoverageSummary | unknown): IstanbulCoverageSummary | null { - if (isIstanbulSummary(data) && data.total != null) { - return data; - } - return null; -} - -function isIstanbulSummary(data: unknown): data is IstanbulCoverageSummary { - const maybeSummary = data as IstanbulCoverageSummary; - return maybeSummary && Object.keys(maybeSummary).every((key) => isFileCoverage(maybeSummary[key])); +function assertIstanbulSummary(data: unknown): data is IstanbulCoverageSummary { + const maybeIstanbulSummary = data as Partial | null; + return ( + !!maybeIstanbulSummary && + Object.keys(maybeIstanbulSummary).every((key) => isFileCoverage(maybeIstanbulSummary[key])) && + maybeIstanbulSummary.total != null + ); } function isFileCoverage(data: unknown): data is IstanbulFileCoverage { - const maybeCoverage = data as IstanbulFileCoverage; + const maybeFileCoverage = data as Partial | null; return ( - maybeCoverage && - isCoverage(maybeCoverage.branches) && - isCoverage(maybeCoverage.functions) && - isCoverage(maybeCoverage.lines) && - isCoverage(maybeCoverage.statements) + !!maybeFileCoverage && + isCoverage(maybeFileCoverage.branches) && + isCoverage(maybeFileCoverage.functions) && + isCoverage(maybeFileCoverage.lines) && + isCoverage(maybeFileCoverage.statements) ); } function isCoverage(data: unknown): data is IstanbulCoverage { - const maybeData = data as IstanbulCoverage; + const maybeData = data as Partial | null; return ( - maybeData && + !!maybeData && isNumber(maybeData.covered) && isNumber(maybeData.pct) && isNumber(maybeData.skipped) && @@ -101,6 +102,10 @@ function isCoverage(data: unknown): data is IstanbulCoverage { ); } +function isNumber(input: unknown): input is number { + return typeof input === 'number'; +} + function getUncoveredIssues(fileCoverage: IstanbulFileCoverage): BettererCoverageIssue { return { lines: fileCoverage.lines.total - fileCoverage.lines.covered, @@ -109,13 +114,3 @@ function getUncoveredIssues(fileCoverage: IstanbulFileCoverage): BettererCoverag branches: fileCoverage.branches.total - fileCoverage.branches.covered }; } - -function getTestBaseDirectory(run: BettererRun): string { - return path.dirname((run as BettererRunΩ).test.configPath); -} - -type BettererRunΩ = BettererRun & { - test: { - configPath: string; - }; -}; diff --git a/packages/coverage/src/types.ts b/packages/coverage/src/types.ts index c4d2e6381..f8ca576d7 100644 --- a/packages/coverage/src/types.ts +++ b/packages/coverage/src/types.ts @@ -1,41 +1,42 @@ -import type { BettererRun } from '@betterer/betterer'; +import type { BettererFileResolver, BettererResolverTest } from '@betterer/betterer'; import type { CoverageSummaryData, Totals } from 'istanbul-lib-coverage'; export type IstanbulCoverage = Totals; export type IstanbulFileCoverage = CoverageSummaryData; -export type IstanbulCoverageSummary = { - [filePath: string]: IstanbulFileCoverage; -}; +export type IstanbulCoverageSummary = Record; + +/** + * @public A {@link @betterer/betterer#BettererTest | `BettererTest`} to incrementally improve test coverage. + */ +export type BettererCoverageTest = BettererResolverTest< + BettererCoverageIssues, + BettererCoverageIssues, + BettererCoverageDiff +>; export type BettererCoverageTestFunction = ( - run: BettererRun, - coverageReportPath: string, - included: Array, - excluded: Array + relativeCoverageReportPath: string, + resolver: BettererFileResolver ) => Promise; /** - * The different types of coverage which are checked - * @public + * @public The different types of coverage which are checked. */ export type BettererCoverageTypes = 'lines' | 'statements' | 'functions' | 'branches'; /** - * The lines, statements, functions and branches coverage for a file (or the total project) - * @public + * @public The lines, statements, functions and branches coverage for a file (or the total project). + * + * @remarks Each value indicates how many of each type remain uncovered in the file. */ export type BettererCoverageIssue = Record; /** - * The coverage for a project - * @public + * @public The coverage for all the files in a project. */ -export type BettererCoverageIssues = { - [filePath: string]: BettererCoverageIssue; -}; +export type BettererCoverageIssues = Record; /** - * The difference in coverage for a project between two test runs - * @public + * @public The difference in coverage for a project between two test runs. */ export type BettererCoverageDiff = BettererCoverageIssues; diff --git a/packages/coverage/src/utils.ts b/packages/coverage/src/utils.ts deleted file mode 100644 index e989c0006..000000000 --- a/packages/coverage/src/utils.ts +++ /dev/null @@ -1,25 +0,0 @@ -import path from 'node:path'; - -export function flatten(toFlatten: ReadonlyArray>): Array { - const flattened: Array = []; - toFlatten.forEach((t) => { - if (isItem(t)) { - flattened.push(t); - } else { - flattened.push(...t); - } - }); - return flattened; -} - -function isItem(pattern: unknown): pattern is T { - return !Array.isArray(pattern); -} - -export function isNumber(input: unknown): input is number { - return typeof input === 'number'; -} - -export function normalisedPath(filePath: string): string { - return path.sep === path.posix.sep ? filePath : filePath.split(path.sep).join(path.posix.sep); -} diff --git a/packages/docgen/package.json b/packages/docgen/package.json index 821cbb989..e599e8d87 100644 --- a/packages/docgen/package.json +++ b/packages/docgen/package.json @@ -6,6 +6,7 @@ "private": true, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "commonjs", "files": [ "dist" ], @@ -22,11 +23,12 @@ "compile": "tsc -b ." }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { + "@microsoft/api-documenter": "^7.25.12", "dedent": "^0.7.0", - "tslib": "^2.3.1" + "tslib": "^2.7.0" }, "devDependencies": { "@types/dedent": "^0.7.0" diff --git a/packages/docgen/src/index.ts b/packages/docgen/src/index.ts index 3fe8a8c99..568d998e5 100644 --- a/packages/docgen/src/index.ts +++ b/packages/docgen/src/index.ts @@ -25,7 +25,11 @@ class BettererMarkdownDocumenter extends MarkdownDocumenterFeature { }); const id = path.basename(eventArgs.outputFilename, '.md'); - const [, title] = TITLE_REGEXP.exec(eventArgs.pageContent) || []; + const [, title] = TITLE_REGEXP.exec(eventArgs.pageContent) ?? []; + + if (title == null) { + throw new Error(`No title match found in "${eventArgs.pageContent}"`); + } const metadata = dedent(` --- diff --git a/packages/docgen/tsconfig.json b/packages/docgen/tsconfig.json index c58b50913..62d572f6d 100644 --- a/packages/docgen/tsconfig.json +++ b/packages/docgen/tsconfig.json @@ -2,8 +2,9 @@ "extends": "../../tsconfig.json", "compilerOptions": { "outDir": "./dist", - "rootDir": "./src" + "rootDir": "./src", + "module": "CommonJS" }, - "include": ["./src/*.ts"], + "include": ["./src/*.cts", "src/index.ts"], "exclude": ["../node_modules/*", "./node_modules/*", "./dist/*"] } diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 3e6138238..c0c40726d 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/errors + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + +**Note:** Version bump only for package @betterer/errors + + + + + # [5.3.0](https://github.com/phenomnomnominal/betterer/compare/v5.2.4...v5.3.0) (2022-04-13) **Note:** Version bump only for package @betterer/errors diff --git a/packages/errors/LICENSE.md b/packages/errors/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/errors/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/errors/api-extractor.json b/packages/errors/api-extractor.json index 6f708a7f2..6923858f4 100644 --- a/packages/errors/api-extractor.json +++ b/packages/errors/api-extractor.json @@ -1,4 +1,14 @@ { "extends": "../../api-extractor.json", - "mainEntryPointFilePath": "./dist/index.d.ts" + "mainEntryPointFilePath": "./dist/index.d.ts", + + "messages": { + "extractorMessageReporting": { + // We add a suffix Δ instead + "ae-internal-missing-underscore": { + "logLevel": "none", + "addToApiReportFile": false + } + } + } } diff --git a/packages/errors/package.json b/packages/errors/package.json index 5641b41c3..c475bbcda 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/errors", "description": "error handler for @betterer/betterer", - "version": "5.3.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,6 +26,7 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" - } + "node": ">=16" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/errors/src/error.ts b/packages/errors/src/error.ts index 3464e548d..c5f3c7bf4 100644 --- a/packages/errors/src/error.ts +++ b/packages/errors/src/error.ts @@ -13,8 +13,7 @@ export class BettererError extends Error { */ public details: BettererErrorDetails; /** - * Used by {@link @betterer/errors#isBettererError | `isBettererError()`} to detect that an - * object is an instance of `BettererError`. + * Used to detect that an object is an instance of `BettererError`. */ public isBettererError = true; @@ -29,16 +28,18 @@ export class BettererError extends Error { } /** - * @public Check if an object is a {@link BettererError | `BettererError`}. + * @internal This could change at any point! Please don't use! + * + * Check if an object is a {@link BettererError | `BettererError`}. * * @example * ```typescript - * import { BettererError, isBettererError } from '@betterer/errors'; + * import { BettererError, isBettererErrorΔ } from '@betterer/errors'; * - * isBettererError(new Error()); // false - * isBettererError(new BettererError()); // true + * isBettererErrorΔ(new Error()); // false + * isBettererErrorΔ(new BettererError()); // true * ``` */ -export function isBettererError(err: unknown): err is BettererError { - return !!(err as BettererError)?.isBettererError; +export function isBettererErrorΔ(err: unknown): err is BettererError { + return !!err && !!(err as Partial).isBettererError; } diff --git a/packages/errors/src/index.ts b/packages/errors/src/index.ts index bf7a42263..d4826d820 100644 --- a/packages/errors/src/index.ts +++ b/packages/errors/src/index.ts @@ -4,5 +4,7 @@ * @packageDocumentation */ -export { BettererError, isBettererError } from './error.js'; -export { BettererErrorDetail, BettererErrorDetails } from './types.js'; +export type { BettererErrorDetail, BettererErrorDetails } from './types.js'; + +export { BettererError, isBettererErrorΔ } from './error.js'; +export { invariantΔ } from './invariant.js'; diff --git a/packages/errors/src/invariant.ts b/packages/errors/src/invariant.ts new file mode 100644 index 000000000..0174769e6 --- /dev/null +++ b/packages/errors/src/invariant.ts @@ -0,0 +1,29 @@ +import assert from 'node:assert'; + +import { BettererError } from './error.js'; + +/** + * @internal This could change at any point! Please don't use! + * + * A slightly fancier assertion for when we're confident about the truthiness + * of some value. + * + * @remarks Useful for validating indexed access. + * + * @example + * ```typescript + * const [, call] = callsite(); + * invariantΔ(call, `\`call\` should be set!`, call); + * ``` + * + * @param check - Invariant to check. This *should* always be truthy. + * @param message - Information about why we think the `check` should pass. + * @param values - Additional values to assist if the invariant is wrong. + */ +export function invariantΔ(check: unknown, message: `${string}!`, ...values: Array): asserts check { + try { + assert(check); + } catch { + throw new BettererError(`${message} 🤔`, ...values.map((value) => JSON.stringify(value))); + } +} diff --git a/packages/eslint/CHANGELOG.md b/packages/eslint/CHANGELOG.md index 740c051c5..eef24b2c2 100644 --- a/packages/eslint/CHANGELOG.md +++ b/packages/eslint/CHANGELOG.md @@ -3,6 +3,31 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/eslint + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) + + +### Features + +* **betterer ✨:** add more details to file issues ([#1211](https://github.com/phenomnomnominal/betterer/issues/1211)) ([5a53e45](https://github.com/phenomnomnominal/betterer/commit/5a53e45b4d51e643458c21bd911b5500e698a1a8)) +* **betterer ✨:** specify different cache strategies ([#1232](https://github.com/phenomnomnominal/betterer/issues/1232)) ([df77035](https://github.com/phenomnomnominal/betterer/commit/df7703537910c320c0444e26582e8436947ff00d)) + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) **Note:** Version bump only for package @betterer/eslint diff --git a/packages/eslint/LICENSE.md b/packages/eslint/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/eslint/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/eslint/package.json b/packages/eslint/package.json index 3065b4620..2855e1f30 100644 --- a/packages/eslint/package.json +++ b/packages/eslint/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/eslint", "description": "ESLint test for @betterer/betterer", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,17 +26,17 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "tslib": "^2.3.1" + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" }, "peerDependencies": { - "eslint": ">=7.0.0" + "eslint": ">=9.0.0" }, "devDependencies": { - "eslint": ">=7.0.0" - } + "eslint": ">=9.0.0" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/eslint/src/eslint.ts b/packages/eslint/src/eslint.ts index 0611e2c14..fb76dbff0 100644 --- a/packages/eslint/src/eslint.ts +++ b/packages/eslint/src/eslint.ts @@ -1,6 +1,4 @@ -import type { Linter } from 'eslint'; - -import type { BettererESLintRulesConfig } from './types.js'; +import type { BettererESLintConfig } from './types.js'; import { BettererFileTest } from '@betterer/betterer'; import { BettererError } from '@betterer/errors'; @@ -8,14 +6,16 @@ import assert from 'node:assert'; import { ESLint } from 'eslint'; /** - * @public Use this test to incrementally introduce new {@link https://eslint.org/ | **ESLint**} rules to - * your codebase. You can pass as many **ESLint** {@link https://eslint.org/docs/rules/ | rule configurations} - * as you like: + * @public Use this test to incrementally introduce new {@link https://eslint.org/ | **ESLint**} configuration to + * your codebase. + * + * From {@link https://www.npmjs.com/package/@betterer/eslint | `@betterer/eslint@6.0.0``}, this test only works with ESLint's new flat config, so if you are + * using the old configuration format, you'll need to use an older version of `@betterer/eslint`. * * @remarks {@link @betterer/eslint#eslint | `eslint`} is a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, - * so you can use {@link @betterer/betterer#BettererFileTest.include | `include()`}, - * {@link @betterer/betterer#BettererFileTest.exclude | `exclude()`}, {@link @betterer/betterer#BettererFileTest.only | `only()`}, - * and {@link @betterer/betterer#BettererFileTest.skip | `skip()`}. + * so you can use {@link @betterer/betterer#BettererResolverTest.include | `include()`}, + * {@link @betterer/betterer#BettererResolverTest.exclude | `exclude()`}, {@link @betterer/betterer#BettererTest.only | `only()`}, + * and {@link @betterer/betterer#BettererTest.skip | `skip()`}. * * @example * ```typescript @@ -24,67 +24,71 @@ import { ESLint } from 'eslint'; * export default { * 'new eslint rules': () => * eslint({ - * 'no-debugger': 'error', - * 'no-unsafe-finally': 'error', + * rules: { + * 'no-debugger': 'error', + * 'no-unsafe-finally': 'error', + * } * }) * .include('./src/*.ts') * }; * ``` * - * @param rules - Additional {@link https://eslint.org/ | **ESLint**} {@link https://eslint.org/docs/rules/ | rules} + * @param config - Additional {@link https://eslint.org/ | **ESLint**} {@link https://eslint.org/docs/latest/use/configure/configuration-files#configuration-objects | configuration objects} * to enable. * * @throws {@link @betterer/errors#BettererError | `BettererError` } - * Will throw if the user doesn't pass `rules`. + * Will throw if the user doesn't pass `config`. */ -export function eslint(rules: BettererESLintRulesConfig): BettererFileTest { - if (!rules) { +export function eslint(...overrideConfig: BettererESLintConfig): BettererFileTest { + // The `eslint` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `rules?: BettererESLintRulesConfig`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (!overrideConfig?.length) { throw new BettererError( - "for `@betterer/eslint` to work, you need to provide rule options, e.g. `{ 'no-debugger': 'error' }`. ❌" + "for `@betterer/eslint` to work, you need to provide configuration options, e.g. `{ rules: { 'no-debugger': 'error' } }`. ❌" ); } + overrideConfig.forEach((config) => { + if (config.files || config.ignores) { + throw new BettererError( + `Please use \`eslint({ ... }).include()\` or \`eslint({ ... }).exclude()\` to control linting extra files, using paths relative to your test definition file. +This makes it easier to configure exactly which files should be checked! ❌` + ); + } + }); + return new BettererFileTest(async (filePaths, fileTestResult, resolver) => { if (!filePaths.length) { return; } const { baseDirectory } = resolver; - const cli = new ESLint({ cwd: baseDirectory }); - - await Promise.all( - filePaths.map(async (filePath) => { - const linterOptions = (await cli.calculateConfigForFile(filePath)) as Linter.Config; + const runner = new ESLint({ cwd: baseDirectory, overrideConfig }); - // Explicitly disable all other configured rules: - const disabledRules: BettererESLintRulesConfig = {}; - Object.keys(linterOptions.rules || {}).forEach((ruleName) => { - disabledRules[ruleName] = 'off'; - }); - const finalRules = { ...disabledRules, ...rules }; - - const runner = new ESLint({ - overrideConfig: { rules: finalRules }, - useEslintrc: true, - cwd: baseDirectory + const lintResults = await runner.lintFiles([...filePaths]); + lintResults + .filter((lintResult) => lintResult.source) + .forEach((lintResult) => { + const { messages, source, filePath } = lintResult; + assert(source); + const file = fileTestResult.addFile(filePath, source); + messages.forEach((message) => { + const { line, column, ruleId } = message; + const startLine = line - 1; + const startColumn = column - 1; + const endLine = message.endLine ? message.endLine - 1 : 0; + const endColumn = message.endColumn ? message.endColumn - 1 : 0; + file.addIssue(startLine, startColumn, endLine, endColumn, eslintIssueMessage(ruleId, message.message)); }); + }); + }).cache(); +} - const lintResults = await runner.lintFiles([filePath]); - lintResults - .filter((lintResult) => lintResult.source) - .forEach((lintResult) => { - const { messages, source } = lintResult; - assert(source); - const file = fileTestResult.addFile(filePath, source); - messages.forEach((message) => { - const startLine = message.line - 1; - const startColumn = message.column - 1; - const endLine = message.endLine ? message.endLine - 1 : 0; - const endColumn = message.endColumn ? message.endColumn - 1 : 0; - file.addIssue(startLine, startColumn, endLine, endColumn, message.message); - }); - }); - }) - ); - }); +function eslintIssueMessage(ruleId: string | null, message: string) { + let issueMessage = 'eslint'; + issueMessage += ruleId ? `(${ruleId}): ` : ': '; + issueMessage += message; + return issueMessage; } diff --git a/packages/eslint/src/index.ts b/packages/eslint/src/index.ts index 8e4162964..4e6bfcfa3 100644 --- a/packages/eslint/src/index.ts +++ b/packages/eslint/src/index.ts @@ -1,8 +1,12 @@ /** * {@link https://eslint.org/ | ESLint} test for {@link https://github.com/phenomnomnominal/betterer | **Betterer**}. * + * From {@link https://www.npmjs.com/package/@betterer/eslint | `@betterer/eslint@6.0.0``}, this test only works with ESLint's new flat config, so if you are + * using the old configuration format, you'll need to use an older version of `@betterer/eslint`. + * * @packageDocumentation */ +export type { BettererESLintConfig } from './types.js'; + export { eslint } from './eslint.js'; -export { BettererESLintRulesConfig } from './types.js'; diff --git a/packages/eslint/src/types.ts b/packages/eslint/src/types.ts index 6972e307d..7ce69944c 100644 --- a/packages/eslint/src/types.ts +++ b/packages/eslint/src/types.ts @@ -1,10 +1,10 @@ import type { Linter } from 'eslint'; /** - * @public The {@link @betterer/eslint#eslint | `eslint`} test factory takes a map of rule names - * and the rule's configuration. + * @public The {@link @betterer/eslint#eslint | `eslint`} test factory takes any number of new ESLint + * configuration objects. * - * The configuration options are defined by each rule, but will be either a {@link https://eslint.org/docs/user-guide/configuring/rules#configuring-rules | `RuleLevel` } - * or {@link https://eslint.org/docs/user-guide/configuring/rules#configuring-rules | `RuleLevelAndOptions`}. + * The possible configuration options are extensive, but you can find more information + * in the {@link https://eslint.org/docs/latest/use/configure/configuration-files#configuration-objects | **ESLint** docs.} */ -export type BettererESLintRulesConfig = Record; +export type BettererESLintConfig = Array; diff --git a/packages/extension/package.json b/packages/extension/package.json index da858a69e..888f3ba21 100644 --- a/packages/extension/package.json +++ b/packages/extension/package.json @@ -22,7 +22,7 @@ "Linters" ], "activationEvents": [ - "*" + "onStartupFinished" ], "icon": "images/logo.png", "galleryBanner": { @@ -64,24 +64,6 @@ "default": "./.betterer.results", "description": "Path to test results file relative to working directory" }, - "betterer.tsconfigPath": { - "scope": "resource", - "type": "string", - "default": "", - "description": "Path to TypeScript config file relative to working directory" - }, - "betterer.debug": { - "scope": "resource", - "type": "boolean", - "default": false, - "description": "Controls whether Betterer debug logging is enabled or not. You'll need to restart VS Code after you change this!" - }, - "betterer.debugLogPath": { - "scope": "resource", - "type": "string", - "default": "./.betterer-debug.log", - "description": "Path to Betterer debug log output relative to working directory. You'll need to restart VS Code after you change this!" - }, "betterer.filters": { "scope": "resource", "type": "array", @@ -127,17 +109,17 @@ ] }, "scripts": { - "build:extension": "yarn bundle && yarn compile:test", - "bundle": "yarn webpack:client && yarn webpack:server", + "build:extension": "npm run bundle && npm run compile:test", + "bundle": "npm run webpack:client && npm run webpack:server", "compile:test": "tsc --project ./tsconfig.e2e.json", "watch": "run-p webpack:client:watch webpack:server:watch", "webpack:client": "webpack --config webpack.client.config.js", "webpack:client:watch": "webpack --config webpack.client.config.js --watch", "webpack:server": "webpack --config webpack.server.config.js", "webpack:server:watch": "webpack --config webpack.server.config.js --watch", - "package": "vsce package --yarn", + "package": "vsce package --npm", "test:extension": "node ./dist/test/runner/index.js", - "vscode:prepublish": "yarn build:extension" + "vscode:prepublish": "npm run build:extension" }, "dependencies": { "lodash.debounce": "^4.0.8", diff --git a/packages/extension/src/client/commands/disable.ts b/packages/extension/src/client/commands/disable.ts index 1b758291e..31e625c89 100644 --- a/packages/extension/src/client/commands/disable.ts +++ b/packages/extension/src/client/commands/disable.ts @@ -1,7 +1,5 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { WorkspaceFolder } from 'vscode'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { workspace } from 'vscode'; import { EXTENSION_NAME } from '../../constants.js'; diff --git a/packages/extension/src/client/commands/enable.ts b/packages/extension/src/client/commands/enable.ts index 2805c3478..a6b97d8cf 100644 --- a/packages/extension/src/client/commands/enable.ts +++ b/packages/extension/src/client/commands/enable.ts @@ -1,7 +1,5 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { WorkspaceFolder } from 'vscode'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { workspace } from 'vscode'; import { EXTENSION_NAME } from '../../constants.js'; diff --git a/packages/extension/src/client/commands/folder-picker.ts b/packages/extension/src/client/commands/folder-picker.ts index e99bf07fe..bded36eb7 100644 --- a/packages/extension/src/client/commands/folder-picker.ts +++ b/packages/extension/src/client/commands/folder-picker.ts @@ -1,7 +1,5 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { WorkspaceFolder } from 'vscode'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { window } from 'vscode'; export async function pickFolder( diff --git a/packages/extension/src/client/commands/init.ts b/packages/extension/src/client/commands/init.ts index fc7c9512e..fdf8d9f8d 100644 --- a/packages/extension/src/client/commands/init.ts +++ b/packages/extension/src/client/commands/init.ts @@ -1,9 +1,7 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { WorkspaceFolder } from 'vscode'; import fs from 'node:fs'; import path from 'node:path'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { window, workspace } from 'vscode'; import { EXTENSION_NAME } from '../../constants.js'; diff --git a/packages/extension/src/client/error-messages.ts b/packages/extension/src/client/error-messages.ts index 1dad81a6d..bb2562562 100644 --- a/packages/extension/src/client/error-messages.ts +++ b/packages/extension/src/client/error-messages.ts @@ -1,10 +1,9 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { WorkspaceFolder } from 'vscode'; import { EXTENSION_NAME } from '../constants.js'; const NAME = EXTENSION_NAME; -const DEFAULT_CONFIG_FILE = `.betterer.ts`; +const BETTERER_TS = `.betterer.ts`; const COMMAND_REQUIRES_WORKSPACE = `if VS Code is opened on a workspace folder.`; @@ -34,7 +33,7 @@ export const BETTERER_CONFIG_FILE_INVALID = `Failed to load ${NAME} config. ${SE export const BETTERER_CONFIG_FILE_INVALID_DETAILS = (workspaceFolder: WorkspaceFolder): string => { return ` -Invalid ${NAME} configuration file (e.g. ${DEFAULT_CONFIG_FILE}) found for workspace: ${workspaceFolder.name} +Invalid ${NAME} configuration file (e.g. ${BETTERER_TS}) found for workspace: ${workspaceFolder.name} The workspace will not be validated. Consider executing the 'Initialise ${NAME}' command to add ${NAME} to the workspace. ${DISABLE_FOR_WORKSPACE(workspaceFolder)} @@ -57,5 +56,5 @@ ${DISABLE_FOR_WORKSPACE(workspaceFolder)} export const CLIENT_START_FAILED = `The ${NAME} extension couldn't be started. 🔥 ${SEE_OUTPUT_CHANNEL}`; export const SERVER_START_FAILED = `The ${NAME} server couldn't be started. 🔥 ${SEE_OUTPUT_CHANNEL}`; export const SERVER_PROCESS_ENDED = (code: number): string => - `Server process exited with code "${code}". 💥 This usually indicates an invalid ${NAME} configuration.`; + `Server process exited with code "${String(code)}". 💥 This usually indicates an invalid ${NAME} configuration.`; export const SERVER_PROCESS_SHUT_DOWN = `The ${NAME} server shut down itself. 💥 ${SEE_OUTPUT_CHANNEL}`; diff --git a/packages/extension/src/client/extension.ts b/packages/extension/src/client/extension.ts index 5e99b16f8..ce076be35 100644 --- a/packages/extension/src/client/extension.ts +++ b/packages/extension/src/client/extension.ts @@ -1,9 +1,7 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { ExtensionContext } from 'vscode'; import type { ErrorAction, ErrorHandler } from 'vscode-languageclient/node'; import assert from 'node:assert'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { commands } from 'vscode'; import { CloseAction, LanguageClient } from 'vscode-languageclient/node'; import { EXTENSION_NAME } from '../constants.js'; @@ -57,7 +55,9 @@ export async function activate(context: ExtensionContext): Promise { client.onRequest(BettererNoLibraryRequest, (params) => noLibrary(client, context, params)); context.subscriptions.push( - commands.registerCommand(COMMAND_NAMES.showOutputChannel, () => client.outputChannel.show()), + commands.registerCommand(COMMAND_NAMES.showOutputChannel, () => { + client.outputChannel.show(); + }), started, status ); diff --git a/packages/extension/src/client/logger.ts b/packages/extension/src/client/logger.ts index 0e814b7f7..33880b4cf 100644 --- a/packages/extension/src/client/logger.ts +++ b/packages/extension/src/client/logger.ts @@ -1,7 +1,5 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { MessageItem } from 'vscode'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { window } from 'vscode'; export function error(message: string): Thenable { diff --git a/packages/extension/src/client/options.ts b/packages/extension/src/client/options.ts index 17014c088..246a21c7a 100644 --- a/packages/extension/src/client/options.ts +++ b/packages/extension/src/client/options.ts @@ -1,4 +1,3 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { ExtensionContext } from 'vscode'; import type { ErrorHandler, @@ -8,7 +7,6 @@ import type { } from 'vscode-languageclient/node'; import path from 'node:path'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { workspace } from 'vscode'; import { RevealOutputChannelOn, TransportKind } from 'vscode-languageclient/node'; diff --git a/packages/extension/src/client/requests/invalid-config.ts b/packages/extension/src/client/requests/invalid-config.ts index 1f830aab2..87710c88b 100644 --- a/packages/extension/src/client/requests/invalid-config.ts +++ b/packages/extension/src/client/requests/invalid-config.ts @@ -1,9 +1,7 @@ import type { LanguageClient } from 'vscode-languageclient/node'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { ExtensionContext } from 'vscode'; import { RequestType } from 'vscode-languageclient/node'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { Uri, workspace } from 'vscode'; import { diff --git a/packages/extension/src/client/requests/no-library.ts b/packages/extension/src/client/requests/no-library.ts index b6406358a..60911d4b7 100644 --- a/packages/extension/src/client/requests/no-library.ts +++ b/packages/extension/src/client/requests/no-library.ts @@ -1,10 +1,8 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { ExtensionContext } from 'vscode'; import type { LanguageClient } from 'vscode-languageclient/node'; import type { BettererRequestParams } from './types.js'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { Uri, workspace } from 'vscode'; import { RequestType } from 'vscode-languageclient/node'; diff --git a/packages/extension/src/client/requests/state.ts b/packages/extension/src/client/requests/state.ts index 9ee161c2d..7631a6e5a 100644 --- a/packages/extension/src/client/requests/state.ts +++ b/packages/extension/src/client/requests/state.ts @@ -1,7 +1,5 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { ExtensionContext, Uri } from 'vscode'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { workspace } from 'vscode'; const NO_LIBRARY_STATE_KEY = 'noLibraryMessageAlreadyShown'; @@ -26,6 +24,6 @@ function getState(key: string) { const result = workspaces[workspaceUri]; workspaces[workspaceUri] = true; void context.globalState.update(key, { workspaces }); - return result; + return !!result; }; } diff --git a/packages/extension/src/client/settings.ts b/packages/extension/src/client/settings.ts index 86c206030..421dfab1e 100644 --- a/packages/extension/src/client/settings.ts +++ b/packages/extension/src/client/settings.ts @@ -1,7 +1,5 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { Uri, WorkspaceConfiguration } from 'vscode'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { workspace } from 'vscode'; export function getAlwaysShowStatus(): boolean { diff --git a/packages/extension/src/client/status.ts b/packages/extension/src/client/status.ts index f4bfba5cd..5abfd912f 100644 --- a/packages/extension/src/client/status.ts +++ b/packages/extension/src/client/status.ts @@ -1,8 +1,6 @@ -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { StatusBarItem } from 'vscode'; import type { LanguageClient } from 'vscode-languageclient/node'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import { StatusBarAlignment, window } from 'vscode'; import { NotificationType, State } from 'vscode-languageclient/node'; import { EXTENSION_NAME } from '../constants.js'; @@ -71,7 +69,9 @@ export class BettererStatusBar { await client.onReady(); - client.onNotification(BettererStatusNotification, (status) => this.update(status)); + client.onNotification(BettererStatusNotification, (status) => { + this.update(status); + }); client.onNotification(BettererExitCalled, (params) => { this._exit(); const [code, message] = params; diff --git a/packages/extension/src/server/betterer.ts b/packages/extension/src/server/betterer.ts index 5959aeeb1..3d4a19408 100644 --- a/packages/extension/src/server/betterer.ts +++ b/packages/extension/src/server/betterer.ts @@ -18,13 +18,14 @@ export async function hasBetterer(cwd: string): Promise { return !!libraryPath; } -export async function getRunner(config: BettererOptionsRunner): Promise { - const key = JSON.stringify(config); - if (RUNNERS.has(key)) { - return RUNNERS.get(key) as BettererRunner; +export async function getRunner(cwd: string, options: BettererOptionsRunner): Promise { + const key = JSON.stringify(options); + const existingRunner = RUNNERS.get(key); + if (existingRunner) { + return existingRunner; } - const { runner } = await getLibrary(config.cwd as string); - const toCache = await runner(config); + const { runner } = await getLibrary(cwd); + const toCache = await runner(options); RUNNERS.set(key, toCache); return toCache; } @@ -34,8 +35,9 @@ async function getLibraryPath(cwd: string): Promise { } async function getLibrary(cwd: string): Promise { - if (PATH_TO_LIB.has(cwd)) { - return PATH_TO_LIB.get(cwd) as BettererLibrary; + const existingLibrary = PATH_TO_LIB.get(cwd); + if (existingLibrary) { + return existingLibrary; } const libraryPath = await getLibraryPath(cwd); const r = nodeRequire(); diff --git a/packages/extension/src/server/config.ts b/packages/extension/src/server/config.ts index d052880f2..2af7c289b 100644 --- a/packages/extension/src/server/config.ts +++ b/packages/extension/src/server/config.ts @@ -1,7 +1,6 @@ import type { BettererOptionsRunner } from '@betterer/betterer'; import type { RemoteWorkspace } from 'vscode-languageserver/node'; -import { promises as fs } from 'node:fs'; import path from 'node:path'; interface BettererExtensionConfig { @@ -10,9 +9,6 @@ interface BettererExtensionConfig { enable: boolean; filters: Array; resultsPath: string; - tsconfigPath: string; - debug: boolean; - debugLogPath: string; } export async function getEnabled(workspace: RemoteWorkspace): Promise { @@ -20,38 +16,16 @@ export async function getEnabled(workspace: RemoteWorkspace): Promise { return !!enable; } -export async function getDebug(workspace: RemoteWorkspace): Promise { - const { debug, debugLogPath } = await getExtensionConfig(workspace); - const value = debug ? '1' : ''; - process.env.BETTERER_DEBUG = value; - process.env.BETTERER_DEBUG_TIME = value; - process.env.BETTERER_DEBUG_VALUES = value; - if (debug && debugLogPath) { - process.env.BETTERER_DEBUG_LOG = debugLogPath; - } -} - export async function getBettererOptions(cwd: string, workspace: RemoteWorkspace): Promise { - const { cachePath, configPath, filters, resultsPath, tsconfigPath } = await getExtensionConfig(workspace); - const config: BettererOptionsRunner = { + const { cachePath, configPath, filters, resultsPath } = await getExtensionConfig(workspace); + return { cache: true, cachePath: path.resolve(cwd, cachePath), configPaths: [path.resolve(cwd, configPath)], - cwd, filters, resultsPath: path.resolve(cwd, resultsPath), silent: true }; - if (tsconfigPath !== '') { - try { - const absoluteTSConfigPath = path.resolve(cwd, tsconfigPath); - await fs.readFile(absoluteTSConfigPath); - config.tsconfigPath = absoluteTSConfigPath; - } catch { - // Cannot read `tsconfigPath` - } - } - return config; } function getExtensionConfig(workspace: RemoteWorkspace): Promise { diff --git a/packages/extension/src/server/diagnostics.ts b/packages/extension/src/server/diagnostics.ts index 54adba688..b1d0ec2b8 100644 --- a/packages/extension/src/server/diagnostics.ts +++ b/packages/extension/src/server/diagnostics.ts @@ -17,10 +17,10 @@ import { EXTENSION_NAME } from '../constants.js'; import { info } from './console.js'; import { getFilePath } from './path.js'; -type BettererFileDiagnostics = Record>; +type BettererFileDiagnostics = Record | null>; export class BettererDiagnostics { - private _diagnosticsMap: Record = {}; + private _diagnosticsMap: Record = {}; public getDiagnostics( config: BettererConfig, @@ -39,7 +39,7 @@ export class BettererDiagnostics { return currentFileDiagnostics; } - const result = runSummary.result?.value as BettererFileTestResultSerialised; + const result = runSummary.result?.value as BettererFileTestResultSerialised | null; if (!result) { return currentFileDiagnostics; } @@ -70,12 +70,12 @@ export class BettererDiagnostics { } else { const fileDiff = (runSummary.diff as unknown as BettererFileTestDiff).diff[filePath]; info(`Validator: "${runSummary.name}" got diff from Betterer for "${filePath}"`); - existingIssues = fileDiff.existing || []; - newIssues = fileDiff.new || []; + existingIssues = fileDiff?.existing ?? []; + newIssues = fileDiff?.new ?? []; } - info(`Validator: "${runSummary.name}" got "${existingIssues.length}" existing issues for "${filePath}"`); - info(`Validator: "${runSummary.name}" got "${newIssues.length}" new issues for "${filePath}"`); + info(`Validator: "${runSummary.name}" got "${String(existingIssues.length)}" existing issues for "${filePath}"`); + info(`Validator: "${runSummary.name}" got "${String(newIssues.length)}" new issues for "${filePath}"`); const diagnostics: Array = []; existingIssues.forEach((issue) => { @@ -90,10 +90,10 @@ export class BettererDiagnostics { public prepare(suite: BettererSuite): void { Object.keys(this._diagnosticsMap).forEach((filePath) => { - const fileDiagnostics = this._diagnosticsMap[filePath] || {}; + const fileDiagnostics = this._diagnosticsMap[filePath] ?? {}; const updatedDiagnostics: BettererFileDiagnostics = {}; suite.runs.forEach((run) => { - updatedDiagnostics[run.name] = fileDiagnostics[run.name] || []; + updatedDiagnostics[run.name] = fileDiagnostics[run.name] ?? []; }); this._diagnosticsMap[filePath] = updatedDiagnostics; }); @@ -104,29 +104,30 @@ export class BettererDiagnostics { testName: string, diagnostics: Array ): Array { - this._diagnosticsMap[filePath] = this._diagnosticsMap[filePath] || {}; + this._diagnosticsMap[filePath] = this._diagnosticsMap[filePath] ?? {}; const fileDiagnostics = this._diagnosticsMap[filePath]; fileDiagnostics[testName] = diagnostics; return this._getAllDiagnosticsForFile(filePath); } private _resetDiagnosticsForFile(filePath: string, testName: string): void { - const fileDiagnostics = this._diagnosticsMap[filePath] || {}; + const fileDiagnostics = this._diagnosticsMap[filePath] ?? {}; fileDiagnostics[testName] = []; this._diagnosticsMap[filePath] = fileDiagnostics; } private _getAllDiagnosticsForFile(filePath: string): Array { - const fileDiagnostics = this._diagnosticsMap[filePath] || {}; - return Object.keys(fileDiagnostics).flatMap((testName) => fileDiagnostics[testName]); + const fileDiagnostics = this._diagnosticsMap[filePath] ?? {}; + return Object.keys(fileDiagnostics).flatMap((testName) => fileDiagnostics[testName] ?? []); } private _getFileIssues(result: BettererFileTestResultSerialised, filePath: string): BettererFileIssuesSerialised { - const key = Object.keys(result).find((fileKey) => fileKey.startsWith(filePath)); - if (!key) { + const entry = Object.entries(result).find(([fileKey]) => fileKey.startsWith(filePath)); + if (!entry) { return []; } - return result[key]; + const [, issues] = entry; + return issues; } } @@ -147,7 +148,7 @@ function createDiagnostic( // so if the issue contains CRLF endings, increment the length by 1 for each new line: let text = document.getText({ start, end }); while (text.replace(/\r\n/g, '\n').length < length) { - const crlfs = text.match(/\r\n/g) || []; + const crlfs = text.match(/\r\n/g) ?? []; end = document.positionAt(document.offsetAt(start) + length + crlfs.length); text = document.getText({ start, end }); } diff --git a/packages/extension/src/server/error-handler.ts b/packages/extension/src/server/error-handler.ts index 584e4f83b..809ca7568 100644 --- a/packages/extension/src/server/error-handler.ts +++ b/packages/extension/src/server/error-handler.ts @@ -7,14 +7,14 @@ import { isString } from '../utils.js'; const BettererExitCalled = new NotificationType<[number, string]>('betterer/exitCalled'); export function createErrorHandler(connection: Connection): void { - const nodeExit = process.exit; + const nodeExit = process.exit.bind(process); process.exit = ((code?: number): void => { const stack = new Error('stack'); - connection.sendNotification(BettererExitCalled, [code || 0, stack.stack]); + connection.sendNotification(BettererExitCalled, [code ?? 0, stack.stack]); setTimeout(() => nodeExit(code), 1000); }) as typeof process.exit; - process.on('uncaughtException', (error: Error) => { + process.on('uncaughtException', (error: Error | null) => { try { let message: string | null = null; if (error) { @@ -38,7 +38,7 @@ export function createErrorHandler(connection: Connection): void { } /* eslint-enable no-console */ } catch { - // Error handle died, uh oh. + // Error handler died, uh oh. } }); } diff --git a/packages/extension/src/server/server.ts b/packages/extension/src/server/server.ts index 07a592a9e..971526cfe 100644 --- a/packages/extension/src/server/server.ts +++ b/packages/extension/src/server/server.ts @@ -52,7 +52,9 @@ function init(): void { const environmentChanged = debounce(function environmentChanged(): void { info('Server: Environment changed, revalidating all documents:'); - documents.all().forEach((document) => queueValidate({ document })); + documents.all().forEach((document) => { + queueValidate({ document }); + }); }, ENVIRONMENT_CHANGE_TIMEOUT); connection.onInitialize(() => { diff --git a/packages/extension/src/server/validator.ts b/packages/extension/src/server/validator.ts index 3856d5947..8413522cf 100644 --- a/packages/extension/src/server/validator.ts +++ b/packages/extension/src/server/validator.ts @@ -11,7 +11,7 @@ import type { TextDocument } from 'vscode-languageserver-textdocument'; import { BettererStatus } from '../status.js'; import { getRunner, hasBetterer } from './betterer.js'; -import { getBettererOptions, getDebug, getEnabled } from './config.js'; +import { getBettererOptions, getEnabled } from './config.js'; import { error, info } from './console.js'; import { BettererInvalidConfigRequest, BettererNoLibraryRequest, isNoConfigError } from './requests/index.js'; import { BettererStatusNotification } from './status.js'; @@ -21,13 +21,14 @@ import { getFilePath } from './path.js'; export class BettererValidator { private _diagnostics = new BettererDiagnostics(); - constructor(private _connection: Connection, private _documents: TextDocuments) {} + constructor( + private _connection: Connection, + private _documents: TextDocuments + ) {} public async validate(documents: Array): Promise { const { workspace } = this._connection; - await getDebug(workspace); - const folders = await workspace.getWorkspaceFolders(); if (!folders) { return; @@ -97,12 +98,14 @@ export class BettererValidator { .filter(Boolean) as Array; const finalDocuments = validDocuments.filter((document) => { - const filePath = getFilePath(document) as string; + const filePath = getFilePath(document); + if (!filePath) { + return false; + } const isCachePath = filePath === options.cachePath; const isResultPath = filePath === options.resultsPath; const isConfigPath = !!options.configPaths?.includes(filePath); - const isTSConfigPath = filePath === options.tsconfigPath; - return !(isCachePath || isResultPath || isConfigPath || isTSConfigPath); + return !(isCachePath || isResultPath || isConfigPath); }); const filePaths = finalDocuments.map((document) => getFilePath(document)) as Array; @@ -111,9 +114,9 @@ export class BettererValidator { info(`Validator: Running Betterer in "${cwd}".`); info(`Validator: Running Betterer on "${JSON.stringify(filePaths)}."`); - const runner = await getRunner(options); + const runner = await getRunner(cwd, options); let config: BettererConfig; - runner.options({ + await runner.options({ reporters: [ { contextError: (_, e: BettererError): void => { @@ -179,9 +182,10 @@ function load(connection: Connection): () => Promise { }, LOADING_DELAY_TIME); return async (): Promise => { if (isLoading) { - return await new Promise((resolve) => { + await new Promise((resolve) => { setTimeout(resolve, MINIMUM_LOADING_TIME); }); + return; } clearTimeout(loading); }; diff --git a/packages/extension/test/runner/environment.ts b/packages/extension/test/runner/environment.ts index caeb39fab..bad831694 100644 --- a/packages/extension/test/runner/environment.ts +++ b/packages/extension/test/runner/environment.ts @@ -1,8 +1,7 @@ import NodeEnvironment from 'jest-environment-node'; -import type { VSCodeJestGlobal } from './vscode'; +import type { VSCodeJestGlobal } from './vscode.js'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import vscode from 'vscode'; export default class VsCodeEnvironment extends NodeEnvironment { diff --git a/packages/extension/test/runner/fixture.ts b/packages/extension/test/runner/fixture.ts index e95222c77..cb6aae98f 100644 --- a/packages/extension/test/runner/fixture.ts +++ b/packages/extension/test/runner/fixture.ts @@ -3,11 +3,11 @@ import type { FixtureFileSystemFiles, Fixture } from '@betterer/fixture'; import { createFixtureDirectoryΔ } from '@betterer/fixture'; import assert from 'node:assert'; -import { vscode } from './vscode'; +import { vscode } from './vscode.js'; export async function createFixture(fixtureName: string, files: FixtureFileSystemFiles): Promise { const { workspaceFolders } = vscode.workspace; - const [root] = workspaceFolders || []; + const [root] = workspaceFolders ?? []; assert.ok(root); const create = await createFixtureDirectoryΔ(root.uri.fsPath); diff --git a/packages/extension/test/runner/index.ts b/packages/extension/test/runner/index.ts index 7ff09992b..26aaf70b7 100644 --- a/packages/extension/test/runner/index.ts +++ b/packages/extension/test/runner/index.ts @@ -15,7 +15,7 @@ async function main() { } catch (e) { process.stderr.write((e as Error).name || ''); process.stderr.write((e as Error).message || ''); - process.stderr.write((e as Error).stack || ''); + process.stderr.write((e as Error).stack ?? ''); process.exitCode = 1; } @@ -28,5 +28,5 @@ async function main() { void main(); -export { vscode } from './vscode'; -export { createFixture } from './fixture'; +export { vscode } from './vscode.js'; +export { createFixture } from './fixture.js'; diff --git a/packages/extension/test/runner/vscode.ts b/packages/extension/test/runner/vscode.ts index 85c53c5d5..b8ae6cf97 100644 --- a/packages/extension/test/runner/vscode.ts +++ b/packages/extension/test/runner/vscode.ts @@ -1,6 +1,5 @@ import type { Global } from '@jest/types'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type * as vscodeNamespace from 'vscode'; export type VSCodeJestGlobal = typeof Global & { diff --git a/packages/extension/test/test.e2e-spec.ts b/packages/extension/test/test.e2e-spec.ts index efc6ee3bf..784c693a4 100644 --- a/packages/extension/test/test.e2e-spec.ts +++ b/packages/extension/test/test.e2e-spec.ts @@ -1,10 +1,9 @@ import type { BettererPackageJSON } from '@betterer/cli'; -// eslint-disable-next-line import/no-unresolved -- vscode is an implicit dependency for extensions import type { Diagnostic, Uri } from 'vscode'; import assert from 'node:assert'; -import { vscode, createFixture } from './runner'; +import { vscode, createFixture } from './runner/index.js'; describe('Betterer VSCode Extension', () => { jest.setTimeout(600000); @@ -22,7 +21,7 @@ describe('Betterer VSCode Extension', () => { const packageJSON = await waitFor(() => readFile('package.json')); const pack = JSON.parse(packageJSON) as BettererPackageJSON; expect(pack.devDependencies['@betterer/cli']).toBeDefined(); - expect(pack.scripts['betterer']).toBe('betterer'); + expect(pack.scripts.betterer).toBe('betterer'); const bettererConfig = await readFile('.betterer.ts'); expect(bettererConfig).not.toBe(null); @@ -35,15 +34,15 @@ describe('Betterer VSCode Extension', () => { { const { cleanup, resolve } = await createFixture('e2e-eslint', { - '.betterer.js': ` + '.betterer.ts': ` const { eslint } = require('../../node_modules/@betterer/eslint'); module.exports = { 'e2e-eslint': () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') }; `, - '.eslintrc.js': ` - const path = require('path'); + '.eslintrc.cjs': ` + const path = require('node:path'); module.exports = { parser: '@typescript-eslint/parser', @@ -84,7 +83,6 @@ describe('Betterer VSCode Extension', () => { const cachePath = resolve('./.betterer.cache'); const configPath = resolve('./.betterer.js'); const resultsPath = resolve('./.betterer.results'); - const tsconfigPath = resolve('./tsconfig.json'); const indexUri = vscode.Uri.file(indexPath); @@ -92,7 +90,6 @@ describe('Betterer VSCode Extension', () => { await config.update('resultsPath', resultsPath); await config.update('cachePath', cachePath); await config.update('configPath', configPath); - await config.update('tsconfigPath', tsconfigPath); await writeToFile(indexUri, 'debugger;'); @@ -114,7 +111,7 @@ import { typescript } from '@betterer/typescript'; import { persist } from '@betterer/fixture'; import { smaller } from '@betterer/constraints'; -const shrinks = persist(__dirname, 'shrinks', 2); +const shrinks = persist(import.meta.url, 'shrinks', 2); export default { 'e2e-typescript': () => typescript('./tsconfig.json', { @@ -130,13 +127,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } `, 'src/index.ts': '' @@ -146,7 +143,6 @@ export default { const cachePath = resolve('./.betterer.cache'); const configPath = resolve('./.betterer.ts'); const resultsPath = resolve('./.betterer.results'); - const tsconfigPath = resolve('./tsconfig.json'); const indexUri = vscode.Uri.file(indexPath); @@ -154,7 +150,6 @@ export default { await config.update('resultsPath', resultsPath); await config.update('cachePath', cachePath); await config.update('configPath', configPath); - await config.update('tsconfigPath', tsconfigPath); await writeToFile( indexUri, diff --git a/packages/extension/webpack.client.config.js b/packages/extension/webpack.client.config.js index 3a291eceb..5c16442c9 100644 --- a/packages/extension/webpack.client.config.js +++ b/packages/extension/webpack.client.config.js @@ -1,4 +1,4 @@ -const path = require('path'); +const path = require('node:path'); const nodeExternals = require('webpack-node-externals'); module.exports = { diff --git a/packages/extension/webpack.server.config.js b/packages/extension/webpack.server.config.js index 3d5282306..2e380f44e 100644 --- a/packages/extension/webpack.server.config.js +++ b/packages/extension/webpack.server.config.js @@ -1,4 +1,4 @@ -const path = require('path'); +const path = require('node:path'); const nodeExternals = require('webpack-node-externals'); module.exports = { diff --git a/packages/fixture/package.json b/packages/fixture/package.json index 03a73da52..048602f45 100644 --- a/packages/fixture/package.json +++ b/packages/fixture/package.json @@ -6,6 +6,7 @@ "private": true, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -22,17 +23,13 @@ "compile": "tsc -b ." }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "ansi-regex": "^5.0.0", - "fs-extra": "^10.0.0", - "graceful-fs": "^4.2.8" + "@betterer/betterer": "^6.0.0-alpha.0", + "ansi-regex": "^5.0.0" }, "devDependencies": { - "@types/fs-extra": "^9.0.1", - "@types/graceful-fs": "^4.1.3" + "core-js": "^3.38.1" } -} +} \ No newline at end of file diff --git a/packages/fixture/src/fixture.ts b/packages/fixture/src/fixture.ts index 70678d228..5dfb2bd0d 100644 --- a/packages/fixture/src/fixture.ts +++ b/packages/fixture/src/fixture.ts @@ -2,11 +2,12 @@ import type { BettererRunSummaries, BettererTestNames } from '@betterer/betterer import type { Fixture, FixtureFactory, FixtureFileSystemFiles, FixtureOptions } from './types.js'; -import { promises as fs } from 'graceful-fs'; +import { promises as fs } from 'node:fs'; import path from 'node:path'; import { createFixtureFS } from './fs.js'; import { createFixtureLogs } from './logging.js'; +import { createFixtureStdout } from './stdout.js'; /** @internal Definitely not stable! Please don't use! */ export async function createFixtureDirectoryΔ(fixturesPath: string): Promise { @@ -24,19 +25,21 @@ export async function createFixtureDirectoryΔ(fixturesPath: string): Promise setTimeout(resolve, 500)); return { ...fixtureFS, - logs: fixtureLogs, + ...fixtureStdout, + ...fixtureLogs, testNames }; }; } -export function testNames(runs: BettererRunSummaries): BettererTestNames { +function testNames(runs: BettererRunSummaries): BettererTestNames { return runs.map((run) => run.name); } diff --git a/packages/fixture/src/fs.ts b/packages/fixture/src/fs.ts index 0890db91b..92be91f5c 100644 --- a/packages/fixture/src/fs.ts +++ b/packages/fixture/src/fs.ts @@ -1,11 +1,10 @@ import type { FixtureFileSystem, FixtureFileSystemFiles, Paths } from './types.js'; -import { ensureDir, ensureFile, remove } from 'fs-extra'; -import { promises as fs } from 'graceful-fs'; +import { promises as fs } from 'node:fs'; import path from 'node:path'; const DEFAULT_CACHE_PATH = './.betterer.cache'; -const DEFAULT_CONFIG_PATH = './.betterer'; +const DEFAULT_CONFIG_PATH = './.betterer.ts'; const DEFAULT_RESULTS_PATH = `./.betterer.results`; export async function createFixtureFS( @@ -17,31 +16,35 @@ export async function createFixtureFS( } function normalisedPath(filePath: string): string { - return path.sep === path.posix.sep ? filePath : filePath.split(path.sep).join(path.posix.sep); + return filePath.split(path.sep).join(path.posix.sep); } async function cleanup(): Promise { - await remove(fixturePath); + await rimraf(fixturePath); } async function writeFile(filePath: string, text: string): Promise { const fullPath = resolve(filePath); - await ensureFile(fullPath); - return await fs.writeFile(fullPath, text.trim(), 'utf8'); + await ensureDir(path.dirname(fullPath)); + await fs.writeFile(fullPath, text.trim(), 'utf8'); } async function deleteDirectory(directoryPath: string): Promise { - return await remove(directoryPath); + await rimraf(directoryPath); } async function deleteFile(filePath: string): Promise { - return await fs.unlink(resolve(filePath)); + await fs.unlink(resolve(filePath)); } function readFile(filePath: string): Promise { return fs.readFile(resolve(filePath), 'utf8'); } + function rimraf(directoryPath: string): Promise { + return fs.rm(directoryPath, { recursive: true, force: true }); + } + const paths: Paths = { cache: resolve(DEFAULT_CACHE_PATH), config: resolve(DEFAULT_CONFIG_PATH), @@ -55,12 +58,24 @@ export async function createFixtureFS( // Move on... } - await ensureDir(fixturePath); + try { + await ensureDir(fixturePath); + } catch { + // Move on... + } + await Promise.all( Object.keys(files).map(async (itemPath) => { - await writeFile(itemPath, files[itemPath]); + const contents = files[itemPath]; + if (contents != null) { + await writeFile(itemPath, contents); + } }) ); return { paths, deleteDirectory, deleteFile, resolve, cleanup, readFile, writeFile }; } + +async function ensureDir(directoryPath: string): Promise { + await fs.mkdir(directoryPath, { recursive: true }); +} diff --git a/packages/fixture/src/index.ts b/packages/fixture/src/index.ts index 1b9ca5dce..9ff08bacd 100644 --- a/packages/fixture/src/index.ts +++ b/packages/fixture/src/index.ts @@ -1,6 +1,19 @@ -export { createFixtureDirectoryΔ } from './fixture.js'; -export { Fixture, FixtureFactory, FixtureFileSystem, FixtureFileSystemFiles, FixtureOptions, Paths } from './types.js'; +// Disable Ink/React DevTools in test: +if (process.env.NODE_ENV === 'test') { + process.env.DEV = 'false'; +} +import './polyfills.js'; import './stubs.js'; +export type { + Fixture, + FixtureFactory, + FixtureFileSystem, + FixtureFileSystemFiles, + FixtureOptions, + Paths +} from './types.js'; + +export { createFixtureDirectoryΔ } from './fixture.js'; export { persist } from './persist.js'; diff --git a/packages/fixture/src/logging.ts b/packages/fixture/src/logging.ts index 001a58540..1658fd633 100644 --- a/packages/fixture/src/logging.ts +++ b/packages/fixture/src/logging.ts @@ -1,26 +1,22 @@ -import type { FixtureLogs, FixtureLogsMap, FixtureOptions } from './types.js'; +import type { FixtureLogging, FixtureLogsMap, FixtureOptions } from './types.js'; -import { getStdOut } from '@betterer/render'; +import { getStdOutΔ } from '@betterer/render'; import ansiRegex from 'ansi-regex'; import path from 'node:path'; const ANSI_REGEX = ansiRegex(); -const PROJECT_REGEXP = new RegExp(normalisePaths(process.cwd()), 'g'); const STACK_TRACK_LINE_REGEXP = /^\s+at\s+/; const FIXTURE_LOGS_MAP: FixtureLogsMap = {}; -export function createFixtureLogs(options: FixtureOptions = {}): FixtureLogs { +export function createFixtureLogs(fixtureName: string, options: FixtureOptions = {}): FixtureLogging { const fixtureLogs: Array = []; - FIXTURE_LOGS_MAP[expect.getState().currentTestName] = fixtureLogs; - - const log = (...messages: Array): void => { - const currentFixtureLogs = FIXTURE_LOGS_MAP[expect.getState().currentTestName]; + FIXTURE_LOGS_MAP[fixtureName] = (...messages: Array): void => { // Do some magic to sort out the logs for snapshots. This mucks up the snapshot of the printed logo, // but that hardly matters... messages.forEach((message) => { if (!isString(message)) { - currentFixtureLogs.push(message); + fixtureLogs.push(message); return; } message = replaceAnsi(message); @@ -29,38 +25,32 @@ export function createFixtureLogs(options: FixtureOptions = {}): FixtureLogs { } const lines = message.replace(/\r/g, '').split('\n'); const filteredLines = lines.filter((line) => !isStackTraceLine(line)); - const formattedLines = filteredLines.map((line) => { - line = replaceProjectPath(normalisePaths(line)); - line = line.trimEnd(); - return line; - }); + const formattedLines = filteredLines.map((line) => line.trimEnd()).map((line) => normaliseSlashes(line)); message = formattedLines.join('\n'); const trimmed = message.trim(); if (trimmed.length === 0) { return; } - const [previous] = currentFixtureLogs.slice(-1); + const [previous] = fixtureLogs.slice(-1); if (message !== previous) { - currentFixtureLogs.push(message); + fixtureLogs.push(message); } }); }; - const stdout = getStdOut(); - try { - jest.spyOn(stdout, 'write').mockImplementation((message: string | Uint8Array): boolean => { - if (message) { - log(message.toString()); - } - return true; - }); - } catch { - // Cannot wrap stdout.write - } + const stdout = getStdOutΔ(); + stdout.write = (message: string | Uint8Array): boolean => { + if (message) { + FIXTURE_LOGS_MAP[fixtureName]?.(message.toString()); + } + return true; + }; stdout.columns = 1000; stdout.rows = 20; - return fixtureLogs as FixtureLogs; + return { + logs: fixtureLogs + }; } function isString(message: unknown): message is string { @@ -76,14 +66,12 @@ function isStackTraceLine(str: string): boolean { } function isFiltered(str: string, options: FixtureOptions): boolean { - const filters = options.logFilters || []; + const filters = options.logFilters ?? []; return filters.some((filter) => !!filter.exec(str)); } -function replaceProjectPath(str: string): string { - return str.replace(PROJECT_REGEXP, ''); -} - -function normalisePaths(str: string): string { - return str.split(path.win32.sep).join(path.posix.sep); +// If a log contains *any* \ characters, swap it with /, regardless of OS. +// This has some false negative, but it just makes it easier. +function normaliseSlashes(line: string): string { + return line.split(path.win32.sep).join(path.posix.sep); } diff --git a/packages/fixture/src/persist.ts b/packages/fixture/src/persist.ts index 5f94d9481..41acdb52a 100644 --- a/packages/fixture/src/persist.ts +++ b/packages/fixture/src/persist.ts @@ -1,12 +1,12 @@ -import path from 'node:path'; +import type { FixturePersist } from './types.js'; + import { promises as fs } from 'node:fs'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; -export interface FixturePersist { - increment(): Promise; - decrement(): Promise; -} +export function persist(fixtureMetaUrl: string, name: string, start: number): FixturePersist { + const fixtureDir = path.dirname(fileURLToPath(fixtureMetaUrl)); -export function persist(fixtureDir: string, name: string, start: number): FixturePersist { const persistPath = path.join(fixtureDir, `persist.${name}.json`); async function read(): Promise { @@ -33,6 +33,10 @@ export function persist(fixtureDir: string, name: string, start: number): Fixtur const result = val - 1; await write(result); return result; + }, + async reset(): Promise { + await write(start); + return start; } }; } diff --git a/packages/fixture/src/polyfills.ts b/packages/fixture/src/polyfills.ts new file mode 100644 index 000000000..43dff95e5 --- /dev/null +++ b/packages/fixture/src/polyfills.ts @@ -0,0 +1,7 @@ +// Let's see if we can keep our tests running on old version of node.js 😅 + +// `structuredClone` is needed by ESLint and doesn't exist in node.js v16: +import 'core-js/actual/structured-clone.js'; + +// `Promise.withResolvers` is only a proposal but it's super useful: +import 'core-js/proposals/promise-with-resolvers.js'; diff --git a/packages/fixture/src/stdout.ts b/packages/fixture/src/stdout.ts new file mode 100644 index 000000000..0410ff819 --- /dev/null +++ b/packages/fixture/src/stdout.ts @@ -0,0 +1,13 @@ +import { getStdInΔ } from '@betterer/render'; + +export function createFixtureStdout() { + async function sendKeys(keys: string): Promise { + getStdInΔ().emit('data', keys); + + await new Promise((resolve) => setTimeout(resolve, 1000)); + } + + return { + sendKeys + }; +} diff --git a/packages/fixture/src/types.ts b/packages/fixture/src/types.ts index d4460cfe0..9b2c81ee9 100644 --- a/packages/fixture/src/types.ts +++ b/packages/fixture/src/types.ts @@ -10,26 +10,36 @@ export interface Paths { export interface FixtureFileSystem { paths: Paths; - deleteDirectory(filePath: string): Promise; - deleteFile(filePath: string): Promise; - readFile(filePath: string): Promise; - resolve(filePath: string): string; - writeFile(filePath: string, text: string): Promise; - cleanup(): Promise; + deleteDirectory: (filePath: string) => Promise; + deleteFile: (filePath: string) => Promise; + readFile: (filePath: string) => Promise; + resolve: (filePath: string) => string; + writeFile: (filePath: string, text: string) => Promise; + cleanup: () => Promise; +} + +export interface FixtureStdout { + sendKeys: (keys: string) => Promise; } export type FixtureFileSystemFiles = Record; -export type Fixture = FixtureFileSystem & { - logs: ReadonlyArray; - testNames(runs: BettererRunSummaries): BettererTestNames; -}; +export interface FixtureLogging { + logs: FixtureLogs; +} + +export type Fixture = FixtureFileSystem & + FixtureStdout & + FixtureLogging & { + testNames: (runs: BettererRunSummaries) => BettererTestNames; + }; // Readonly externally: export type FixtureLogs = ReadonlyArray; -// Writable internally: -export type FixtureLogsMap = Record>; +export type FixtureLogger = (testName: string, ...messages: Array) => void; + +export type FixtureLogsMap = Record; export interface FixtureOptions { logFilters?: Array; @@ -40,3 +50,9 @@ export type FixtureFactory = ( files?: FixtureFileSystemFiles, options?: FixtureOptions ) => Promise; + +export interface FixturePersist { + increment(): Promise; + decrement(): Promise; + reset(): Promise; +} diff --git a/packages/knip/CHANGELOG.md b/packages/knip/CHANGELOG.md new file mode 100644 index 000000000..5e23dc84b --- /dev/null +++ b/packages/knip/CHANGELOG.md @@ -0,0 +1,19 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/knip + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Features + +* **betterer ✨:** add more details to file issues ([#1211](https://github.com/phenomnomnominal/betterer/issues/1211)) ([5a53e45](https://github.com/phenomnomnominal/betterer/commit/5a53e45b4d51e643458c21bd911b5500e698a1a8)) diff --git a/packages/knip/LICENSE.md b/packages/knip/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/knip/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/knip/README.md b/packages/knip/README.md new file mode 100644 index 000000000..968e1acab --- /dev/null +++ b/packages/knip/README.md @@ -0,0 +1,11 @@ +[![Betterer](https://raw.githubusercontent.com/phenomnomnominal/betterer/master/website/static/img/header.png)](https://phenomnomnominal.github.io/betterer/) + +# `@betterer/knip` + +[![npm version](https://img.shields.io/npm/v/@betterer/knip.svg)](https://www.npmjs.com/package/@betterer/knip) + +Knip test for [**`Betterer`**](https://github.com/phenomnomnominal/betterer). + +## Docs + +[Check out the docs at `phenomnomnominal.github.io/betterer`! 🎉](https://phenomnomnominal.github.io/betterer/docs/built-in-tests#bettererknip) diff --git a/packages/knip/api-extractor.json b/packages/knip/api-extractor.json new file mode 100644 index 000000000..6f708a7f2 --- /dev/null +++ b/packages/knip/api-extractor.json @@ -0,0 +1,4 @@ +{ + "extends": "../../api-extractor.json", + "mainEntryPointFilePath": "./dist/index.d.ts" +} diff --git a/packages/knip/package.json b/packages/knip/package.json new file mode 100644 index 000000000..005994e4a --- /dev/null +++ b/packages/knip/package.json @@ -0,0 +1,40 @@ +{ + "name": "@betterer/knip", + "description": "Knip test for @betterer/betterer", + "version": "6.0.0-alpha.1", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "dist/index.js", + "types": "dist/index.d.ts", + "type": "module", + "files": [ + "dist" + ], + "author": "Craig Spence ", + "homepage": "https://phenomnomnominal.github.io/betterer", + "repository": { + "type": "git", + "url": "git+https://github.com/phenomnomnominal/betterer.git" + }, + "bugs": { + "url": "https://github.com/phenomnomnominal/betterer/issues" + }, + "scripts": { + "compile": "tsc -b .", + "api": "api-extractor run --local --verbose" + }, + "engines": { + "node": ">=16" + }, + "dependencies": { + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "change-case": "^5.4.4" + }, + "peerDependencies": { + "knip": "^5" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" +} diff --git a/packages/knip/src/fragile-knip.ts b/packages/knip/src/fragile-knip.ts new file mode 100644 index 000000000..c9c89d6df --- /dev/null +++ b/packages/knip/src/fragile-knip.ts @@ -0,0 +1,28 @@ +import type { KnipCLIOptions } from './types.js'; + +import { createRequire } from 'node:module'; +import path from 'node:path'; +import { kebabCase } from 'change-case'; + +// This is definitely fragile... +const require = createRequire(import.meta.url); +const pathName = require.resolve('knip'); +export const binPath = path.resolve(pathName, '../../bin/knip.js'); + +// This is probably a bit fragile too 😅 +export { ISSUE_TYPE_TITLE } from 'knip/dist/constants.js'; + +export function toArgs(options: KnipCLIOptions) { + return Object.entries(options) + .map(([name, result]) => { + const param = kebabCase(name); + if (result === true) { + return `--${param}`; + } + if (result === false) { + return `--no-${param}`; + } + return `--${kebabCase(name)}="${String(result)}"`; + }) + .join(' '); +} diff --git a/packages/knip/src/index.ts b/packages/knip/src/index.ts new file mode 100644 index 000000000..92bf491d1 --- /dev/null +++ b/packages/knip/src/index.ts @@ -0,0 +1,12 @@ +/** + * {@link https://knip.dev/ | Knip} test for {@link https://github.com/phenomnomnominal/betterer | **Betterer**}. + * + * This test is currently in *beta* since the underlying {@link https://knip.dev/ | Knip} + * implementation is based on private APIs. Will stabilise when it can be migrated to + * use public APIs. + * + * @packageDocumentation + */ + +export { knip } from './knip.js'; +export { KnipConfig, KnipCLIOptions } from './types.js'; diff --git a/packages/knip/src/knip.ts b/packages/knip/src/knip.ts new file mode 100644 index 000000000..f07ef84a6 --- /dev/null +++ b/packages/knip/src/knip.ts @@ -0,0 +1,160 @@ +import type { KnipConfig, KnipCLIOptions, KnipIssues, KnipIssueType, KnipReport } from './types.js'; + +import { BettererFileTest } from '@betterer/betterer'; +import { BettererError, invariantΔ } from '@betterer/errors'; +import { exec } from 'node:child_process'; +import { promises as fs } from 'node:fs'; +import { promisify } from 'node:util'; + +import path from 'node:path'; +import { ISSUE_TYPE_TITLE, binPath, toArgs } from './fragile-knip.js'; + +const asyncExec = promisify(exec); + +/** + * @beta Use this test to incrementally introduce {@link https://knip.dev/ | **Knip** checks } + * to your codebase. + * + * This test is currently in *beta* since the underlying {@link https://knip.dev/ | Knip} + * implementation is based on private APIs. Will stabilise when it can be migrated to + * use public APIs. + * + * @remarks {@link knip | `knip`} is a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, + * so you can use {@link @betterer/betterer#BettererResolverTest.include | `include()`}, {@link @betterer/betterer#BettererResolverTest.exclude | `exclude()`}, + * {@link @betterer/betterer#BettererTest.only | `only()`}, and {@link @betterer/betterer#BettererTest.skip | `skip()`}. + * + * @example + * ```typescript + * import { knip } from '@betterer/knip'; + * + * export default { + * 'knip dependency checks': () => + * knip('./knip.json', { }, '--strict') + * .include('./src/*.ts') + * }; + * ``` + * + * @param configFilePath - The relative path to a knip.json file. + * @param extraConfiguration - Additional {@link https://knip.dev/overview/configuration | **Knip** configuration } + * to enable. This will be merged with the existing configuration in the config file, + * overwriting any existing existing properties. + * @param extraCLIOptions - Additional CLI flags to enable. + * + * @throws {@link @betterer/errors#BettererError | `BettererError` } + * Will throw if the user doesn't pass `configFilePath` or `extraConfiguration`. + */ +export function knip( + configFilePath: string, + extraConfiguration: KnipConfig = {}, + extraCliOptions: KnipCLIOptions = {} +): BettererFileTest { + if (!configFilePath) { + throw new BettererError( + "For `@betterer/knip` to work, you need to provide the path to a knip.json file, e.g. `'./knip.json'`. ❌" + ); + } + + return new BettererFileTest(async (_, fileTestResult, resolver) => { + const absoluteConfigFilePath = resolver.resolve(configFilePath); + + let json: string; + try { + json = await fs.readFile(absoluteConfigFilePath, 'utf-8'); + } catch (error) { + throw new BettererError(`Couldn't read knip configuration file: "${configFilePath}". ❌`, error as Error); + } + + let config: object; + try { + config = JSON.parse(json) as object; + } catch (error) { + throw new BettererError(`Couldn't parse knip configuration file: "${configFilePath}". ❌`, error as Error); + } + + const { dir, base } = path.parse(absoluteConfigFilePath); + + const tmpJSONPath = await resolver.tmp(base); + const absoluteTmpJSONPath = resolver.resolve(tmpJSONPath); + const relativeTmpJSONPath = path.relative(dir, absoluteTmpJSONPath); + + let stdout: string; + + try { + const finalConfig = { ...config, ...extraConfiguration }; + await fs.writeFile(absoluteTmpJSONPath, JSON.stringify(finalConfig), 'utf-8'); + const finalArgs = toArgs({ + ...extraCliOptions, + config: relativeTmpJSONPath, + noExitCode: true, + reporter: ['json'] + }); + const buffers = await asyncExec(`node "${binPath}" ${finalArgs}`, { cwd: dir }); + stdout = buffers.stdout; + } catch (error) { + throw new BettererError(`Couldn't run knip. ❌`, error as Error); + } finally { + await fs.unlink(absoluteTmpJSONPath); + } + + const lines = stdout.split('\n').filter(Boolean); + const lastLine = lines.at(-1); + invariantΔ(lastLine, `\`lastLine\` should be the JSON output from knip!`); + + let report: KnipReport; + try { + report = JSON.parse(lastLine) as KnipReport; + } catch (error) { + throw new BettererError(`Couldn't parse JSON output from knip. ❌`, error as Error); + } + + await Promise.all( + report.files.map(async (relativeFilePath) => { + const absoluteFilePath = resolver.resolve(relativeFilePath); + const contents = await fs.readFile(absoluteFilePath, 'utf-8'); + const file = fileTestResult.addFile(absoluteFilePath, contents); + file.addIssue(0, 0, knipIssueMessage('files', '')); + }) + ); + + await Promise.all( + report.issues.map(async (filesIssues) => { + const relativeFilePath = filesIssues.file; + const absoluteFilePath = resolver.resolve(relativeFilePath); + const contents = await fs.readFile(absoluteFilePath, 'utf-8'); + const file = fileTestResult.addFile(absoluteFilePath, contents); + + const entries = Object.entries(filesIssues).filter((entry): entry is [KnipIssueType, KnipIssues] => { + const [key, issues] = entry; + return isIssueType(key) && Array.isArray(issues) && issues.length !== 0; + }); + + if (!entries.length) { + return; + } + + entries.forEach(([issueType, issues]) => { + issues.forEach((issue) => { + const { line, col, name } = issue; + const message = knipIssueMessage(issueType, name); + if (line == null || col == null) { + file.addIssue(0, 0, message); + } else { + file.addIssue(line, col, name.length, message); + } + }); + }); + }) + ); + }); +} + +function isIssueType(key: unknown): key is KnipIssueType { + return !!ISSUE_TYPE_TITLE[key as KnipIssueType]; +} + +function knipIssueMessage(issueType: keyof typeof ISSUE_TYPE_TITLE, message: string) { + let issueMessage = 'knip'; + issueMessage += `(${ISSUE_TYPE_TITLE[issueType]})`; + issueMessage += message ? `: ${message}` : ''; + return issueMessage; +} diff --git a/packages/knip/src/types.ts b/packages/knip/src/types.ts new file mode 100644 index 000000000..75ad87ec1 --- /dev/null +++ b/packages/knip/src/types.ts @@ -0,0 +1,94 @@ +import type { ISSUE_TYPE_TITLE } from 'knip/dist/constants.js'; + +import type { z } from 'zod'; +import type { ConfigurationValidator } from 'knip/dist/ConfigurationValidator.js'; + +/** + * @beta all the possible configuration file options that can be passed to {@link https://knip.dev | **Knip** }. + * + * @remarks this is import from internal references in the **Knip** knip, so it is quite fragile. + * It *is* exported, but currently causes issues due to invalid internal path references. + * Would be good to get the fixed types exposed from their public API! + */ +export type KnipConfig = z.infer; + +/** + * @beta all the possible CLI Options that can be passed to {@link https://knip.dev | **Knip** }. + * + * @remarks this is stolen from {@link https://github.com/webpro-nl/knip/blob/main/packages/knip/src/util/cli-arguments.ts | the **Knip** codebase}, + * so it is quite fragile. Would be good to get this exposed from their public API, or even + * better, a full JS API! + */ +export type KnipCLIOptions = Partial<{ + cache: boolean; + cacheLocation: string; + config: string; + debug: boolean; + dependencies: boolean; + directory: string; + exclude: string; + exports: boolean; + tags: Array; + experimentalTags: Array; + files: boolean; + fix: boolean; + fixType: Array; + allowRemoveFiles: boolean; + help: boolean; + ignoreInternal: boolean; + include: Array; + includeLibs: boolean; + includeEntryExports: boolean; + isolateWorkspaces: boolean; + maxIssues: string; + noConfigHints: boolean; + noExitCode: boolean; + noGitignore: boolean; + noProgress: boolean; + performance: boolean; + production: boolean; + preprocessor: Array; + preprocessorOptions: string; + reporter: Array; + reporterOptions: string; + strict: boolean; + trace: boolean; + traceExport: string; + traceFile: string; + tsConfig: string; + version: boolean; + watch: boolean; + workspace: string; +}>; + +export type KnipIssueType = keyof typeof ISSUE_TYPE_TITLE; + +/** @knipignore used by an exported function */ +export interface KnipIssue { + line?: number; + col?: number; + name: string; +} + +export type KnipIssues = ReadonlyArray; + +/** @knipignore used by an exported function */ +export type KnipFileIssues = { + file: string; +} & { + [IssueType in KnipIssueType]: KnipIssues; +}; + +/** @knipignore used by an exported function */ +export type KnipFilesIssues = ReadonlyArray; + +/** @knipignore used by an exported function */ +export type KnipIssuesForFile = Record; + +/** @knipignore used by an exported function */ +export type KnipIssuesByType = Partial>; + +export interface KnipReport { + files: Array; + issues: KnipFilesIssues; +} diff --git a/packages/knip/tsconfig.json b/packages/knip/tsconfig.json new file mode 100644 index 000000000..46b9b72e4 --- /dev/null +++ b/packages/knip/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["./src/*.ts"], + "exclude": ["../node_modules/*", "./node_modules/*", "./dist/*"], + "references": [{ "path": "../betterer" }, { "path": "../errors" }] +} diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 761470930..5e04be54d 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/logger + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Features + +* **betterer ✨:** add more details to file issues ([#1211](https://github.com/phenomnomnominal/betterer/issues/1211)) ([5a53e45](https://github.com/phenomnomnominal/betterer/commit/5a53e45b4d51e643458c21bd911b5500e698a1a8)) + + + + + ## [5.3.4](https://github.com/phenomnomnominal/betterer/compare/v5.3.3...v5.3.4) (2022-05-12) **Note:** Version bump only for package @betterer/logger diff --git a/packages/logger/LICENSE.md b/packages/logger/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/logger/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/logger/api-extractor.json b/packages/logger/api-extractor.json index dae7b1544..c17019c33 100644 --- a/packages/logger/api-extractor.json +++ b/packages/logger/api-extractor.json @@ -4,7 +4,6 @@ "messages": { "extractorMessageReporting": { - // We add a suffix __ instead "ae-internal-missing-underscore": { "logLevel": "none", "addToApiReportFile": false diff --git a/packages/logger/package.json b/packages/logger/package.json index efcb39a38..85d356383 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/logger", "description": "logger for @betterer/betterer", - "version": "5.3.4", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,15 +26,15 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { "@babel/code-frame": "^7.10.3", "jest-diff": "^27.0.6", - "lines-and-columns": "^2.0.3", - "tslib": "^2.3.1" + "lines-and-columns": "^2.0.3" }, "devDependencies": { "@types/babel__code-frame": "^7.0.1" - } + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/logger/src/code.ts b/packages/logger/src/code.ts index 4513a3cdb..6290b442f 100644 --- a/packages/logger/src/code.ts +++ b/packages/logger/src/code.ts @@ -5,23 +5,31 @@ import { LinesAndColumns } from 'lines-and-columns'; import path from 'node:path'; const IS_JS_REGEXP = /.t|jsx?$/; +const IS_JSON_REGEXP = /.json$/; +const IS_CSS_REGEXP = /.s?css$/; /** * @internal Definitely not stable! Please don't use! * * Logs a code block with syntax highlighting and a message. */ -export function code__(codeInfo: BettererLoggerCodeInfo): string { +export function codeΔ(codeInfo: BettererLoggerCodeInfo): string { + codeInfo.line = isNaN(codeInfo.line) ? 0 : codeInfo.line; + codeInfo.column = isNaN(codeInfo.column) ? 0 : codeInfo.column; + const { filePath, fileText, message } = codeInfo; - const isJS = IS_JS_REGEXP.exec(path.extname(filePath)); + const ext = path.extname(filePath); + const isJS = IS_JS_REGEXP.exec(ext); + const isJSON = IS_JSON_REGEXP.exec(ext); + const isCSS = IS_CSS_REGEXP.exec(ext); const options = { - highlightCode: !!isJS, + highlightCode: !!(isJS ?? isJSON ?? isCSS), message }; const lc = new LinesAndColumns(fileText); const startLocation = codeInfo; - const startIndex = lc.indexForLocation(startLocation) || 0; - const endLocation = lc.locationForIndex(startIndex + codeInfo.length) || startLocation; + const startIndex = lc.indexForLocation(startLocation) ?? 0; + const endLocation = lc.locationForIndex(startIndex + codeInfo.length) ?? startLocation; const start = { line: startLocation.line + 1, column: startLocation.column + 1 @@ -30,6 +38,6 @@ export function code__(codeInfo: BettererLoggerCodeInfo): string { line: endLocation.line + 1, column: endLocation.column + 1 }; - // `codeFrameColumns` doesn't handle empty strings very well! - return `\n ${filePath}\n${codeFrameColumns(fileText || ' ', { start, end }, options)}\n`; + // `codeFrameColumns` doesn't handle empty strings very well, so add some whitespace! + return `\n${codeFrameColumns(fileText || ' ', { start, end }, options)}\n`; } diff --git a/packages/logger/src/diff.ts b/packages/logger/src/diff.ts index b85b22449..4ee16e3a9 100644 --- a/packages/logger/src/diff.ts +++ b/packages/logger/src/diff.ts @@ -7,7 +7,7 @@ import { diff, diffLinesUnified, diffStringsUnified } from 'jest-diff'; * * Logs the diff between two objects. */ -export function diff__(a: T, b: T, diffOptions: DiffOptions): string | null { +export function diffΔ(a: T, b: T, diffOptions: DiffOptions): string | null { return diff(a, b, diffOptions); } @@ -16,7 +16,7 @@ export function diff__(a: T, b: T, diffOptions: DiffOptions): string | null { * * Logs the diff between two strings. */ -export function diffStrings__(a: string, b: string, diffOptions: DiffOptions): string { +export function diffStringsΔ(a: string, b: string, diffOptions: DiffOptions): string { // jest-diff recommends using `diffLinesUnified` if string lengths are above 20,000 for performance if (a.length > 20_000 || b.length > 20_000) { return diffLinesUnified(a.split('\n'), b.split('\n'), diffOptions); diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts index a25827734..0b6f1a580 100644 --- a/packages/logger/src/index.ts +++ b/packages/logger/src/index.ts @@ -4,10 +4,7 @@ * @packageDocumentation */ -export { code__ } from './code.js'; -export { diff__, diffStrings__ } from './diff.js'; -export { log__ } from './log.js'; -export { +export type { BettererLogger, BettererLog, BettererLogMessage, @@ -15,5 +12,9 @@ export { BettererLogs, BettererLoggerCodeInfo, BettererLoggerMessage, - BettererLoggerMessages + BettererLoggerMessages, + MaybeAsync } from './types.js'; + +export { codeΔ } from './code.js'; +export { diffΔ, diffStringsΔ } from './diff.js'; diff --git a/packages/logger/src/log.ts b/packages/logger/src/log.ts deleted file mode 100644 index d165747ef..000000000 --- a/packages/logger/src/log.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { BettererLoggerCodeInfo, BettererLoggerMessage, BettererLogger, BettererLogs } from './types.js'; - -/** - * @internal This could change at any point! Please don't use! - * - * Log a set of {@link BettererLog | `BettererLog`} instructions with a given {@link BettererLogger | `BettererLogger`}. - * - * Useful for when you want to capture logging information, but delay when it is actually shown to - * the user. - */ -export async function log__(logs: BettererLogs, logger: BettererLogger): Promise { - await Promise.all( - logs.map((log) => { - const types = Object.keys(log) as Array; - return types.map((type) => logger[type](log[type] as BettererLoggerCodeInfo & BettererLoggerMessage)); - }) - ); -} diff --git a/packages/logger/src/types.ts b/packages/logger/src/types.ts index 5372b6b8a..f1eccc8a1 100644 --- a/packages/logger/src/types.ts +++ b/packages/logger/src/types.ts @@ -12,7 +12,7 @@ export type BettererLoggerMessages = Array; * @public A function that takes an array of {@link BettererLoggerMessage | `BettererLoggerMessage`s } * and logs them asynchronously. */ -export type BettererLogMessage = (...messages: BettererLoggerMessages) => Promise; +export type BettererLogMessage = (...messages: BettererLoggerMessages) => MaybeAsync; /** * @public The information required to log a code block with a message. @@ -48,10 +48,10 @@ export interface BettererLoggerCodeInfo { * @public A function that takes a {@link BettererLoggerCodeInfo | `BettererLoggerCodeInfo` } * and logs it asynchronously. */ -export type BettererLogCode = (codeInfo: BettererLoggerCodeInfo) => Promise; +export type BettererLogCode = (codeInfo: BettererLoggerCodeInfo) => MaybeAsync; /** - * @public The logger interface for **Betterer** reporter and task logging. + * @public The interface for **Betterer** logging. */ export interface BettererLogger { /** @@ -87,7 +87,7 @@ export interface BettererLogger { /** * @internal This could change at any point! Please don't use! * - * A logging instruction which can be logged at a later time using {@link @betterer/logger#log__ | `log__()`}. + * A logging instruction which can be logged at a later time. */ export interface BettererLog { /** @@ -123,6 +123,11 @@ export interface BettererLog { /** * @internal This could change at any point! Please don't use! * - * A set of logging instructions which can be logged at a later time using {@link @betterer/logger#log__ | `log__()`}. + * A set of logging instructions which can be logged at a later time. */ export type BettererLogs = Array; + +/** + * @public Utility type to allow results that are async or sync. + */ +export type MaybeAsync = T | Promise; diff --git a/packages/regexp/CHANGELOG.md b/packages/regexp/CHANGELOG.md index 3f9973ac3..ad20f5a61 100644 --- a/packages/regexp/CHANGELOG.md +++ b/packages/regexp/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/regexp + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) + + +### Features + +* **betterer ✨:** specify different cache strategies ([#1232](https://github.com/phenomnomnominal/betterer/issues/1232)) ([df77035](https://github.com/phenomnomnominal/betterer/commit/df7703537910c320c0444e26582e8436947ff00d)) + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) diff --git a/packages/regexp/LICENSE.md b/packages/regexp/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/regexp/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/regexp/package.json b/packages/regexp/package.json index e7a6cf5ea..29ad5010a 100644 --- a/packages/regexp/package.json +++ b/packages/regexp/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/regexp", "description": "RegExp test for @betterer/betterer", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,11 +26,11 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "tslib": "^2.3.1" - } + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/regexp/src/regexp.ts b/packages/regexp/src/regexp.ts index 9f4e20f95..ea06a524a 100644 --- a/packages/regexp/src/regexp.ts +++ b/packages/regexp/src/regexp.ts @@ -7,8 +7,8 @@ import { promises as fs } from 'node:fs'; * matches from your codebase. * * @remarks {@link regexp | `regexp`} is a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, - * so you can use {@link @betterer/betterer#BettererFileTest.include | `include()`}, {@link @betterer/betterer#BettererFileTest.exclude | `exclude()`}, - * {@link @betterer/betterer#BettererFileTest.only | `only()`}, and {@link @betterer/betterer#BettererFileTest.skip | `skip()`}. + * so you can use {@link @betterer/betterer#BettererResolverTest.include | `include()`}, {@link @betterer/betterer#BettererResolverTest.exclude | `exclude()`}, + * {@link @betterer/betterer#BettererTest.only | `only()`}, and {@link @betterer/betterer#BettererTest.skip | `skip()`}. * * @example * ```typescript @@ -30,7 +30,11 @@ import { promises as fs } from 'node:fs'; * Will throw if the user doesn't pass `pattern`. */ export function regexp(pattern: RegExp, issueMessage = 'RegExp match'): BettererFileTest { - if (!pattern) { + // The `regexp` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `pattern?: RegExp`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (pattern == null) { throw new BettererError('for `@betterer/regexp` to work, you need to provide a RegExp, e.g. `/^foo$/`. ❌'); } @@ -55,7 +59,7 @@ export function regexp(pattern: RegExp, issueMessage = 'RegExp match'): Betterer }); }) ); - }); + }).cache(); } function getFileMatches(pattern: RegExp, fileText: string): Array { diff --git a/packages/render/CHANGELOG.md b/packages/render/CHANGELOG.md index b1a0080f2..76cbf2994 100644 --- a/packages/render/CHANGELOG.md +++ b/packages/render/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/render + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Features + +* **betterer ✨:** improve CLI output when files have changed but test results have not ([#1185](https://github.com/phenomnomnominal/betterer/issues/1185)) ([aeb46f8](https://github.com/phenomnomnominal/betterer/commit/aeb46f8f96e33b2defed0a178b10a2eaaab3c842)) + + + + + ## [5.3.4](https://github.com/phenomnomnominal/betterer/compare/v5.3.3...v5.3.4) (2022-05-12) **Note:** Version bump only for package @betterer/render diff --git a/packages/render/LICENSE.md b/packages/render/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/render/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/render/api-extractor.json b/packages/render/api-extractor.json index 8371e65c8..8310554d6 100644 --- a/packages/render/api-extractor.json +++ b/packages/render/api-extractor.json @@ -1,6 +1,6 @@ { "extends": "../../api-extractor.json", - "mainEntryPointFilePath": "./dist/ts/index.d.ts", + "mainEntryPointFilePath": "./dist/src/index.d.ts", "messages": { "extractorMessageReporting": { diff --git a/packages/render/package.json b/packages/render/package.json index ba4de049d..0a729c554 100644 --- a/packages/render/package.json +++ b/packages/render/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/render", "description": "Renderer for @betterer/betterer", - "version": "5.3.4", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", - "types": "dist/ts/index.d.ts", + "types": "dist/src/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -21,23 +22,22 @@ "url": "https://github.com/phenomnomnominal/betterer/issues" }, "scripts": { - "compile": "tsc -b . && rollup --config rollup.config.ts", + "compile": "tsc -b . && rollup --config rollup.config.ts --configPlugin \"typescript={outputToFilesystem:false,sourceMap:false}\"", "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "devDependencies": { - "@rollup/plugin-commonjs": "^22.0.0", - "@rollup/plugin-json": "^4.1.0", - "@rollup/plugin-node-resolve": "^13.3.0", - "@rollup/plugin-replace": "^4.0.0", - "@rollup/plugin-typescript": "^8.3.2", - "@types/react": "^16.14.26", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-replace": "^5.0.5", + "@rollup/plugin-typescript": "^11.1.6", "ink": "^3.0.9", + "ink-link": "^2.0.0", "ink-text-input": "^4.0.1", - "react": "^16.14.0", - "rollup": "^2.72.1", - "tslib": "^2.3.1" - } + "rollup": "^4.14.3" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/render/rollup.config.ts b/packages/render/rollup.config.ts index 8bac89d69..02dddc618 100644 --- a/packages/render/rollup.config.ts +++ b/packages/render/rollup.config.ts @@ -1,32 +1,38 @@ +import { defineConfig } from 'rollup'; + import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import { nodeResolve } from '@rollup/plugin-node-resolve'; import typescript from '@rollup/plugin-typescript'; import replace from '@rollup/plugin-replace'; -export default { - input: './src/index.tsx', +export default defineConfig({ + input: './src/index.ts', output: { dir: 'dist', - format: 'cjs', + format: 'esm', sourcemap: true, strict: false }, plugins: [ replace({ preventAssignment: true, - 'process.env.NODE_ENV': JSON.stringify('development'), - "'use strict'": '' + [`process.env.NODE_ENV`]: JSON.stringify('production'), + "'use strict'": '', + // React dev tools breaks tests because of the `ink` DEV mode + [`process.env.DEV`]: JSON.stringify(false) }), nodeResolve({ - preferBuiltins: false + dedupe: ['react', 'react-reconciler'], + preferBuiltins: true }), json(), commonjs({ include: /node_modules/ }), typescript({ + outputToFilesystem: false, sourceMap: true }) ] -}; +}); diff --git a/packages/render/src/index.tsx b/packages/render/src/index.ts similarity index 68% rename from packages/render/src/index.tsx rename to packages/render/src/index.ts index 172e4c2f7..1dcf01ae3 100644 --- a/packages/render/src/index.tsx +++ b/packages/render/src/index.ts @@ -4,7 +4,7 @@ * Problems happen when there are multiple versions of `react` available within a codebase, * as different instances of the `ink` renderer may find different versions of `react-dom`. * - * This package is an attempt to ensure that `ink` always finds the same verson of + * This package is an attempt to ensure that `ink` always finds the same version of * `react` and `react-dom` * * 🚨 THIS PACKAGE SHOULD ONLY BE USED WITHIN THE BETTERER MONOREPO 🚨 @@ -26,7 +26,7 @@ export const React = R; * * Re-exported from `ink` */ -export type { Instance, RenderOptions, TextProps } from 'ink'; +export type { Instance, RenderOptions } from 'ink'; /** * @internal This could change at any point! Please don't use! @@ -40,7 +40,14 @@ export type { FC, PropsWithChildren } from 'react'; * * Re-exported from `ink` */ -export { render, Box, Text, useApp, useInput, useStdin } from 'ink'; +export { render, Box, useApp, useInput, useStdin } from 'ink'; + +/** + * @internal This could change at any point! Please don't use! + * + * Re-exported from `ink`, but modified to remove process.cwd() from any text + */ +export { Text, TextProps } from './text.js'; /** * @internal This could change at any point! Please don't use! @@ -63,51 +70,53 @@ export type TextInputProps = React.ComponentProps; * * Re-exported TextInput component from `ink-text-input` */ -export const TextInput = (props: TextInputProps) => { - return ; -}; +export const TextInput: React.FC = TI; + +import IL from 'ink-link'; /** * @internal This could change at any point! Please don't use! + * + * Re-exported LinkProps from `ink-link` */ -export type Process = typeof import('process'); -/** - * @internal This could change at any point! Please don't use! - */ -export type StdErr = Process['stderr']; +export type LinkProps = React.ComponentProps; + /** * @internal This could change at any point! Please don't use! + * + * Re-exported Link component from `ink-link` */ -export type StdIn = Process['stdin']; +export const Link: React.FC = IL; + /** * @internal This could change at any point! Please don't use! */ -export type StdOut = Process['stdout']; +export type Process = typeof import('process'); /** * @internal This could change at any point! Please don't use! * - * Wrapped to get process.stderr so it can be stubbed for testing. + * @remarks can be stubbed to have control of stderr during tests. */ -export function getStdErr(): StdErr { +export function getStdErrΔ(): Process['stderr'] { return process.stderr; } /** * @internal This could change at any point! Please don't use! * - * Wrapped to get process.stdin so it can be stubbed for testing. + * @remarks can be stubbed to have control of stdin during tests. */ -export function getStdIn(): StdIn { +export function getStdInΔ(): Process['stdin'] { return process.stdin; } /** * @internal This could change at any point! Please don't use! * - * Wrapped to get process.stdout so it can be stubbed for testing. + * @remarks can be stubbed to have control of stdout during tests. */ -export function getStdOut(): StdOut { +export function getStdOutΔ(): Process['stdout'] { return process.stdout; } @@ -116,12 +125,13 @@ import type { RenderOptions } from 'ink'; /** * @internal This could change at any point! Please don't use! */ -export function getRenderOptions(env = '', options: RenderOptions = {}): RenderOptions { +export function getRenderOptionsΔ(env = '', options: RenderOptions = {}): RenderOptions { return { debug: env === 'test', - stderr: getStdErr(), - stdin: getStdIn(), - stdout: getStdOut(), + stderr: getStdErrΔ(), + stdin: getStdInΔ(), + stdout: getStdOutΔ(), + patchConsole: true, ...options }; } diff --git a/packages/render/src/text.tsx b/packages/render/src/text.tsx new file mode 100644 index 000000000..42b0daf81 --- /dev/null +++ b/packages/render/src/text.tsx @@ -0,0 +1,34 @@ +import type { TextProps } from 'ink'; + +import { Text as InkText } from 'ink'; +import React from 'react'; +import path from 'node:path'; + +export type { TextProps } from 'ink'; + +/** + * @internal This could change at any point! Please don't use! + * + * Re-exported from `ink`, but modified to remove process.cwd() from any text + */ +export const Text: React.FC = (props) => { + const { children, ...rest } = props; + const stripped = Array.isArray(children) ? children.map(stripCwd) : [children].map(stripCwd); + return {stripped}; +}; + +function stripCwd(log: React.ReactNode): React.ReactNode { + if (typeof log !== 'string') { + return log; + } + const processDir = path.join(process.cwd(), path.sep); + return log.replaceAll(toPosixPath(processDir), '').replaceAll(toWin32Path(processDir), '').replaceAll('file://', ''); +} + +function toPosixPath(str: string): string { + return str.split(path.sep).join(path.posix.sep); +} + +function toWin32Path(str: string): string { + return str.split(path.sep).join(path.win32.sep); +} diff --git a/packages/render/tsconfig.json b/packages/render/tsconfig.json index d00a7c0bb..318fc87a0 100644 --- a/packages/render/tsconfig.json +++ b/packages/render/tsconfig.json @@ -1,11 +1,10 @@ { "extends": "../../tsconfig.json", "compilerOptions": { - "outDir": "./dist/ts", - "rootDir": "./src", - "module": "ES2020" + "module": "ES2020", + "outDir": "./dist" }, - "include": ["./src/**/*.ts", "src/**/*.tsx"], + "include": ["./src/**/*.ts", "src/**/*.tsx", "./rollup.config.ts"], "exclude": ["../node_modules/*", "./node_modules/*", "./dist/*"], "references": [] } diff --git a/packages/reporter/CHANGELOG.md b/packages/reporter/CHANGELOG.md index c02b20ef8..d3bfc2671 100644 --- a/packages/reporter/CHANGELOG.md +++ b/packages/reporter/CHANGELOG.md @@ -3,6 +3,27 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/reporter + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Features + +* **beterer ✨:** make logo optional ([#1137](https://github.com/phenomnomnominal/betterer/issues/1137)) ([b3d9cac](https://github.com/phenomnomnominal/betterer/commit/b3d9cac3633aa2e6365f196d06e4acd5937d4dbe)) +* **betterer ✨:** improve CLI output when files have changed but test results have not ([#1185](https://github.com/phenomnomnominal/betterer/issues/1185)) ([aeb46f8](https://github.com/phenomnomnominal/betterer/commit/aeb46f8f96e33b2defed0a178b10a2eaaab3c842)) +* **betterer ✨:** no more weird completed then new tests ([#1213](https://github.com/phenomnomnominal/betterer/issues/1213)) ([da704f2](https://github.com/phenomnomnominal/betterer/commit/da704f2e91b3b26a7f1cd6953a21bd623b3cb9c8)) + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) **Note:** Version bump only for package @betterer/reporter diff --git a/packages/reporter/LICENSE.md b/packages/reporter/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/reporter/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/reporter/api-extractor.json b/packages/reporter/api-extractor.json index dae7b1544..6923858f4 100644 --- a/packages/reporter/api-extractor.json +++ b/packages/reporter/api-extractor.json @@ -4,7 +4,7 @@ "messages": { "extractorMessageReporting": { - // We add a suffix __ instead + // We add a suffix Δ instead "ae-internal-missing-underscore": { "logLevel": "none", "addToApiReportFile": false diff --git a/packages/reporter/package.json b/packages/reporter/package.json index 908414602..ff09556f4 100644 --- a/packages/reporter/package.json +++ b/packages/reporter/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/reporter", "description": "Default reporter @betterer/betterer", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,14 +26,15 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "@betterer/logger": "^5.3.4", - "@betterer/render": "^5.3.4", - "@betterer/tasks": "^5.3.6", - "tslib": "^2.3.1" - } + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/tasks": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/reporter/src/components/Error.tsx b/packages/reporter/src/components/Error.tsx index af3f842d4..b95fecdd3 100644 --- a/packages/reporter/src/components/Error.tsx +++ b/packages/reporter/src/components/Error.tsx @@ -4,6 +4,7 @@ import type { FC } from '@betterer/render'; import { React, Box } from '@betterer/render'; import { BettererErrorLog, BettererLogo } from '@betterer/tasks'; +/** @knipignore used by an exported function */ export interface ErrorProps { error: BettererError; logo: boolean; diff --git a/packages/reporter/src/components/Reporter.tsx b/packages/reporter/src/components/Reporter.tsx index 993a945f0..7b0f07192 100644 --- a/packages/reporter/src/components/Reporter.tsx +++ b/packages/reporter/src/components/Reporter.tsx @@ -1,32 +1,32 @@ import type { FC } from '@betterer/render'; -import type { BettererReporterState } from '../state/index.js'; - import { React, Box, useInput, useStdin } from '@betterer/render'; import { BettererLogo } from '@betterer/tasks'; +import { useReporterState } from '../state/index.js'; import { DefaultReporter } from './default/index.js'; import { WatchReporter } from './watch/index.js'; -export const Reporter: FC = function Reporter(props: BettererReporterState) { - const { context } = props; +export const Reporter: FC = function Reporter() { + const [{ context }] = useReporterState(); const { isRawModeSupported } = useStdin(); - isRawModeSupported && + if (isRawModeSupported) { useInput((input, key) => { if (key.ctrl && input === 'c') { void context.stop(); return; } }); + } const ReporterComponent = context.config.watch ? WatchReporter : DefaultReporter; return ( {context.config.logo && } - + ); }; diff --git a/packages/reporter/src/components/config/Config.tsx b/packages/reporter/src/components/config/Config.tsx index e5f0568ff..c0f3d06ce 100644 --- a/packages/reporter/src/components/config/Config.tsx +++ b/packages/reporter/src/components/config/Config.tsx @@ -11,6 +11,8 @@ import { React, Box, Text, useState } from '@betterer/render'; import { EditConfig } from './EditConfig.js'; export type ConfigEditField = 'filters' | 'ignores' | null; + +/** @knipignore used by an exported function */ export interface ConfigProps { context: BettererContext; editField: ConfigEditField; diff --git a/packages/reporter/src/components/config/EditConfig.tsx b/packages/reporter/src/components/config/EditConfig.tsx index 40f78fa25..bae50c20a 100644 --- a/packages/reporter/src/components/config/EditConfig.tsx +++ b/packages/reporter/src/components/config/EditConfig.tsx @@ -1,36 +1,39 @@ import type { PropsWithChildren } from '@betterer/render'; -import { React, Box, Text, TextInput, useState } from '@betterer/render'; +import { React, Box, Text, TextInput, useState, useCallback } from '@betterer/render'; -export interface EditConfigProps { +/** @knipignore used by an exported function */ +export type EditConfigProps = PropsWithChildren<{ name: string; onChange: (newValue: string) => [ValidatedConfigType | null, Error | null]; onSubmit: (newValue: ValidatedConfigType) => Promise; value: string; -} +}>; -export function EditConfig( - props: PropsWithChildren> -): JSX.Element { +export function EditConfig(props: EditConfigProps): React.JSX.Element { const { children, name, onChange, onSubmit, value } = props; const [error, setError] = useState(null); const [valid, setValid] = useState(null); - function change(newValue: string): void { - const [valid, error] = onChange(newValue); - setValid(valid); - setError(error); - } + const change = useCallback( + (newValue: string): void => { + const [valid, error] = onChange(newValue); + setValid(valid); + setError(error); + }, + [onChange] + ); - async function submit(): Promise { + const submit = useCallback(async (): Promise => { if (valid) { await onSubmit(valid); } - } + }, [valid, onSubmit]); return ( - {children} Press "enter" to confirm. + Press "enter" to confirm, or "esc" to cancel. + {children} {name}: void submit()}> diff --git a/packages/reporter/src/components/default/DefaultFiles.tsx b/packages/reporter/src/components/default/DefaultFiles.tsx index 4665677ea..dd683c901 100644 --- a/packages/reporter/src/components/default/DefaultFiles.tsx +++ b/packages/reporter/src/components/default/DefaultFiles.tsx @@ -1,34 +1,33 @@ -import type { BettererSuite } from '@betterer/betterer'; +import type { BettererFilePaths } from '@betterer/betterer'; import type { FC } from '@betterer/render'; -import { React, Box, Text, memo } from '@betterer/render'; +import { Box, React, Text, memo } from '@betterer/render'; import { filesChecked, filesChecking } from '../../messages.js'; +/** @knipignore used by an exported function */ export interface DefaultFilesProps { - suite: BettererSuite; + filePaths: BettererFilePaths; running: boolean; } - export const DefaultFiles: FC = memo(function DefaultFiles(props) { - const { suite, running } = props; - const { filePaths } = suite; + const { filePaths, running } = props; + + if (!filePaths.length) { + return null; + } return ( <> - {filePaths.length ? ( - <> - - {running ? filesChecking(filePaths.length) : filesChecked(filePaths.length)} - - - {filePaths.map((filePath) => ( - ・ {filePath} - ))} - - - ) : null} + + {running ? filesChecking(filePaths.length) : filesChecked(filePaths.length)} + + + {filePaths.map((filePath) => ( + ・ {filePath} + ))} + ); }); diff --git a/packages/reporter/src/components/default/DefaultReporter.tsx b/packages/reporter/src/components/default/DefaultReporter.tsx index bd3fec74f..b00f8a3ff 100644 --- a/packages/reporter/src/components/default/DefaultReporter.tsx +++ b/packages/reporter/src/components/default/DefaultReporter.tsx @@ -1,24 +1,27 @@ import type { FC } from '@betterer/render'; -import type { BettererReporterState } from '../../state/index.js'; - import { React, memo } from '@betterer/render'; -import { Suite } from '../suite/index.js'; +import { useReporterState } from '../../state/index.js'; +import { Suite, SuiteSummary } from '../suite/index.js'; import { DefaultFiles } from './DefaultFiles.js'; -export const DefaultReporter: FC = memo(function DefaultReporter(props: BettererReporterState) { - const { context, done, suiteSummary } = props; - const suite = props.suite || props.suiteSummary; +export const DefaultReporter: FC = memo(function DefaultReporter() { + const [{ context, contextSummary, suite, suiteSummary }] = useReporterState(); if (!suite) { return null; } + if (context.config.ci && !contextSummary) { + return null; + } + return ( <> - - + {} + {!suiteSummary && } + {suiteSummary && } ); }); diff --git a/packages/reporter/src/components/suite/Run.tsx b/packages/reporter/src/components/suite/Run.tsx new file mode 100644 index 000000000..c7b0f765f --- /dev/null +++ b/packages/reporter/src/components/suite/Run.tsx @@ -0,0 +1,21 @@ +import type { BettererRun } from '@betterer/betterer'; +import type { FC } from '@betterer/render'; + +import { memo, React } from '@betterer/render'; +import { BettererTaskResult } from '@betterer/tasks'; + +import { useReporterState } from '../../state/store.js'; + +/** @knipignore used by an exported function */ +export interface RunProps { + run: BettererRun; +} + +export const Run: FC = memo(function Run({ run }) { + const [, logs, status] = useReporterState(); + + const runLogs = logs[run.name]; + const runStatus = status[run.name]; + + return ; +}); diff --git a/packages/reporter/src/components/suite/RunSummary.tsx b/packages/reporter/src/components/suite/RunSummary.tsx new file mode 100644 index 000000000..0be40b0c6 --- /dev/null +++ b/packages/reporter/src/components/suite/RunSummary.tsx @@ -0,0 +1,23 @@ +import type { BettererRunSummary } from '@betterer/betterer'; +import type { FC } from '@betterer/render'; + +import { invariantΔ } from '@betterer/errors'; +import { memo, React } from '@betterer/render'; +import { BettererTaskResult } from '@betterer/tasks'; + +import { useReporterState } from '../../state/store.js'; + +/** @knipignore used by an exported function */ +export interface RunSummaryProps { + runSummary: BettererRunSummary; +} + +export const RunSummary: FC = memo(function RunSummary({ runSummary }) { + const [, logs, status] = useReporterState(); + + const runLogs = logs[runSummary.name]; + const runStatus = status[runSummary.name]; + invariantΔ(runStatus, 'status should be set when the test completes!'); + + return ; +}); diff --git a/packages/reporter/src/components/suite/Suite.tsx b/packages/reporter/src/components/suite/Suite.tsx index 5a45d095f..8b8b8f212 100644 --- a/packages/reporter/src/components/suite/Suite.tsx +++ b/packages/reporter/src/components/suite/Suite.tsx @@ -1,44 +1,31 @@ -import type { BettererContext, BettererSuite, BettererSuiteSummary } from '@betterer/betterer'; +import type { BettererSuite } from '@betterer/betterer'; import type { FC } from '@betterer/render'; -import type { BettererTasksDone, BettererTasksState } from '@betterer/tasks'; -import { React, Box, memo } from '@betterer/render'; -import { BettererTaskLogger, BettererTasksLogger } from '@betterer/tasks'; +import { Box, memo, React } from '@betterer/render'; +import { BettererTasksResult, useTimer } from '@betterer/tasks'; -import { useTask } from './tasks.js'; -import { SuiteSummary } from './SuiteSummary.js'; +import { useReporterState } from '../../state/index.js'; +import { Run } from './Run.js'; +import { update } from './update.js'; +/** @knipignore used by an exported function */ export interface SuiteProps { - context: BettererContext; - suite: BettererSuite | BettererSuiteSummary; - suiteSummary?: BettererSuiteSummary; - done?: BettererTasksDone; + suite: BettererSuite; } -export const Suite: FC = memo(function Runs({ context, suite, suiteSummary, done }) { - const { ci, precommit } = context.config; +export const Suite: FC = memo(function Suite({ suite }) { + const [state] = useReporterState(); + const time = useTimer(); + return ( <> - + {suite.runs.map((run) => ( - + ))} - + - {suiteSummary ? : null} ); }); - -function update(state: BettererTasksState): string { - const { done, errors, running } = state; - const runningStatus = running ? `${tests(running)} running... ` : ''; - const doneStatus = done ? `${tests(done)} done! ` : ''; - const errorStatus = errors ? `${tests(errors)} errored! ` : ''; - return `${runningStatus}${doneStatus}${errorStatus}`; -} - -function tests(n: number): string { - return n === 1 ? `${n} test` : `${n} tests`; -} diff --git a/packages/reporter/src/components/suite/SuiteSummary.tsx b/packages/reporter/src/components/suite/SuiteSummary.tsx index e9f17d320..4a7fa1566 100644 --- a/packages/reporter/src/components/suite/SuiteSummary.tsx +++ b/packages/reporter/src/components/suite/SuiteSummary.tsx @@ -1,38 +1,52 @@ import type { BettererContext, BettererSuiteSummary } from '@betterer/betterer'; import type { FC, TextProps } from '@betterer/render'; -import { React, Box, Text, memo } from '@betterer/render'; +import { Box, React, Text, memo } from '@betterer/render'; +import { BettererTasksResult } from '@betterer/tasks'; import { - testBetter, - testChecked, - testComplete, - testExpired, - testFailed, - testNew, - testSame, - testSkipped, - testUpdated, - testWorse, + testsBetter, + testsChecked, + testsComplete, + testsExpired, + testsFailed, + testsNew, + testsObsolete, + testsRemoved, + testsSame, + testsSkipped, + testsUpdated, + testsWorse, unexpectedChanges, unexpectedChangesInstructions, - updateInstructions + stayedTheSameButChanged, + stayedTheSameButChangedInstructions, + updateInstructionsObsolete, + updateInstructionsWorse } from '../../messages.js'; +import { useReporterState } from '../../state/index.js'; +import { RunSummary } from './RunSummary.js'; +import { update } from './update.js'; +import { WorkflowSuggestions } from './WorkflowSuggestions.js'; +/** @knipignore used by an exported function */ export interface SuiteSummaryProps { context: BettererContext; suiteSummary: BettererSuiteSummary; } -const TEXT_COLOURS: Record = { +type TestCategories = Exclude; + +const TEXT_COLOURS: Record = { better: 'greenBright', changed: 'red', - checked: 'gray', completed: 'greenBright', expired: 'brightRed', failed: 'brightRed', new: 'gray', - obsolete: 'brightRed', + obsolete: 'magentaBright', + ran: 'gray', + removed: 'white', same: 'brightYellow', skipped: 'brightYellow', updated: 'white', @@ -40,53 +54,90 @@ const TEXT_COLOURS: Record = { }; export const SuiteSummary: FC = memo(function SuiteSummary({ context, suiteSummary }) { - const better = suiteSummary.better.length; - const completed = suiteSummary.completed.length; - const expired = suiteSummary.expired.length; - const failed = suiteSummary.failed.length; - const neww = suiteSummary.new.length; - const ran = suiteSummary.ran.length; - const same = suiteSummary.same.length; - const skipped = suiteSummary.skipped.length; - const updated = suiteSummary.updated.length; - const worse = suiteSummary.worse.length; + const [state] = useReporterState(); + + function getColor(name: TestCategories): TextProps['color'] { + return TEXT_COLOURS[name]; + } + + function showIfHasCategory(name: TestCategories, getMessage: (count: number) => string): React.JSX.Element | null { + const count = suiteSummary[name].length; + return count ? {getMessage(count)} : null; + } + + const { endTime } = state; + + if (endTime == null) { + return null; + } + + const unexpectedChangesDetected = context.config.ci && suiteSummary.changed.length; + const fileContentChanges = unexpectedChangesDetected && onlyFileContentsChanges(suiteSummary); return ( <> - {testChecked(tests(ran))} - {neww ? {testNew(tests(neww))} : null} - {better ? {testBetter(tests(better))} : null} - {completed ? {testComplete(tests(completed))} : null} - {same ? {testSame(tests(same))} : null} - {failed ? {testFailed(tests(failed))} : null} - {skipped ? {testSkipped(tests(skipped))} : null} - {updated ? {testUpdated(tests(updated))} : null} - {worse ? ( + + {suiteSummary.runSummaries.map((runSummary) => ( + + ))} + + + + {testsChecked(suiteSummary.ran.length)} + {showIfHasCategory('new', testsNew)} + {showIfHasCategory('better', testsBetter)} + {showIfHasCategory('completed', testsComplete)} + {showIfHasCategory('same', testsSame)} + {showIfHasCategory('failed', testsFailed)} + {showIfHasCategory('skipped', testsSkipped)} + {showIfHasCategory('updated', testsUpdated)} + {suiteSummary.worse.length ? ( <> - {testWorse(tests(worse))} + {testsWorse(suiteSummary.worse.length)} - {!context.config.strict && {updateInstructions()}} + {!context.config.strict ? {updateInstructionsWorse()} : null} ) : null} - {expired ? {testExpired(tests(expired))}) : null} + {showIfHasCategory('removed', testsRemoved)} + {suiteSummary.obsolete.length ? ( + <> + + {testsObsolete(suiteSummary.obsolete.length)} + + {{updateInstructionsObsolete()}} + + ) : null} + {showIfHasCategory('expired', testsExpired)} - {context.config.ci && suiteSummary.changed.length ? ( + {unexpectedChangesDetected && !fileContentChanges ? ( - {unexpectedChanges()} + {unexpectedChanges()} {suiteSummary.changed.map((name) => ( "{name}" ))} - {unexpectedChangesInstructions()} + {unexpectedChangesInstructions()} + + + ) : null} + {fileContentChanges ? ( + + {stayedTheSameButChanged()} + {stayedTheSameButChangedInstructions()} + ) : null} ); }); -function tests(n: number): string { - return n === 1 ? `${n} test` : `${n} tests`; +function onlyFileContentsChanges(suiteSummary: BettererSuiteSummary): boolean { + // If every test name listed in `changed` is also the name of a test listed in `same`, + // the the actual contents of the files changed, but not the results: + return suiteSummary.changed.every( + (testName) => !!suiteSummary.same.find((runSummary) => runSummary.name === testName) + ); } diff --git a/packages/reporter/src/components/suite/WorkflowSuggestions.tsx b/packages/reporter/src/components/suite/WorkflowSuggestions.tsx new file mode 100644 index 000000000..3ea5d05e4 --- /dev/null +++ b/packages/reporter/src/components/suite/WorkflowSuggestions.tsx @@ -0,0 +1,17 @@ +import type { FC } from '@betterer/render'; + +import { Box, Link, React, Text } from '@betterer/render'; +import { workflowLink, workflowSuggestions } from '../../messages.js'; + +export const WorkflowSuggestions: FC = () => { + return ( + + {workflowSuggestions()} + + + Workflow Documentation + + + + ); +}; diff --git a/packages/reporter/src/components/suite/index.ts b/packages/reporter/src/components/suite/index.ts index 1cfdfafb7..0c23e3754 100644 --- a/packages/reporter/src/components/suite/index.ts +++ b/packages/reporter/src/components/suite/index.ts @@ -1 +1,4 @@ -export { Suite, SuiteProps } from './Suite.js'; +export type { SuiteSummaryProps } from './SuiteSummary.js'; + +export { Suite } from './Suite.js'; +export { SuiteSummary } from './SuiteSummary.js'; diff --git a/packages/reporter/src/components/suite/tasks.ts b/packages/reporter/src/components/suite/tasks.ts deleted file mode 100644 index c8c9527b3..000000000 --- a/packages/reporter/src/components/suite/tasks.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { BettererRun } from '@betterer/betterer'; -import type { BettererLogger } from '@betterer/logger'; -import type { BettererTask } from '@betterer/tasks'; - -import { BettererError } from '@betterer/errors'; -import { log__ } from '@betterer/logger'; - -import { - testBetter, - testComplete, - testExpired, - testFailed, - testNew, - testRunning, - testSame, - testSkipped, - testUpdated, - testWorse -} from '../../messages.js'; -import type { BettererReporterRun } from '../../types.js'; -import { quote } from '../../utils.js'; -import { getDelta } from './deltas/index.js'; - -const TASKS = new Map(); - -export function useTask(run: BettererRun): BettererTask { - const existingTask = TASKS.get(run); - if (existingTask) { - return existingTask; - } - - const task = async (logger: BettererLogger) => { - const name = quote(run.name); - await logger.progress(testRunning(name)); - - const runSummary = await (run as BettererReporterRun).lifecycle; - - if (runSummary.isExpired) { - await logger.warn(testExpired(name)); - } - - const delta = getDelta(runSummary); - - if (runSummary.isComplete) { - return testComplete(name, runSummary.isNew); - } - if (runSummary.isBetter) { - return testBetter(name, delta); - } - if (runSummary.isFailed) { - throw new BettererError(testFailed(name)); - } - if (runSummary.isNew) { - return testNew(name, delta); - } - if (runSummary.isSkipped) { - return testSkipped(name, delta); - } - if (runSummary.isSame) { - return testSame(name, delta); - } - if (runSummary.isUpdated && runSummary.diff) { - await log__(runSummary.diff.logs, logger); - return testUpdated(name, delta); - } - if (runSummary.isWorse && runSummary.diff) { - await log__(runSummary.diff.logs, logger); - throw new BettererError(testWorse(name, delta)); - } - return; - }; - TASKS.set(run, task); - return task; -} diff --git a/packages/reporter/src/components/suite/update.ts b/packages/reporter/src/components/suite/update.ts new file mode 100644 index 000000000..70bf4da0b --- /dev/null +++ b/packages/reporter/src/components/suite/update.ts @@ -0,0 +1,13 @@ +import type { BettererTasksState } from '@betterer/tasks'; + +export function update(state: BettererTasksState): string { + const { done, errors, running } = state; + const runningStatus = running ? `${tests(running)} running... ` : ''; + const doneStatus = done ? `${tests(done)} done! ` : ''; + const errorStatus = errors ? `${tests(errors)} errored! ` : ''; + return `${runningStatus}${doneStatus}${errorStatus}`; +} + +function tests(n: number): string { + return `${String(n)} ${n === 1 ? 'test' : 'tests'}`; +} diff --git a/packages/reporter/src/components/watch/WatchFiles.tsx b/packages/reporter/src/components/watch/WatchFiles.tsx index 3ee44806d..74f6e700f 100644 --- a/packages/reporter/src/components/watch/WatchFiles.tsx +++ b/packages/reporter/src/components/watch/WatchFiles.tsx @@ -1,4 +1,4 @@ -import type { BettererContext, BettererSuite } from '@betterer/betterer'; +import type { BettererContext, BettererFilePaths } from '@betterer/betterer'; import type { FC } from '@betterer/render'; import type { ConfigEditField } from '../config/index.js'; @@ -8,40 +8,38 @@ import { React, Box, Text, memo } from '@betterer/render'; import { filesChecked, filesChecking, testsChanged } from '../../messages.js'; import { Config } from '../config/index.js'; +/** @knipignore used by an exported function */ export interface WatchFilesProps { context: BettererContext; editField: ConfigEditField; - suite: BettererSuite; + filePaths: BettererFilePaths; running: boolean; } export const WatchFiles: FC = memo(function WatchFiles(props) { - const { context, editField, suite, running } = props; - const { filePaths } = suite; + const { context, editField, filePaths, running } = props; - const isTestChange = context.config.configPaths.some((configPath) => filePaths.includes(configPath)); + const isTestChange = filePaths.length === 0; + + if (isTestChange) { + return ( + + {testsChanged()} + + ); + } return ( <> - {filePaths?.length ? ( - <> - {isTestChange ? ( - - {testsChanged()} - - ) : ( - - {running ? filesChecking(filePaths.length) : filesChecked(filePaths.length)} - - )} - - {filePaths.map((filePath) => ( - ・ {filePath} - ))} - - - ) : null} + + {running ? filesChecking(filePaths.length) : filesChecked(filePaths.length)} + + + {filePaths.map((filePath) => ( + ・ {filePath} + ))} + ); }); diff --git a/packages/reporter/src/components/watch/WatchInstructions.tsx b/packages/reporter/src/components/watch/WatchInstructions.tsx index 63a221af8..78a5343ea 100644 --- a/packages/reporter/src/components/watch/WatchInstructions.tsx +++ b/packages/reporter/src/components/watch/WatchInstructions.tsx @@ -1,11 +1,19 @@ import type { FC } from '@betterer/render'; +import type { ConfigEditField } from '../config/Config.js'; + import { React, Box, Text, memo } from '@betterer/render'; -export const WatchInstructions: FC = memo(function WatchInstructions() { +/** @knipignore used by an exported function */ +export interface WatchFilesProps { + editField: ConfigEditField; +} + +export const WatchInstructions: FC = memo(function WatchInstructions(props) { + const quitCommands = `"ctrl+c"${props.editField ? '' : ' or "q"'}`; return ( - (press "q" to quit) + (press {quitCommands} to quit) ); }); diff --git a/packages/reporter/src/components/watch/WatchReporter.tsx b/packages/reporter/src/components/watch/WatchReporter.tsx index c06229f7f..e23242d0b 100644 --- a/packages/reporter/src/components/watch/WatchReporter.tsx +++ b/packages/reporter/src/components/watch/WatchReporter.tsx @@ -1,35 +1,34 @@ import type { FC } from '@betterer/render'; -import type { BettererReporterState } from '../../state/index.js'; - import { React, memo } from '@betterer/render'; -import { Suite } from '../suite/index.js'; +import { useReporterState } from '../../state/index.js'; +import { Suite, SuiteSummary } from '../suite/index.js'; import { WatchEnding } from './WatchEnding.js'; import { WatchFiles } from './WatchFiles.js'; import { WatchInstructions } from './WatchInstructions.js'; import { WatchStarting } from './WatchStarting.js'; import { useControls } from './useControls.js'; -export const WatchReporter: FC = memo(function WatchReporter(props) { - const { context, contextSummary, done, suiteSummary } = props; - const suite = props.suiteSummary || props.suite; +export const WatchReporter: FC = memo(function WatchReporter() { + const [{ context, contextSummary, suite, suiteSummary }] = useReporterState(); - const editing = useControls(context); + const editField = useControls(context); if (contextSummary) { return ; } - if (suite) { - return ( - <> - - - - - ); + if (!suite) { + return ; } - return ; + return ( + <> + + {!suiteSummary && } + {suiteSummary && } + + + ); }); diff --git a/packages/reporter/src/components/watch/WatchStarting.tsx b/packages/reporter/src/components/watch/WatchStarting.tsx index 29fa7db7b..c911e7cb3 100644 --- a/packages/reporter/src/components/watch/WatchStarting.tsx +++ b/packages/reporter/src/components/watch/WatchStarting.tsx @@ -9,6 +9,7 @@ import { watchStart } from '../../messages.js'; import { Config } from '../config/index.js'; import { WatchInstructions } from './WatchInstructions.js'; +/** @knipignore used by an exported function */ export interface WatchStartingProps { context: BettererContext; editField: ConfigEditField; @@ -23,7 +24,7 @@ export const WatchStarting: FC = memo(function WatchStarting {watchStart()} - + ); }); diff --git a/packages/reporter/src/components/watch/useControls.ts b/packages/reporter/src/components/watch/useControls.ts index 3b05c75b4..f19d69d5e 100644 --- a/packages/reporter/src/components/watch/useControls.ts +++ b/packages/reporter/src/components/watch/useControls.ts @@ -2,44 +2,47 @@ import type { BettererContext } from '@betterer/betterer'; import type { ConfigEditField } from '../config/index.js'; -import { useInput, useState, useStdin } from '@betterer/render'; +import { useEffect, useState, useStdin } from '@betterer/render'; +// Stolen mostly from ink's `useInput` hook. export function useControls(context: BettererContext): ConfigEditField { - const { isRawModeSupported } = useStdin(); - + const { stdin } = useStdin(); const [editing, setEditing] = useState(null); - const canEdit = isRawModeSupported; - const useEdit = canEdit ? useInput : () => void 0; - - isRawModeSupported && - useEdit((input, key) => { - if (key.return) { - setEditing(null); + useEffect(() => { + function handleData(data: string) { + const input = String(data); + const isReturn = input === '\r'; + const isEscape = input === '\u001B'; + + if (editing) { + if (isReturn || isEscape) { + setEditing(null); + return; + } return; } - if (key.escape) { + if (isEscape || input === 'q') { void context.stop(); return; } - if (editing != null) { - return; - } - - // Don't exit on 'q' if the user is editing filters or ignores: - if (input === 'q') { - void context.stop(); - } - if (input === 'f') { setEditing('filters'); + return; } + if (input === 'i') { setEditing('ignores'); + return; } - }); + } + stdin?.on('data', handleData); + return () => { + stdin?.off('data', handleData); + }; + }, [editing]); return editing; } diff --git a/packages/reporter/src/components/suite/deltas/delta.ts b/packages/reporter/src/deltas/delta.ts similarity index 82% rename from packages/reporter/src/components/suite/deltas/delta.ts rename to packages/reporter/src/deltas/delta.ts index 26469cd08..0829ece6c 100644 --- a/packages/reporter/src/components/suite/deltas/delta.ts +++ b/packages/reporter/src/deltas/delta.ts @@ -4,7 +4,7 @@ import { fileTestDelta } from './file-test-delta.js'; export function getDelta(runSummary: BettererRunSummary): string { if (runSummary.filePaths != null) { - return fileTestDelta(runSummary.delta) || ''; + return fileTestDelta(runSummary.delta); } return ''; } diff --git a/packages/reporter/src/components/suite/deltas/file-test-delta.ts b/packages/reporter/src/deltas/file-test-delta.ts similarity index 69% rename from packages/reporter/src/components/suite/deltas/file-test-delta.ts rename to packages/reporter/src/deltas/file-test-delta.ts index 5f9008f52..faaa75aae 100644 --- a/packages/reporter/src/components/suite/deltas/file-test-delta.ts +++ b/packages/reporter/src/deltas/file-test-delta.ts @@ -2,25 +2,25 @@ import type { BettererDelta } from '@betterer/betterer'; const formatter = Intl.NumberFormat(); -export function fileTestDelta(delta: BettererDelta | null): string | null { +export function fileTestDelta(delta: BettererDelta | null): string { if (!delta) { return ''; } const { baseline, diff, result } = delta; const resultFormatted = formatter.format(result); - if (diff === 0) { + if (baseline == null || diff === 0) { return ` (${resultFormatted} ${getIssuesStr(result)})`; } + const diffIssues = getIssuesStr(diff); - if (baseline != null && diff < 0) { + if (diff < 0) { const diffFormatted = formatter.format(-diff); return ` (${diffFormatted} fixed ${diffIssues}, ${resultFormatted} remaining)`; } - if (baseline != null && diff > 0) { - const diffFormatted = formatter.format(diff); - return ` (${diffFormatted} new ${diffIssues}, ${resultFormatted} total)`; - } - return ''; + + const diffFormatted = formatter.format(diff); + const existingFormatted = formatter.format(result - diff); + return ` (${diffFormatted} new ${diffIssues}, ${existingFormatted} existing, ${resultFormatted} total)`; } function getIssuesStr(n: number): string { diff --git a/packages/reporter/src/components/suite/deltas/index.ts b/packages/reporter/src/deltas/index.ts similarity index 100% rename from packages/reporter/src/components/suite/deltas/index.ts rename to packages/reporter/src/deltas/index.ts diff --git a/packages/reporter/src/index.ts b/packages/reporter/src/index.ts index 3bd784491..90d119c07 100644 --- a/packages/reporter/src/index.ts +++ b/packages/reporter/src/index.ts @@ -4,4 +4,4 @@ * @packageDocumentation */ -export { reporter, createReporter__ } from './reporter.js'; +export { reporter, createReporterΔ } from './reporter.js'; diff --git a/packages/reporter/src/messages.ts b/packages/reporter/src/messages.ts index 58c1f3f8f..deaee63c3 100644 --- a/packages/reporter/src/messages.ts +++ b/packages/reporter/src/messages.ts @@ -1,59 +1,145 @@ -export function testBetter(context: string, delta = ''): string { - return `${context} got better!${delta} 😍`; +export function testBetter(name: string, delta = ''): string { + return `${name} got better!${delta} 😍`; } -export function testChecked(context: string): string { - return `${context} got checked. 🤔`; + +export function testsBetter(count: number, delta = ''): string { + return testBetter(getTests(count), delta); +} + +function testChecked(name: string): string { + return `${name} got checked. 🤔`; +} + +export function testsChecked(count: number): string { + return testChecked(getTests(count)); +} + +export function testComplete(name: string, isSame = false): string { + return `${name}${isSame ? ` ${getHas(1)} already` : ''} met ${getIts(1)} goal! ${isSame ? '✨' : '🎉'}`; +} + +export function testsComplete(count: number): string { + return `${getTests(count)} met ${getIts(count)} goal! 🎉`; +} + +export function testExpired(name: string): string { + return `${name} ${getHas(1)} passed ${getIts(1)} deadline. 👻`; +} + +export function testsExpired(count: number): string { + return `${getTests(count)} ${getHas(count)} passed ${getIts(count)} deadline. 👻`; +} + +function testFailed(name: string): string { + return `${name} failed to run. 🔥`; +} + +export function testsFailed(count: number): string { + return testFailed(getTests(count)); +} + +export function testNew(name: string, delta = ''): string { + return `${name} got checked for the first time!${delta} 🎉`; +} + +export function testsNew(count: number, delta = ''): string { + return testNew(getTests(count), delta); +} + +export function testObsolete(name: string): string { + return `${name} ${getIs(1)} obsolete! 🗑️`; +} + +export function testsObsolete(count: number): string { + return `${getTests(count)} ${getIs(count)} obsolete! 🗑️`; +} + +export function testRemoved(name: string): string { + return `${name} got removed! 👋🏻`; +} + +export function testsRemoved(count: number): string { + return testRemoved(getTests(count)); } -export function testComplete(context: string, isNew = false): string { - return `${context}${isNew ? ' has already' : ''} met its goal! ${isNew ? '✨' : '🎉'}`; + +export function testRunning(name: string): string { + return `running ${name}!`; } -export function testExpired(context: string): string { - return `${context} has passed its deadline. 👻`; + +export function testSame(name: string, delta = ''): string { + return `${name} stayed the same.${delta} 😐`; } -export function testFailed(context: string): string { - return `${context} failed to run. 🔥`; + +export function testsSame(count: number, delta = ''): string { + return testSame(getTests(count), delta); } -export function testNew(context: string, delta = ''): string { - return `${context} got checked for the first time!${delta} 🎉`; + +export function testSkipped(name: string, delta = ''): string { + return `${name} got skipped.${delta} 🚫`; } -export function testRunning(context: string): string { - return `running ${context}!`; + +export function testsSkipped(count: number, delta = ''): string { + return testSkipped(getTests(count), delta); } -export function testSame(context: string, delta = ''): string { - return `${context} stayed the same.${delta} 😐`; + +export function testUpdated(name: string, delta = ''): string { + return `${name} got force updated.${delta} 🆙`; } -export function testSkipped(context: string, delta = ''): string { - return `${context} got skipped.${delta} 🚫`; + +export function testsUpdated(count: number, delta = ''): string { + return testUpdated(getTests(count), delta); } -export function testUpdated(context: string, delta = ''): string { - return `${context} got force updated.${delta} 🆙`; + +export function testWorse(name: string, delta = ''): string { + return `${name} got worse.${delta} 😔`; } -export function testWorse(context: string, delta = ''): string { - return `${context} got worse.${delta} 😔`; + +export function testsWorse(count: number, delta = ''): string { + return testWorse(getTests(count), delta); } export function testsChanged(): string { return 'Your tests have changed, re-checking everything...\nThis could take a sec. ⏰'; } -export function updateInstructions(): string { +export function updateInstructionsWorse(): string { return 'You should try to fix the new issues! As a last resort, you can run `betterer --update` to force an update of the results file. 🆙'; } +export function updateInstructionsObsolete(): string { + return 'You have saved tests results that no longer have tests! If they are no longer needed, you can run `betterer --update` to remove the obsolete results from the results file. 🆙'; +} + export function unexpectedChanges(): string { return 'Unexpected changes detected in these tests while running in CI mode:'; } export function unexpectedChangesInstructions(): string { - return 'You should make sure the results file is up-to-date before committing! You might want to run `betterer precommit` in a commit hook. 💍'; + return 'You should make sure the results file is up-to-date before committing!'; +} + +export function stayedTheSameButChanged(): string { + return 'All test results stayed the same, but your code has changed in other ways!'; +} + +export function stayedTheSameButChangedInstructions(): string { + return 'You should make sure the results file is up-to-date before committing, and also after a rebase! 🔃'; +} + +export function workflowSuggestions() { + return 'Check out some suggestions to improve your workflow in the docs:'; +} + +export function workflowLink() { + return 'https://phenomnomnominal.github.io/betterer/docs/workflow'; } export function filesChecking(files: number): string { - return `Checking ${files} ${getFiles(files)}... 🤔`; + return `Checking ${getFiles(files)}... 🤔`; } export function filesChecked(files: number): string { - return `Checked ${files} ${getFiles(files)}! 🔍`; + return `Checked ${getFiles(files)}! 🔍`; } export function watchStart(): string { @@ -65,5 +151,21 @@ export function watchEnd(): string { } function getFiles(count: number): string { - return count === 1 ? 'file' : 'files'; + return count === 1 ? '1 file' : `${String(count)} files`; +} + +function getTests(count: number): string { + return count === 1 ? '1 test' : `${String(count)} tests`; +} + +function getIs(count: number): string { + return count === 1 ? 'is' : 'are'; +} + +function getHas(count: number): string { + return count === 1 ? 'has' : 'have'; +} + +function getIts(count: number): string { + return count === 1 ? 'its' : 'their'; } diff --git a/packages/reporter/src/reporter.tsx b/packages/reporter/src/reporter.tsx index 8aadff93b..a537ab165 100644 --- a/packages/reporter/src/reporter.tsx +++ b/packages/reporter/src/reporter.tsx @@ -2,17 +2,53 @@ import type { BettererContext, BettererContextSummary, BettererReporter, + BettererRun, + BettererRunLogger, + BettererRunSummary, BettererSuite, BettererSuiteSummary } from '@betterer/betterer'; +import type { BettererLog, BettererLoggerCodeInfo, BettererLoggerMessage, BettererLogs } from '@betterer/logger'; +import type { FC, Instance } from '@betterer/render'; + +import type { BettererReporterAction, BettererReporterState } from './state/index.js'; + import type { BettererError } from '@betterer/errors'; -import type { Instance } from '@betterer/render'; -import type { BettererReporterAction } from './state/index.js'; -import type { BettererReporterRenderer } from './types.js'; +import { diffΔ } from '@betterer/logger'; +import { React, getRenderOptionsΔ, render } from '@betterer/render'; -import { React, getRenderOptions, render } from '@betterer/render'; import { Error, Reporter } from './components/index.js'; -import { contextEnd, createStore, suiteEnd, suiteStart } from './state/index.js'; +import { getDelta } from './deltas/index.js'; +import { + testBetter, + testComplete, + testExpired, + testNew, + testObsolete, + testRemoved, + testRunning, + testSame, + testSkipped, + testUpdated, + testWorse +} from './messages.js'; +import { + BettererReporterContext, + contextEnd, + runEnd, + runError, + runStart, + suiteEnd, + suiteError, + suiteStart, + useStore +} from './state/index.js'; +import { getPreciseTimeΔ } from '@betterer/time'; + +const DIFF_OPTIONS = { + aAnnotation: 'Expected', + bAnnotation: 'Result' +}; /** * @public The default {@link @betterer/betterer#BettererReporter | `BettererReporter`}. @@ -22,70 +58,188 @@ import { contextEnd, createStore, suiteEnd, suiteStart } from './state/index.js' * to handle all the fancy terminal rerendering. It also means we can do cool stuff like dynamic * settings in `betterer watch` mode. */ -export const reporter: BettererReporter = createReporter__(); +export const reporter: BettererReporter = createReporterΔ(); /** * @internal This could change at any point! Please don't use! * - * @remarks used in {@link @betterer/betterer#BettererReporter | `BettererReporter`} to make sure there is always a fresh default Reporter + * Used in {@link @betterer/betterer#BettererReporter | `BettererReporter`} to make + * sure there is always a fresh default Reporter. */ -export function createReporter__(): BettererReporter { - const renderOptions = getRenderOptions(process.env.NODE_ENV, { +export function createReporterΔ(): BettererReporter { + const renderOptions = getRenderOptionsΔ(process.env.NODE_ENV, { exitOnCtrlC: false }); - let renderer: BettererReporterRenderer; + let app: Instance; + let dispatch: React.Dispatch; + + let logs: Record = {}; + let status: Record = {}; + + const logger = createLogger((run: BettererRun, message: BettererLog) => { + const runLogs = logs[run.name] ?? []; + runLogs.push(message); + logs[run.name] = runLogs; + }); + const statusLogger = createLogger((run: BettererRun, message: BettererLog) => { + status[run.name] = message; + }); + + const ReporterRoot: FC = (props) => { + const store = useStore(props); + const [state] = store; + [, dispatch] = store; + + return ( + + + + ); + }; + + function createLogger(handler: (run: BettererRun, log: BettererLog) => void): BettererRunLogger { + return { + code(run: BettererRun, code: BettererLoggerCodeInfo): void { + handler(run, { code }); + }, + debug(run: BettererRun, debug: BettererLoggerMessage): void { + handler(run, { debug }); + }, + error(run: BettererRun, error: BettererLoggerMessage): void { + handler(run, { error }); + }, + info(run: BettererRun, info: BettererLoggerMessage): void { + handler(run, { info }); + }, + progress(run: BettererRun, progress: BettererLoggerMessage): void { + handler(run, { progress }); + }, + success(run: BettererRun, success: BettererLoggerMessage): void { + handler(run, { success }); + }, + warn(run: BettererRun, warn: BettererLoggerMessage): void { + handler(run, { warn }); + } + }; + } return { + runLogger: logger, configError(_: unknown, error: BettererError): void { renderError(error); }, contextStart(context: BettererContext): void { - renderer = createRenderer(context); - renderer.render(); + const initialState = { + context, + + done: 0, + running: 0, + errors: 0, + startTime: getPreciseTimeΔ(), + endTime: null + }; + app = render(, renderOptions); }, contextEnd(contextSummary: BettererContextSummary): void { - renderer.render(contextEnd(contextSummary)); - renderer.stop(); + dispatch(contextEnd(contextSummary)); + app.unmount(); }, contextError(context: BettererContext, error: BettererError): void { + app.unmount(); renderError(error, context.config.logo); }, - suiteStart(suite: BettererSuite): Promise { - return new Promise((resolve) => { - renderer.render(suiteStart(suite), resolve); - }); + suiteStart(suite: BettererSuite): void { + logs = {}; + status = {}; + dispatch(suiteStart(suite)); }, suiteEnd(suiteSummary: BettererSuiteSummary): void { - renderer.render(suiteEnd(suiteSummary)); + dispatch(suiteEnd(suiteSummary)); + }, + suiteError(suite: BettererSuiteSummary, error: BettererError): void { + dispatch(suiteError(suite, error)); + }, + async runStart(run: BettererRun): Promise { + await statusLogger.progress(run, testRunning(quote(run.name))); + dispatch(runStart(run)); + }, + async runEnd(runSummary: BettererRunSummary): Promise { + await logRunSummary(runSummary); + dispatch(runEnd(runSummary)); + }, + async runError(runSummary: BettererRunSummary, error: BettererError): Promise { + await statusLogger.error(runSummary, error.message); + dispatch(runError(runSummary, error)); } }; function renderError(error: BettererError, logo = false): void { - render(, renderOptions); + const app = render(, renderOptions); + app.unmount(); } - function createRenderer(context: BettererContext): BettererReporterRenderer { - let app: Instance; + async function logRunSummary(runSummary: BettererRunSummary): Promise { + const name = quote(runSummary.name); - const dispatch = createStore(context); + if (runSummary.isExpired) { + await logger.warn(runSummary, testExpired(name)); + } - return { - render(action?: BettererReporterAction, done?: () => void): void { - const state = dispatch(action); - // eslint-disable-next-line no-console -- Clear the console before re-rendering the CLI UI: - console.clear(); - - const component = ; - if (!app) { - app = render(component, renderOptions); - } else { - app.rerender(component); - } - }, - stop() { - app.unmount(); + if (runSummary.isComplete) { + await statusLogger.success(runSummary, testComplete(name, runSummary.isSame)); + return; + } + + const delta = getDelta(runSummary); + + if (runSummary.isBetter) { + await statusLogger.success(runSummary, testBetter(name, delta)); + return; + } + if (runSummary.isNew) { + await statusLogger.success(runSummary, testNew(name, delta)); + return; + } + if (runSummary.isObsolete && !runSummary.isRemoved) { + await statusLogger.success(runSummary, testObsolete(name)); + return; + } + if (runSummary.isRemoved) { + await statusLogger.success(runSummary, testRemoved(name)); + return; + } + if (runSummary.isSkipped) { + await statusLogger.success(runSummary, testSkipped(name, delta)); + return; + } + if (runSummary.isSame) { + await statusLogger.success(runSummary, testSame(name, delta)); + return; + } + + const { diff, expected, result } = runSummary; + if (diff?.diff === null && expected && result) { + const diffStr = diffΔ(expected.value, result.value, DIFF_OPTIONS); + if (diffStr) { + await logger.error(runSummary, diffStr); } - }; + } + + if (runSummary.isWorse && !runSummary.isUpdated) { + await statusLogger.error(runSummary, testWorse(name, delta)); + return; + } + if (runSummary.isUpdated) { + await statusLogger.success(runSummary, testUpdated(name, delta)); + return; + } + + // Should never get here. Note that `isFailed` isn't covered here because + // that will trigger the `runError()` hook. } } + +function quote(str: string): string { + return `"${str.replace(/^"/, '').replace(/"$/, '')}"`; +} diff --git a/packages/reporter/src/state/actions.ts b/packages/reporter/src/state/actions.ts index 494bc7f38..8278d6647 100644 --- a/packages/reporter/src/state/actions.ts +++ b/packages/reporter/src/state/actions.ts @@ -1,43 +1,97 @@ -import type { BettererSuiteSummary, BettererContextSummary, BettererSuite } from '@betterer/betterer'; +import type { + BettererContextSummary, + BettererRun, + BettererRunSummary, + BettererSuite, + BettererSuiteSummary +} from '@betterer/betterer'; +import type { BettererError } from '@betterer/errors'; export const CONTEXT_END = 'contextEnd'; -export const SUITE_START = 'suiteStart'; +export const RUN_END = 'runEnd'; +export const RUN_ERROR = 'runError'; +export const RUN_START = 'runStart'; export const SUITE_END = 'suiteEnd'; +export const SUITE_ERROR = 'suiteError'; +export const SUITE_START = 'suiteStart'; +/** @knipignore used by an exported function */ export interface BettererContextEndAction { name: typeof CONTEXT_END; contextSummary: BettererContextSummary; } -export interface BettererSuiteStartAction { - name: typeof SUITE_START; - suite: BettererSuite; +/** @knipignore used by an exported function */ +export interface BettererRunEndAction { + name: typeof RUN_END; + runSummary: BettererRunSummary; +} + +/** @knipignore used by an exported function */ +export interface BettererRunErrorAction { + name: typeof RUN_ERROR; + runSummary: BettererRunSummary; + error: BettererError; } +/** @knipignore used by an exported function */ +export interface BettererRunStartAction { + name: typeof RUN_START; + run: BettererRun; +} + +/** @knipignore used by an exported function */ export interface BettererSuiteEndAction { name: typeof SUITE_END; suiteSummary: BettererSuiteSummary; } -export type BettererReporterAction = BettererContextEndAction | BettererSuiteStartAction | BettererSuiteEndAction; +/** @knipignore used by an exported function */ +export interface BettererSuiteErrorAction { + name: typeof SUITE_ERROR; + suiteSummary: BettererSuiteSummary; + error: BettererError; +} + +/** @knipignore used by an exported function */ +export interface BettererSuiteStartAction { + name: typeof SUITE_START; + suite: BettererSuite; +} + +export type BettererReporterAction = + | BettererContextEndAction + | BettererRunEndAction + | BettererRunErrorAction + | BettererRunStartAction + | BettererSuiteEndAction + | BettererSuiteErrorAction + | BettererSuiteStartAction; export function contextEnd(contextSummary: BettererContextSummary): BettererContextEndAction { - return { - name: CONTEXT_END, - contextSummary - }; + return { name: CONTEXT_END, contextSummary }; +} + +export function runEnd(runSummary: BettererRunSummary): BettererRunEndAction { + return { name: RUN_END, runSummary }; +} + +export function runError(runSummary: BettererRunSummary, error: BettererError): BettererRunErrorAction { + return { name: RUN_ERROR, runSummary, error }; +} + +export function runStart(run: BettererRun): BettererRunStartAction { + return { name: RUN_START, run }; } export function suiteStart(suite: BettererSuite): BettererSuiteStartAction { - return { - name: SUITE_START, - suite - }; + return { name: SUITE_START, suite }; } export function suiteEnd(suiteSummary: BettererSuiteSummary): BettererSuiteEndAction { - return { - name: SUITE_END, - suiteSummary - }; + return { name: SUITE_END, suiteSummary }; +} + +export function suiteError(suiteSummary: BettererSuiteSummary, error: BettererError): BettererSuiteErrorAction { + return { name: SUITE_ERROR, suiteSummary, error }; } diff --git a/packages/reporter/src/state/index.ts b/packages/reporter/src/state/index.ts index fddf0c3fd..ef6315d8b 100644 --- a/packages/reporter/src/state/index.ts +++ b/packages/reporter/src/state/index.ts @@ -1,14 +1,26 @@ export { - CONTEXT_END, - SUITE_END, - SUITE_START, BettererContextEndAction, BettererReporterAction, - BettererSuiteStartAction, + BettererRunEndAction, + BettererRunErrorAction, + BettererRunStartAction, BettererSuiteEndAction, + BettererSuiteErrorAction, + BettererSuiteStartAction, + CONTEXT_END, + RUN_END, + RUN_ERROR, + RUN_START, + SUITE_END, + SUITE_ERROR, + SUITE_START, contextEnd, - suiteStart, - suiteEnd + runEnd, + runError, + runStart, + suiteEnd, + suiteError, + suiteStart } from './actions.js'; -export { createStore } from './store.js'; +export { BettererReporterContext, useStore, useReporterState } from './store.js'; export { BettererReporterState } from './types.js'; diff --git a/packages/reporter/src/state/store.ts b/packages/reporter/src/state/store.ts index e946eca0b..27f619198 100644 --- a/packages/reporter/src/state/store.ts +++ b/packages/reporter/src/state/store.ts @@ -1,12 +1,31 @@ -import type { BettererContext } from '@betterer/betterer'; +import type { BettererLog, BettererLogs } from '@betterer/logger'; import type { BettererReporterAction } from './actions.js'; -import type { BettererReporterDispatch, BettererReporterState } from './types.js'; +import type { BettererReporterState } from './types.js'; -import { CONTEXT_END, SUITE_END, SUITE_START } from './actions.js'; +import { invariantΔ } from '@betterer/errors'; +import { createContext, useContext, useReducer } from '@betterer/render'; +import { getPreciseTimeΔ } from '@betterer/time'; -export function createStore(context: BettererContext): BettererReporterDispatch { - const reducer = (state: BettererReporterState, action: BettererReporterAction): BettererReporterState => { +import { CONTEXT_END, RUN_END, RUN_ERROR, RUN_START, SUITE_END, SUITE_ERROR, SUITE_START } from './actions.js'; + +type BettererReporterLogs = Record; +type BettererReporterStatus = Record; + +export const BettererReporterContext = createContext< + [BettererReporterState, BettererReporterLogs, BettererReporterStatus] | null +>(null); + +export function useReporterState(): [BettererReporterState, BettererReporterLogs, BettererReporterStatus] { + const context = useContext(BettererReporterContext); + invariantΔ(context, 'Trying to use `BettererReporterContext` before it was created!'); + return context; +} + +export function useStore( + initialState: BettererReporterState +): [BettererReporterState, React.Dispatch] { + return useReducer((state: BettererReporterState, action: BettererReporterAction): BettererReporterState => { switch (action.name) { case CONTEXT_END: { return { @@ -14,27 +33,79 @@ export function createStore(context: BettererContext): BettererReporterDispatch contextSummary: action.contextSummary }; } - case SUITE_START: { + + case RUN_END: { + const { runSummary } = action; + + // `isFailed` will be handled by `RUN_ERROR`: + const error = runSummary.isWorse && !runSummary.isUpdated; + const running = state.running - 1; + const allDone = running === 0; + + return { + ...state, + + running, + done: state.done + 1, + errors: state.errors + (error ? 1 : 0), + endTime: allDone ? getPreciseTimeΔ() : null + }; + } + + case RUN_ERROR: { + const running = state.running - 1; + const allDone = running === 0; + + return { + ...state, + running, + done: state.done + 1, + errors: state.errors + 1, + endTime: allDone ? getPreciseTimeΔ() : null + }; + } + + case RUN_START: { return { - context: state.context, - suite: action.suite + ...state, + running: state.running + 1 }; } + case SUITE_END: { return { - context: state.context, + ...state, suiteSummary: action.suiteSummary }; } - } - }; - let state: BettererReporterState = { context }; - return function dispatch(action?: BettererReporterAction): BettererReporterState { - if (!action) { - return state; + case SUITE_ERROR: { + return { + ...state, + suiteSummary: action.suiteSummary + }; + } + + case SUITE_START: { + const runsLogs: Record = {}; + const runsStatus: Record = {}; + action.suite.runs.forEach((run) => { + runsLogs[run.name] = []; + runsStatus[run.name] = {}; + }); + + return { + ...state, + suite: action.suite, + suiteSummary: void 0, + + done: 0, + running: 0, + errors: 0, + startTime: getPreciseTimeΔ(), + endTime: null + }; + } } - state = reducer(state, action); - return state; - }; + }, initialState); } diff --git a/packages/reporter/src/state/types.ts b/packages/reporter/src/state/types.ts index afa937e45..d0d0071f9 100644 --- a/packages/reporter/src/state/types.ts +++ b/packages/reporter/src/state/types.ts @@ -1,14 +1,9 @@ -import type { BettererContext, BettererSuite, BettererSuiteSummary, BettererContextSummary } from '@betterer/betterer'; -import type { BettererTasksDone } from '@betterer/tasks'; +import type { BettererContext, BettererContextSummary, BettererSuite, BettererSuiteSummary } from '@betterer/betterer'; +import type { BettererTasksState } from '@betterer/tasks'; -import type { BettererReporterAction } from './actions.js'; - -export interface BettererReporterState { +export interface BettererReporterState extends BettererTasksState { context: BettererContext; contextSummary?: BettererContextSummary; - done?: BettererTasksDone; suite?: BettererSuite; suiteSummary?: BettererSuiteSummary; } - -export type BettererReporterDispatch = (action?: BettererReporterAction) => BettererReporterState; diff --git a/packages/reporter/src/types.ts b/packages/reporter/src/types.ts index e591c2610..8700ab5cc 100644 --- a/packages/reporter/src/types.ts +++ b/packages/reporter/src/types.ts @@ -1,13 +1,5 @@ import type { BettererRun, BettererRunSummary } from '@betterer/betterer'; -import type { BettererTasksDone } from '@betterer/tasks'; - -import type { BettererReporterAction } from './state/index.js'; - -export interface BettererReporterRenderer { - render: (action?: BettererReporterAction, done?: BettererTasksDone) => void; - stop: () => void; -} export type BettererReporterRun = BettererRun & { - lifecycle: Promise; + lifecycle: ReturnType>; }; diff --git a/packages/reporter/src/utils.ts b/packages/reporter/src/utils.ts deleted file mode 100644 index 222ab18d8..000000000 --- a/packages/reporter/src/utils.ts +++ /dev/null @@ -1,9 +0,0 @@ -export function quote(str: string): string { - if (!str.startsWith('"')) { - str = `"${str}`; - } - if (!str.endsWith('"')) { - str = `${str}"`; - } - return str; -} diff --git a/packages/stylelint/CHANGELOG.md b/packages/stylelint/CHANGELOG.md index a5e89e2c7..562c9f7e3 100644 --- a/packages/stylelint/CHANGELOG.md +++ b/packages/stylelint/CHANGELOG.md @@ -3,6 +3,31 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/stylelint + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) + + +### Features + +* **betterer ✨:** add more details to file issues ([#1211](https://github.com/phenomnomnominal/betterer/issues/1211)) ([5a53e45](https://github.com/phenomnomnominal/betterer/commit/5a53e45b4d51e643458c21bd911b5500e698a1a8)) +* **betterer ✨:** specify different cache strategies ([#1232](https://github.com/phenomnomnominal/betterer/issues/1232)) ([df77035](https://github.com/phenomnomnominal/betterer/commit/df7703537910c320c0444e26582e8436947ff00d)) + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) **Note:** Version bump only for package @betterer/stylelint diff --git a/packages/stylelint/LICENSE.md b/packages/stylelint/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/stylelint/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/stylelint/package.json b/packages/stylelint/package.json index 9472ace88..74591d607 100644 --- a/packages/stylelint/package.json +++ b/packages/stylelint/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/stylelint", "description": "Stylelint test for @betterer/betterer", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,12 +26,11 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "tslib": "^2.3.1" + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" }, "devDependencies": { "@types/stylelint": "^13.13.1", @@ -39,5 +39,6 @@ }, "peerDependencies": { "stylelint": "^13.0.0" - } + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/stylelint/src/stylelint.ts b/packages/stylelint/src/stylelint.ts index ba47e81b3..d75addb32 100644 --- a/packages/stylelint/src/stylelint.ts +++ b/packages/stylelint/src/stylelint.ts @@ -11,8 +11,8 @@ import { lint } from 'stylelint'; * as you like: * * @remarks {@link @betterer/stylelint#stylelint | `stylelint`} is a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, - * so you can use {@link @betterer/betterer#BettererFileTest.include | `include()`}, {@link @betterer/betterer#BettererFileTest.exclude | `exclude()`}, - * {@link @betterer/betterer#BettererFileTest.only | `only()`}, and {@link @betterer/betterer#BettererFileTest.skip | `skip()`}. + * so you can use {@link @betterer/betterer#BettererResolverTest.include | `include()`}, {@link @betterer/betterer#BettererResolverTest.exclude | `exclude()`}, + * {@link @betterer/betterer#BettererTest.only | `only()`}, and {@link @betterer/betterer#BettererTest.skip | `skip()`}. * * @example * ```typescript @@ -36,6 +36,10 @@ import { lint } from 'stylelint'; * Will throw if the user doesn't pass `configOverrides`. */ export function stylelint(configOverrides: Partial): BettererFileTest { + // The `stylelint` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `configOverrides?: Partial`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! if (!configOverrides) { throw new BettererError( 'for `@betterer/stylelint` to work, you need to provide configuration options, e.g. `{ rules: { "unit-no-unknown": true } }`. ❌' @@ -55,12 +59,19 @@ export function stylelint(configOverrides: Partial): BettererFile await Promise.all( result.results.map(async (result) => { const contents = await fs.readFile(result.source, 'utf8'); - const file = fileTestResult.addFile(result.source, contents); + const resultFile = fileTestResult.addFile(result.source, contents); result.warnings.forEach((warning) => { - const { line, column, text } = warning; - file.addIssue(line - 1, column - 1, line - 1, column - 1, text, text); + const { line, column, text, rule } = warning; + resultFile.addIssue(line - 1, column - 1, line - 1, column - 1, stylelintIssueMessage(rule, text)); }); }) ); - }); + }).cache(); +} + +function stylelintIssueMessage(rule: string, message: string) { + let issueMessage = 'stylelint'; + issueMessage += rule ? `(${rule}): ` : ': '; + issueMessage += message.replace(new RegExp(`\\W\\(${rule}\\)$`, 'g'), ''); + return issueMessage; } diff --git a/packages/tasks/CHANGELOG.md b/packages/tasks/CHANGELOG.md index c522f90a9..dc9502d66 100644 --- a/packages/tasks/CHANGELOG.md +++ b/packages/tasks/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/tasks + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + +**Note:** Version bump only for package @betterer/tasks + + + + + ## [5.3.6](https://github.com/phenomnomnominal/betterer/compare/v5.3.5...v5.3.6) (2022-05-20) **Note:** Version bump only for package @betterer/tasks diff --git a/packages/tasks/LICENSE.md b/packages/tasks/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/tasks/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/tasks/api-extractor.json b/packages/tasks/api-extractor.json index 6f708a7f2..6923858f4 100644 --- a/packages/tasks/api-extractor.json +++ b/packages/tasks/api-extractor.json @@ -1,4 +1,14 @@ { "extends": "../../api-extractor.json", - "mainEntryPointFilePath": "./dist/index.d.ts" + "mainEntryPointFilePath": "./dist/index.d.ts", + + "messages": { + "extractorMessageReporting": { + // We add a suffix Δ instead + "ae-internal-missing-underscore": { + "logLevel": "none", + "addToApiReportFile": false + } + } + } } diff --git a/packages/tasks/package.json b/packages/tasks/package.json index 7e9164cda..4fdb0051b 100644 --- a/packages/tasks/package.json +++ b/packages/tasks/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/tasks", "description": "task runner and loggerr for @betterer/betterer", - "version": "5.3.6", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,14 +26,14 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/errors": "^5.3.0", - "@betterer/logger": "^5.3.4", - "@betterer/render": "^5.3.4", - "@betterer/time": "^5.3.4", - "chalk": "^4.1.2", - "tslib": "^2.3.1" - } + "@betterer/errors": "^6.0.0-alpha.1", + "@betterer/logger": "^6.0.0-alpha.1", + "@betterer/render": "^6.0.0-alpha.1", + "@betterer/time": "^6.0.0-alpha.1", + "chalk": "^5.3.0" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/tasks/src/error-log.tsx b/packages/tasks/src/error-log.tsx index 7bf5a2396..74fbf5b30 100644 --- a/packages/tasks/src/error-log.tsx +++ b/packages/tasks/src/error-log.tsx @@ -1,11 +1,13 @@ import type { BettererError } from '@betterer/errors'; import type { FC } from '@betterer/render'; -import { isBettererError } from '@betterer/errors'; +import { isBettererErrorΔ } from '@betterer/errors'; import { React, Box, Text } from '@betterer/render'; /** - * @public `props` type for {@link BettererErrorLog | ``}. + * @internal This could change at any point! Please don't use! + * + * `props` type for {@link BettererErrorLog | ``}. */ export interface BettererErrorLogProps { /** @@ -15,16 +17,20 @@ export interface BettererErrorLogProps { } /** - * @public Ink component for rendering a {@link @betterer/errors#BettererError | `BettererError` } + * @internal This could change at any point! Please don't use! + * + * Ink component for rendering a {@link @betterer/errors#BettererError | `BettererError` } * and all its additional information. The `message`, `stack` and `details` of the `error` will be - * printed. If any `detail` is an `Error` or {@link @betterer/errors#BettererError | `BettererError`}, + * printed. + * + * @remarks If any `detail` is an `Error` or {@link @betterer/errors#BettererError | `BettererError`}, * the component will be rendered recursively. */ export const BettererErrorLog: FC = function BettererErrorLog({ error }) { let errors: Array = []; let details: Array = []; - if (isBettererError(error)) { - errors = error.details.filter((detail) => isError(detail)) as Array; + if (isBettererErrorΔ(error)) { + errors = error.details.filter((detail) => isError(detail)); details = error.details.filter((detail) => !isError(detail)) as Array; } @@ -54,7 +60,8 @@ export const BettererErrorLog: FC = function BettererErro }; function isError(value: unknown): value is Error | BettererError { - return (value as Error).message != null && (value as Error).stack !== null; + const { message, stack } = value as Partial; + return message != null && stack != null; } function processStack(stack: string): string { diff --git a/packages/tasks/src/index.ts b/packages/tasks/src/index.ts index b022bb03e..bb253330c 100644 --- a/packages/tasks/src/index.ts +++ b/packages/tasks/src/index.ts @@ -6,15 +6,24 @@ * @packageDocumentation */ -export { BettererErrorLog, BettererErrorLogProps } from './error-log.js'; -export { BettererLogo } from './logo.js'; -export { +export type { BettererErrorLogProps } from './error-log.js'; +export type { BettererTask, - BettererTaskLogger, BettererTaskLoggerProps, - BettererTasksDone, - BettererTasksLogger, + BettererTaskResultProps, + BettererTaskState, BettererTasksLoggerProps, + BettererTasksResultProps, BettererTasksState, BettererTasksStatusUpdate -} from './tasks/public.js'; +} from './tasks/index.js'; + +export { BettererErrorLog } from './error-log.js'; +export { BettererLogo } from './logo.js'; +export { + BettererTaskLogger, + BettererTaskResult, + BettererTasksLogger, + BettererTasksResult, + useTimer +} from './tasks/index.js'; diff --git a/packages/tasks/src/logo.tsx b/packages/tasks/src/logo.tsx index 61cd16ca4..8eb3ec337 100644 --- a/packages/tasks/src/logo.tsx +++ b/packages/tasks/src/logo.tsx @@ -11,7 +11,9 @@ const LOGO = ` `; /** - * @public Ink component for rendering an ASCII version of the {@link https://github.com/phenomnomnominal/betterer | **Betterer**} + * @internal This could change at any point! Please don't use! + * + * Ink component for rendering an ASCII version of the {@link https://github.com/phenomnomnominal/betterer | **Betterer**} * logo. */ export const BettererLogo: FC = function BettererLogo() { diff --git a/packages/tasks/src/tasks/TaskLogger.tsx b/packages/tasks/src/tasks/TaskLogger.tsx index b41334ae1..cd74247f3 100644 --- a/packages/tasks/src/tasks/TaskLogger.tsx +++ b/packages/tasks/src/tasks/TaskLogger.tsx @@ -1,19 +1,18 @@ -import type { BettererLoggerCodeInfo } from '@betterer/logger'; import type { FC } from '@betterer/render'; -import type { BettererTaskLog, BettererTask } from './types.js'; +import type { BettererTask } from './types.js'; -import { code__ } from '@betterer/logger'; -import { React, Box, Text, memo, useEffect } from '@betterer/render'; -import chalk from 'chalk'; +import { React, memo, useEffect } from '@betterer/render'; -import { BettererErrorLog } from '../error-log.js'; -import { BettererTaskStatus } from './status.js'; -import { useTaskState } from './useTaskState.js'; -import { useTasks } from './useTasksState.js'; +import { useTaskStatus } from './useTaskStatus.js'; +import { useTaskLogs } from './useTaskLogs.js'; +import { BettererTaskResult } from './TaskResult.js'; +import { useTaskState } from './useTasksState.js'; /** - * @public `props` type for {@link BettererTaskLogger | ``}. + * @internal This could change at any point! Please don't use! + * + * `props` type for {@link BettererTaskLogger | ``}. */ export interface BettererTaskLoggerProps { /** @@ -27,101 +26,44 @@ export interface BettererTaskLoggerProps { } /** - * @public Ink component for rendering the output of a single {@link BettererTask | `BettererTask`}. - * The output will update based on the status of the task. Once the task is finished, it will - * output any logging and any errors (if the task failed). + * @internal This could change at any point! Please don't use! + * + * Ink component for rendering the output of a single {@link BettererTask | `BettererTask`}. + * The output will update based on the status of the task. + * + * Once the task is finished, it will output any logging and any errors (if the task failed). */ export const BettererTaskLogger: FC = memo(function BettererTaskLogger(props) { const { name, task } = props; - const [tasksState] = useTasks(); - const [taskState, taskApi] = useTaskState(); + const [taskState, taskApi] = useTaskState(name); - const { error, logs, status } = taskState; + const [status, statusLogger] = useTaskStatus(); + const [logs, logger] = useTaskLogs(); useEffect(() => { void (async () => { - taskApi.reset(); - - async function statusError(status: string): Promise { - await taskApi.status(['🔥', 'redBright', status]); - } - async function statusProgress(status: string): Promise { - await taskApi.status(['🤔', 'whiteBright', status]); - } - async function statusSuccess(status: string): Promise { - await taskApi.status(['✅', 'greenBright', status]); - } - - async function logCode(codeInfo: BettererLoggerCodeInfo): Promise { - const codeFrame = code__(codeInfo); - await taskApi.log(['💻', 'whiteBright', codeFrame]); - } - async function logDebug(log: string): Promise { - await taskApi.log(['🤯', 'blueBright', log]); - } - async function logError(log: string): Promise { - await taskApi.log(['🔥', 'redBright', log]); - } - async function logInfo(log: string): Promise { - await taskApi.log(['💭', 'gray', log]); - } - async function logSuccess(log: string): Promise { - await taskApi.log(['✅', 'greenBright', log]); - } - async function logWarning(log: string): Promise { - await taskApi.log(['🚨', 'yellowBright', log]); - } - taskApi.start(); try { - const result = await task({ - progress: statusProgress, - code: logCode, - debug: logDebug, - error: logError, - info: logInfo, - success: logSuccess, - warn: logWarning - }); + const result = await task(logger, statusLogger); if (typeof result === 'string') { - await statusSuccess(result); + await statusLogger.success(result); } else { - await statusSuccess('done!'); + await statusLogger.success('done!'); } taskApi.stop(); } catch (error) { - await statusError((error as Error).message); taskApi.error(error as Error); - process.exitCode = 1; + await statusLogger.error((error as Error).message); } })(); - }, [name, task, taskApi]); + }, [task, logger, statusLogger]); - return ( - - {status && } - {tasksState.endTime != null && logs.length ? ( - - {logs.map((log, index) => ( - {prependLogBlock(log)} - ))} - - ) : null} - {error && } - - ); -}); + if (!taskState) { + return null; + } -function prependLogBlock(log: BettererTaskLog): string { - const [, colour, message] = log; - return prependBlock(message, chalk[colour]('・')); -} + const { done, error } = taskState; -function prependBlock(message: string, block: string): string { - return message - .toString() - .split('\n') - .map((line) => `${block} ${line}`) - .join('\n'); -} + return ; +}); diff --git a/packages/tasks/src/tasks/TaskResult.tsx b/packages/tasks/src/tasks/TaskResult.tsx new file mode 100644 index 000000000..2e0c99259 --- /dev/null +++ b/packages/tasks/src/tasks/TaskResult.tsx @@ -0,0 +1,99 @@ +import type { BettererLog, BettererLogs } from '@betterer/logger'; +import type { FC } from '@betterer/render'; + +import type { BettererTaskLog } from './types.js'; + +import { codeΔ } from '@betterer/logger'; +import { React, Box, Text, memo } from '@betterer/render'; +import chalk from 'chalk'; + +import { BettererErrorLog } from '../error-log.js'; +import { BettererTaskStatus } from './status.js'; + +/** + * @internal This could change at any point! Please don't use! + * + * `props` type for {@link BettererTaskLogger | ``}. + */ +export interface BettererTaskResultProps { + /** + * Any error thrown by the {@link BettererTask | `BettererTask`}. It will be `null` if the task completed successfully. + */ + error: Error | null; + /** + * The name of the {@link BettererTask | `BettererTask`} that is shown to the user. + */ + name: string; + /** + * All the logs of the {@link BettererTask | `BettererTask`}. + */ + logs: BettererLogs; + /** + * The final status of the {@link BettererTask | `BettererTask`}. + */ + status: BettererLog | null; +} + +/** + * @internal This could change at any point! Please don't use! + * + * Ink component for rendering the final result of a single {@link BettererTask | `BettererTask`}. + */ +export const BettererTaskResult: FC = memo(function BettererTaskResult(props) { + const { error, name, logs, status } = props; + const hasStatus = status && Object.keys(status).length !== 0; + + return ( + + {hasStatus && } + {logs.length ? ( + + {logs.map((log, index) => ( + {prependLogBlock(logToTaskLog(log))} + ))} + + ) : null} + {error && } + + ); +}); + +function logToTaskLog(log: BettererLog): BettererTaskLog { + const { code, debug, error, info, progress, success, warn } = log; + if (code != null) { + const codeFrame = codeΔ(code); + return ['💻', 'whiteBright', codeFrame]; + } + if (debug != null) { + return ['🤯', 'blueBright', debug]; + } + if (error != null) { + return ['🔥', 'redBright', error]; + } + if (info != null) { + return ['💭', 'gray', info]; + } + if (progress != null) { + return ['🤔', 'whiteBright', progress]; + } + if (success != null) { + return ['✅', 'greenBright', success]; + } + if (warn != null) { + return ['🚨', 'yellowBright', warn]; + } + return ['🔥', 'redBright', 'What the shit did you just try to log???']; +} + +function prependLogBlock(log: BettererTaskLog): string { + const [, colour, message] = log; + return prependBlock(message, chalk[colour]('・')); +} + +function prependBlock(message: string, block: string): string { + return message + .toString() + .split('\n') + .map((line) => `${block} ${line}`) + .join('\n'); +} diff --git a/packages/tasks/src/tasks/TasksLogger.tsx b/packages/tasks/src/tasks/TasksLogger.tsx index a4fce5c41..925af7ef1 100644 --- a/packages/tasks/src/tasks/TasksLogger.tsx +++ b/packages/tasks/src/tasks/TasksLogger.tsx @@ -1,18 +1,19 @@ -import type { FC } from '@betterer/render'; +import type { FC, PropsWithChildren } from '@betterer/render'; -import type { BettererTaskLog, BettererTasksDone, BettererTasksStatusUpdate } from './types.js'; -import type { BettererTasksState } from './useTasksState.js'; +import type { BettererTasksStatusUpdate } from './types.js'; -import { React, Box, memo, useApp, useEffect } from '@betterer/render'; +import { React, memo, useApp } from '@betterer/render'; -import { BettererTaskStatus } from './status.js'; -import { useTasksState, BettererTasksContext } from './useTasksState.js'; +import { BettererTasksResult } from './TasksResult.js'; +import { BettererTasksContext, useTasksState } from './useTasksState.js'; import { useTimer } from './useTimer.js'; /** - * @public `props` type for {@link BettererTasksLogger | ``}. + * @internal This could change at any point! Please don't use! + * + * `props` type for {@link BettererTasksLogger | ``}. */ -export interface BettererTasksLoggerProps { +export type BettererTasksLoggerProps = PropsWithChildren<{ /** * Whether the Ink renderer instance should quit after the tasks are complete. * @@ -31,81 +32,39 @@ export interface BettererTasksLoggerProps { * @defaultValue `() => ${nRunning} tasks running... ${nDone} tasks done! ${nErrored} tasks errored!` */ update?: BettererTasksStatusUpdate; - /** - * An optional callback function that is called whenever a set of tasks are completed. - */ - done?: BettererTasksDone; - /** - * Whether the running time should be rendered. - * - * @defaultValue `true` - */ - timer?: boolean; -} +}>; /** - * @public Ink component for rendering the output of a set of {@link BettererTask | `BettererTask`s}. + * @internal This could change at any point! Please don't use! + * + * Ink component for rendering the output of a set of {@link BettererTask | `BettererTask`s}. * The output will update based on the current status of the tasks. */ export const BettererTasksLogger: FC = memo(function BettererTasksLogger(props) { - const { children, done = () => void 0, exit = true, name, update = defaultUpdate, timer = true } = props; - - const app = useApp(); - - const [time, clear] = useTimer(timer); + const { children, exit = true, name, update } = props; - const [state, tasks] = useTasksState(); - const { startTime, endTime, errors } = state; + const [state, tasksApi] = useTasksState(); + const { endTime } = state; - useEffect(() => { - if (endTime != null) { - clear(); - } - }, [endTime, clear]); + const app = useApp(); - const result = `${update(state)}`; - let status: BettererTaskLog = ['🌟', 'whiteBright', result]; - if (errors > 0) { - status = ['💥', 'redBright', result]; - } else if (endTime !== null) { - status = ['🎉', 'greenBright', result]; - } + const time = useTimer(); const hasChildren = Array.isArray(children) ? children.length : !!children; if (!hasChildren || endTime != null) { if (exit) { - setImmediate(() => app.exit()); + setImmediate(() => { + app.exit(); + }); } - done(); } - const label = timer ? ` (${formatTime(startTime, endTime || time)}ms)` : ''; - return ( - - - + + {children} - + ); }); - -const FORMATTER = Intl.NumberFormat(); - -function formatTime(startTime: number, time: number) { - return FORMATTER.format(Math.floor(time - startTime)); -} - -function defaultUpdate(state: BettererTasksState): string { - const { done, errors, running } = state; - const runningStatus = running ? `${tasks(running)} running... ` : ''; - const doneStatus = done ? `${tasks(done)} done! ` : ''; - const errorStatus = errors ? `${tasks(errors)} errored! ` : ''; - return `${runningStatus}${doneStatus}${errorStatus}`; -} - -function tasks(n: number): string { - return `${n} ${n === 1 ? 'task' : 'tasks'}`; -} diff --git a/packages/tasks/src/tasks/TasksResult.tsx b/packages/tasks/src/tasks/TasksResult.tsx new file mode 100644 index 000000000..669967a00 --- /dev/null +++ b/packages/tasks/src/tasks/TasksResult.tsx @@ -0,0 +1,76 @@ +import type { FC, PropsWithChildren } from '@betterer/render'; + +import type { BettererTaskLog, BettererTasksStatusUpdate } from './types.js'; +import type { BettererTasksState } from './useTasksState.js'; + +import { React, Box, memo } from '@betterer/render'; + +import { BettererTaskStatus } from './status.js'; + +/** + * @internal This could change at any point! Please don't use! + * + * `props` type for {@link BettererTasksResult | ``}. + */ +export type BettererTasksResultProps = PropsWithChildren< + BettererTasksState & { + /** + * The name of group of task that is shown to the user + */ + name: string; + /** + * The current elapsed time. + */ + time: number; + /** + * An optional hook to customise the output of the task status summary. + * + * @defaultValue `() => ${nRunning} tasks running... ${nDone} tasks done! ${nErrored} tasks errored!` + */ + update?: BettererTasksStatusUpdate; + } +>; + +/** + * @internal This could change at any point! Please don't use! + * + * Ink component for rendering the output of a set of {@link BettererTask | `BettererTask`s}. + * The output will update based on the current status of the tasks. + */ +export const BettererTasksResult: FC = memo(function BettererTasksResult(props) { + const { children, errors, endTime, name, startTime, time, update = defaultUpdate } = props; + + const result = update(props); + + let status: BettererTaskLog = ['🌟', 'whiteBright', result]; + if (errors > 0) { + status = ['💥', 'redBright', result]; + } else if (endTime !== null) { + status = ['🎉', 'greenBright', result]; + } + + return ( + + {} + {children} + + ); +}); + +const FORMATTER = Intl.NumberFormat(); + +function formatTime(startTime: number, time: number) { + return FORMATTER.format(Math.floor(time - startTime)); +} + +function defaultUpdate(state: BettererTasksState): string { + const { done, errors, running } = state; + const runningStatus = running ? `${tasks(running)} running... ` : ''; + const doneStatus = done ? `${tasks(done)} done! ` : ''; + const errorStatus = errors ? `${tasks(errors)} errored! ` : ''; + return `${runningStatus}${doneStatus}${errorStatus}`; +} + +function tasks(n: number): string { + return `${String(n)} ${n === 1 ? 'task' : 'tasks'}`; +} diff --git a/packages/tasks/src/tasks/index.ts b/packages/tasks/src/tasks/index.ts new file mode 100644 index 000000000..da8584e76 --- /dev/null +++ b/packages/tasks/src/tasks/index.ts @@ -0,0 +1,12 @@ +export type { BettererTaskLoggerProps } from './TaskLogger.js'; +export type { BettererTaskResultProps } from './TaskResult.js'; +export type { BettererTasksLoggerProps } from './TasksLogger.js'; +export type { BettererTasksResultProps } from './TasksResult.js'; +export type { BettererTask, BettererTasksStatusUpdate } from './types.js'; +export type { BettererTaskState, BettererTasksState } from './useTasksState.js'; + +export { BettererTaskLogger } from './TaskLogger.js'; +export { BettererTaskResult } from './TaskResult.js'; +export { BettererTasksLogger } from './TasksLogger.js'; +export { BettererTasksResult } from './TasksResult.js'; +export { useTimer } from './useTimer.js'; diff --git a/packages/tasks/src/tasks/public.ts b/packages/tasks/src/tasks/public.ts deleted file mode 100644 index 7404958ee..000000000 --- a/packages/tasks/src/tasks/public.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { BettererTasksState } from './useTasksState.js'; -export { BettererTaskLogger, BettererTaskLoggerProps } from './TaskLogger.js'; -export { BettererTasksLogger, BettererTasksLoggerProps } from './TasksLogger.js'; -export { BettererTask, BettererTasksDone, BettererTasksStatusUpdate } from './types.js'; diff --git a/packages/tasks/src/tasks/status.tsx b/packages/tasks/src/tasks/status.tsx index 22630c380..25fc2870a 100644 --- a/packages/tasks/src/tasks/status.tsx +++ b/packages/tasks/src/tasks/status.tsx @@ -4,6 +4,7 @@ import type { BettererTaskLog } from './types.js'; import { React, Text } from '@betterer/render'; +/** @knipignore used by an exported function */ export interface BettererTaskStatusProps { name: string; status: BettererTaskLog; diff --git a/packages/tasks/src/tasks/types.ts b/packages/tasks/src/tasks/types.ts index cc3e98313..034c56b96 100644 --- a/packages/tasks/src/tasks/types.ts +++ b/packages/tasks/src/tasks/types.ts @@ -1,30 +1,31 @@ import type { BettererLogger } from '@betterer/logger'; -import type { ForegroundColor } from 'chalk'; +import type { ForegroundColorName } from 'chalk'; import type { BettererTasksState } from './useTasksState.js'; -export type BettererTaskColour = typeof ForegroundColor; +/** @knipignore used by an exported function */ +export type BettererTaskColour = ForegroundColorName; /** - * @public An asynchronous task that will be orchestrated by the {@link @betterer/tasks#BettererTasksLogger | `BettererTasksLogger`}. + * @internal This could change at any point! Please don't use! + * + * An asynchronous task that will be executed by a {@link BettererTaskLogger | ``}. + * + * @param logger - logger for information that will be shown to the user once the task is complete. + * @param statusLogger - logger for information that will be shown to the user as the task runs. * - * @param logger - Parameter provides access to asynchronous logging which will be shown to the - * user once the task is complete. * @returns If the task returns it is a "success". + * * @throws If the task throws it is a "failure". */ -export type BettererTask = (logger: BettererLogger) => Promise; +export type BettererTask = (logger: BettererLogger, statusLogger: BettererLogger) => Promise; export type BettererTaskLog = [indicator: string, colour: BettererTaskColour, message: string]; -export type BettererTaskLogs = Array; /** - * @public A function that is called whenever a set of tasks are completed. - */ -export type BettererTasksDone = () => void; - -/** - * @public A function that can be used to customise the output of the task status summary. + * @internal This could change at any point! Please don't use! + * + * A function that can be used to customise the output of the task status summary. * * @remarks Useful for custom pluralisation and internationalisation. */ diff --git a/packages/tasks/src/tasks/useTaskLogs.ts b/packages/tasks/src/tasks/useTaskLogs.ts new file mode 100644 index 000000000..74578bfa3 --- /dev/null +++ b/packages/tasks/src/tasks/useTaskLogs.ts @@ -0,0 +1,33 @@ +import type { BettererLogger, BettererLoggerCodeInfo, BettererLoggerMessage, BettererLogs } from '@betterer/logger'; + +import { useRef, useState } from '@betterer/render'; + +export function useTaskLogs(): [BettererLogs, BettererLogger] { + const [logs, setLogs] = useState([]); + + const logger = useRef({ + progress(progress: BettererLoggerMessage): void { + setLogs((logs) => [...logs, { progress }]); + }, + code(code: BettererLoggerCodeInfo): void { + setLogs((logs) => [...logs, { code }]); + }, + debug(debug: BettererLoggerMessage): void { + setLogs((logs) => [...logs, { debug }]); + }, + error(error: BettererLoggerMessage): void { + setLogs((logs) => [...logs, { error }]); + }, + info(info: BettererLoggerMessage): void { + setLogs((logs) => [...logs, { info }]); + }, + success(success: BettererLoggerMessage): void { + setLogs((logs) => [...logs, { success }]); + }, + warn(warn: BettererLoggerMessage): void { + setLogs((logs) => [...logs, { warn }]); + } + }); + + return [logs, logger.current]; +} diff --git a/packages/tasks/src/tasks/useTaskState.ts b/packages/tasks/src/tasks/useTaskState.ts deleted file mode 100644 index 86a7d6368..000000000 --- a/packages/tasks/src/tasks/useTaskState.ts +++ /dev/null @@ -1,122 +0,0 @@ -import type { BettererTaskLog, BettererTaskLogs } from './types.js'; - -import { useReducer, useRef } from '@betterer/render'; - -import { useTasks } from './useTasksState.js'; - -interface BettererTaskState { - done: boolean; - running: boolean; - status: BettererTaskLog | null; - logs: BettererTaskLogs; - error: Error | null; -} - -const INITIAL_STATE: BettererTaskState = { - done: false, - running: false, - status: null, - logs: [], - error: null -}; - -type BettererTaskAction = - | { - type: 'start'; - } - | { - type: 'stop'; - } - | { - type: 'error'; - data: Error; - } - | { - type: 'reset'; - } - | { - type: 'status'; - data: BettererTaskLog; - } - | { - type: 'log'; - data: BettererTaskLog; - }; - -interface BettererTaskStateAPI { - error(error: Error): void; - start(): void; - stop(): void; - reset(): void; - status(status: BettererTaskLog): Promise; - log(status: BettererTaskLog): Promise; -} - -export function useTaskState(): [BettererTaskState, BettererTaskStateAPI] { - const [state, dispatch] = useReducer(reducer, INITIAL_STATE); - const [, tasks] = useTasks(); - const api = useRef({ - reset() { - dispatch({ type: 'reset' }); - }, - start() { - tasks.start(); - }, - status(status: BettererTaskLog) { - return Promise.resolve(dispatch({ type: 'status', data: status })); - }, - log(log: BettererTaskLog) { - return Promise.resolve(dispatch({ type: 'log', data: log })); - }, - stop() { - dispatch({ type: 'stop' }); - tasks.stop(); - }, - error(error: Error) { - dispatch({ type: 'error', data: error }); - tasks.error(error); - } - }); - - return [state, api.current]; -} - -function reducer(state: BettererTaskState, action: BettererTaskAction): BettererTaskState { - switch (action.type) { - case 'reset': { - return { - ...INITIAL_STATE - }; - } - case 'status': - return { - ...state, - running: true, - status: action.data - }; - case 'log': { - return { - ...state, - logs: [...state.logs, action.data] - }; - } - case 'stop': { - return { - ...state, - running: false, - done: true - }; - } - case 'error': { - return { - ...state, - error: action.data, - running: false, - done: true - }; - } - default: { - return state; - } - } -} diff --git a/packages/tasks/src/tasks/useTaskStatus.ts b/packages/tasks/src/tasks/useTaskStatus.ts new file mode 100644 index 000000000..a7cb2d9d8 --- /dev/null +++ b/packages/tasks/src/tasks/useTaskStatus.ts @@ -0,0 +1,33 @@ +import type { BettererLogger, BettererLoggerCodeInfo, BettererLoggerMessage, BettererLog } from '@betterer/logger'; + +import { useRef, useState } from '@betterer/render'; + +export function useTaskStatus(): [BettererLog, BettererLogger] { + const [status, setStatus] = useState({}); + + const logger = useRef({ + code(code: BettererLoggerCodeInfo): void { + setStatus({ code }); + }, + debug(debug: BettererLoggerMessage): void { + setStatus({ debug }); + }, + error(error: BettererLoggerMessage): void { + setStatus({ error }); + }, + info(info: BettererLoggerMessage): void { + setStatus({ info }); + }, + progress(progress: BettererLoggerMessage): void { + setStatus({ progress }); + }, + success(success: BettererLoggerMessage): void { + setStatus({ success }); + }, + warn(warn: BettererLoggerMessage): void { + setStatus({ warn }); + } + }); + + return [status, logger.current]; +} diff --git a/packages/tasks/src/tasks/useTasksState.ts b/packages/tasks/src/tasks/useTasksState.ts index ab6073c41..580f0df76 100644 --- a/packages/tasks/src/tasks/useTasksState.ts +++ b/packages/tasks/src/tasks/useTasksState.ts @@ -1,82 +1,115 @@ -import { BettererError } from '@betterer/errors'; +import { invariantΔ } from '@betterer/errors'; import { createContext, useContext, useReducer, useRef } from '@betterer/render'; +import { getPreciseTimeΔ } from '@betterer/time'; -import { getPreciseTime__ } from '@betterer/time'; +export const BettererTasksContext = createContext(null); + +function useTasksContext(): BettererTasksAPI { + const context = useContext(BettererTasksContext); + invariantΔ(context, 'Trying to use `BettererTasksContext` before it was created!'); + return context; +} + +/** + * @internal This could change at any point! Please don't use! + * + * The state of the a running tasks. + */ +export interface BettererTaskState { + /** + * If this task has finished running or not. It will be `true` if an error has been throw. + */ + done: boolean; + /** + * If this task is currently running or not. + */ + running: boolean; + /** + * The error thrown by this task. It will be `null` if the task completes successfully. + */ + error: Error | null; +} /** - * @public The state of the running tasks. `endTime` will only be present when there are no more + * @internal This could change at any point! Please don't use! + * + * The state of the running tasks. `endTime` will only be present when there are no more * `running` tasks. */ export interface BettererTasksState { + /** + * How many tasks are currently running. + */ running: number; + /** + * How many tasks are done running. + */ done: number; + /** + * How many tasks threw an error. + */ errors: number; + /** + * What time the tasks started running. + */ startTime: number; + /** + * What time the tasks finished running. + * + * @remarks will be `null` until `running` is `0`. + */ endTime: number | null; } -export type BettererTasksAction = +type BettererTaskAction = | { type: 'start'; + name: string; } | { type: 'stop'; + name: string; } | { type: 'error'; - data: Error; + name: string; + error: Error; + }; + +type BettererTasksAction = + | BettererTaskAction + | { + type: 'reset'; }; +/** @knipignore used by an exported function */ export interface BettererTasksAPI { - error(error: Error): void; - start(): void; - stop(): void; + error(name: string, error: Error): void; + start(name: string): void; + stop(name: string): void; } export function useTasksState(): [BettererTasksState, BettererTasksAPI] { - const [state, dispatch] = useReducer(reducer, getInitialState()); + const [state, dispatch] = useReducer(tasksReducer, getInitialState()); const api = useRef({ - error(error: Error) { - dispatch({ type: 'error', data: error }); + error(name: string, error: Error) { + dispatch({ type: 'error', error, name }); }, - start() { - dispatch({ type: 'start' }); + start(name: string) { + dispatch({ type: 'start', name }); }, - stop() { - dispatch({ type: 'stop' }); + stop(name: string) { + dispatch({ type: 'stop', name }); } }); return [state, api.current]; } -function getInitialState(): BettererTasksState { - return { - running: 0, - done: 0, - errors: 0, - startTime: getPreciseTime__(), - endTime: null - }; -} - -export const BettererTasksContext = createContext<[BettererTasksState, BettererTasksAPI] | null>(null); - -export function useTasks(): [BettererTasksState, BettererTasksAPI] { - const context = useContext(BettererTasksContext); - if (context === null) { - throw new BettererError('Trying to use `BettererTasksContext` before it was created` 🔥'); - } - return context; -} - -function reducer(state: BettererTasksState, action: BettererTasksAction): BettererTasksState { +function tasksReducer(state: BettererTasksState, action: BettererTasksAction): BettererTasksState { switch (action.type) { case 'start': { - if (state.endTime != null) { - return { ...getInitialState(), running: state.running + 1 }; - } return { ...state, running: state.running + 1 @@ -103,10 +136,83 @@ function reducer(state: BettererTasksState, action: BettererTasksAction): Better } } +function getInitialState(): BettererTasksState { + return { + running: 0, + done: 0, + errors: 0, + startTime: getPreciseTimeΔ(), + endTime: null + }; +} + +/** @knipignore used by an exported function */ +export interface BettererTaskAPI { + error(error: Error): void; + start(): void; + stop(): void; +} + +export function useTaskState(name: string): [BettererTaskState | null, BettererTaskAPI] { + const [taskState, dispatch] = useReducer(taskReducer, { + done: false, + error: null, + running: false + }); + + const tasks = useTasksContext(); + + const api = useRef({ + error(error: Error) { + tasks.error(name, error); + dispatch({ type: 'error', name, error }); + }, + start() { + tasks.start(name); + dispatch({ type: 'start', name }); + }, + stop() { + tasks.stop(name); + dispatch({ type: 'stop', name }); + } + }); + + return [taskState, api.current]; +} + +function taskReducer(state: BettererTaskState, action: BettererTaskAction): BettererTaskState { + switch (action.type) { + case 'start': { + return { + running: true, + done: false, + error: null + }; + } + case 'stop': { + return { + running: false, + done: true, + error: null + }; + } + case 'error': { + return { + running: false, + done: true, + error: action.error + }; + } + default: { + return state; + } + } +} + function setEndTime(state: BettererTasksState): BettererTasksState { const shouldExit = state.running === 0; if (!shouldExit) { return state; } - return { ...state, endTime: getPreciseTime__() }; + return { ...state, endTime: getPreciseTimeΔ() }; } diff --git a/packages/tasks/src/tasks/useTimer.ts b/packages/tasks/src/tasks/useTimer.ts index 715955adb..a91328e7c 100644 --- a/packages/tasks/src/tasks/useTimer.ts +++ b/packages/tasks/src/tasks/useTimer.ts @@ -1,16 +1,19 @@ import { useCallback, useEffect, useRef, useState } from '@betterer/render'; -import { getPreciseTime__ } from '@betterer/time'; +import { getPreciseTimeΔ } from '@betterer/time'; const DEFAULT_TASK_TIME_INTERVAL = 100; -export type BettererTimerClear = () => void; - -export function useTimer(enable = true): [number, BettererTimerClear] { +/** + * @internal This could change at any point! Please don't use! + * + * @returns the number of milliseconds since the timer started. + */ +export function useTimer(): number { const timer = useRef(null); - const [time, setTime] = useState(getPreciseTime__()); + const [time, setTime] = useState(getPreciseTimeΔ()); const updateTime = useCallback(() => { - setTime(getPreciseTime__()); + setTime(getPreciseTimeΔ()); }, []); const clearTime = useCallback(() => { @@ -20,13 +23,10 @@ export function useTimer(enable = true): [number, BettererTimerClear] { }, []); useEffect(() => { - if (!enable) { - return; - } timer.current = setInterval(updateTime, DEFAULT_TASK_TIME_INTERVAL); updateTime(); return clearTime; }, [updateTime, clearTime]); - return [time, clearTime]; + return time; } diff --git a/packages/time/CHANGELOG.md b/packages/time/CHANGELOG.md new file mode 100644 index 000000000..d0feeb5b6 --- /dev/null +++ b/packages/time/CHANGELOG.md @@ -0,0 +1,16 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/time + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + +**Note:** Version bump only for package @betterer/time diff --git a/packages/time/LICENSE.md b/packages/time/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/time/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/time/api-extractor.json b/packages/time/api-extractor.json index dae7b1544..6923858f4 100644 --- a/packages/time/api-extractor.json +++ b/packages/time/api-extractor.json @@ -4,7 +4,7 @@ "messages": { "extractorMessageReporting": { - // We add a suffix __ instead + // We add a suffix Δ instead "ae-internal-missing-underscore": { "logLevel": "none", "addToApiReportFile": false diff --git a/packages/time/package.json b/packages/time/package.json index 5a82fb26d..1751fc2d5 100644 --- a/packages/time/package.json +++ b/packages/time/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/time", "description": "Time helper functions for @betterer/betterer", - "version": "5.3.4", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,6 +26,7 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" - } + "node": ">=16" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/time/src/index.ts b/packages/time/src/index.ts index 996313383..a0871b5a0 100644 --- a/packages/time/src/index.ts +++ b/packages/time/src/index.ts @@ -4,4 +4,4 @@ * @packageDocumentation */ -export { getPreciseTime__, getTime__ } from './time.js'; +export { getPreciseTimeΔ, getTimeΔ } from './time.js'; diff --git a/packages/time/src/time.ts b/packages/time/src/time.ts index 23ba1f91e..0d6aea588 100644 --- a/packages/time/src/time.ts +++ b/packages/time/src/time.ts @@ -1,13 +1,17 @@ /** * @internal This could change at any point! Please don't use! + * + * @remarks can be stubbed to have control of time during tests. */ -export function getPreciseTime__(): number { +export function getPreciseTimeΔ(): number { return performance.now(); } /** * @internal This could change at any point! Please don't use! + * + * @remarks can be stubbed to have control of time during tests. */ -export function getTime__(): number { +export function getTimeΔ(): number { return Date.now(); } diff --git a/packages/tsconfig.json b/packages/tsconfig.json index e4de9fb17..7a096f041 100644 --- a/packages/tsconfig.json +++ b/packages/tsconfig.json @@ -28,6 +28,9 @@ { "path": "fixture" }, + { + "path": "knip" + }, { "path": "logger" }, diff --git a/packages/tsquery/CHANGELOG.md b/packages/tsquery/CHANGELOG.md index 6e2deef13..6c2bce1c5 100644 --- a/packages/tsquery/CHANGELOG.md +++ b/packages/tsquery/CHANGELOG.md @@ -3,6 +3,30 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/tsquery + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) + + +### Features + +* **betterer ✨:** specify different cache strategies ([#1232](https://github.com/phenomnomnominal/betterer/issues/1232)) ([df77035](https://github.com/phenomnomnominal/betterer/commit/df7703537910c320c0444e26582e8436947ff00d)) + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) diff --git a/packages/tsquery/LICENSE.md b/packages/tsquery/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/tsquery/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/tsquery/package.json b/packages/tsquery/package.json index ae5f01a92..1f4f70398 100644 --- a/packages/tsquery/package.json +++ b/packages/tsquery/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/tsquery", "description": "TSQuery test for @betterer/betterer", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,12 +26,12 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "@phenomnomnominal/tsquery": "^4.1.1", - "tslib": "^2.3.1" - } + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1", + "@phenomnomnominal/tsquery": "^6.1.3" + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/tsquery/src/tsquery.ts b/packages/tsquery/src/tsquery.ts index c6322d982..d9221a652 100644 --- a/packages/tsquery/src/tsquery.ts +++ b/packages/tsquery/src/tsquery.ts @@ -8,8 +8,8 @@ import { promises as fs } from 'node:fs'; * for more details about the query syntax. * * @remarks {@link @betterer/tsquery#tsquery | `tsquery`} is a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, - * so you can use {@link @betterer/betterer#BettererFileTest.include | `include()`}, {@link @betterer/betterer#BettererFileTest.exclude | `exclude()`}, - * {@link @betterer/betterer#BettererFileTest.only | `only()`}, and {@link @betterer/betterer#BettererFileTest.skip | `skip()`}. + * so you can use {@link @betterer/betterer#BettererResolverTest.include | `include()`}, {@link @betterer/betterer#BettererResolverTest.exclude | `exclude()`}, + * {@link @betterer/betterer#BettererTest.only | `only()`}, and {@link @betterer/betterer#BettererTest.skip | `skip()`}. * * @example * ```typescript @@ -32,7 +32,11 @@ import { promises as fs } from 'node:fs'; * Will throw if the user doesn't pass `query`. */ export function tsquery(query: string, issueMessage = 'TSQuery match'): BettererFileTest { - if (!query) { + // The `tsquery` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `query?: string`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (query == null || !query) { throw new BettererError( "for `@betterer/tsquery` to work, you need to provide a query, e.g. `'CallExpression > PropertyAccessExpression'`. ❌" ); @@ -46,8 +50,7 @@ export function tsquery(query: string, issueMessage = 'TSQuery match'): Betterer await Promise.all( filePaths.map(async (filePath) => { const fileText = await fs.readFile(filePath, 'utf8'); - const sourceFile = tsq.ast(fileText); - const matches = tsq.query(sourceFile, query, { visitAllChildren: true }); + const matches = tsq.query(fileText, query); if (matches.length === 0) { return; } @@ -57,5 +60,5 @@ export function tsquery(query: string, issueMessage = 'TSQuery match'): Betterer }); }) ); - }); + }).cache(); } diff --git a/packages/typescript/CHANGELOG.md b/packages/typescript/CHANGELOG.md index 96e9101dc..f298976c3 100644 --- a/packages/typescript/CHANGELOG.md +++ b/packages/typescript/CHANGELOG.md @@ -3,6 +3,32 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/typescript + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + + +### Bug Fixes + +* **betterer 🐛:** api stability ([#1235](https://github.com/phenomnomnominal/betterer/issues/1235)) ([d18c176](https://github.com/phenomnomnominal/betterer/commit/d18c176f22ca7c74f7b97a4dd16faaa639ff520e)) +* **betterer 🐛:** handles more paths in results file, and some TypeScript error message fun ([#1226](https://github.com/phenomnomnominal/betterer/issues/1226)) ([ae555e6](https://github.com/phenomnomnominal/betterer/commit/ae555e60eb20b4d3f8ca7625d34e0eda210da011)) + + +### Features + +* **betterer ✨:** add more details to file issues ([#1211](https://github.com/phenomnomnominal/betterer/issues/1211)) ([5a53e45](https://github.com/phenomnomnominal/betterer/commit/5a53e45b4d51e643458c21bd911b5500e698a1a8)) +* **betterer ✨:** specify different cache strategies ([#1232](https://github.com/phenomnomnominal/betterer/issues/1232)) ([df77035](https://github.com/phenomnomnominal/betterer/commit/df7703537910c320c0444e26582e8436947ff00d)) + + + + + # [5.4.0](https://github.com/phenomnomnominal/betterer/compare/v5.3.6...v5.4.0) (2022-08-09) **Note:** Version bump only for package @betterer/typescript diff --git a/packages/typescript/LICENSE.md b/packages/typescript/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/typescript/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/typescript/package.json b/packages/typescript/package.json index 8e6bf1039..0eb8bfd09 100644 --- a/packages/typescript/package.json +++ b/packages/typescript/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/typescript", "description": "TypeScript test for @betterer/betterer", - "version": "5.4.0", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,14 +26,14 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/betterer": "^5.4.0", - "@betterer/errors": "^5.3.0", - "tslib": "^2.3.1" + "@betterer/betterer": "^6.0.0-alpha.1", + "@betterer/errors": "^6.0.0-alpha.1" }, "peerDependencies": { "typescript": "*" - } + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/typescript/src/types.ts b/packages/typescript/src/types.ts new file mode 100644 index 000000000..02a60735e --- /dev/null +++ b/packages/typescript/src/types.ts @@ -0,0 +1,10 @@ +import type { BettererFileGlobs, BettererFilePaths } from '@betterer/betterer'; +import type ts from 'typescript'; + +export interface TypeScriptReadConfigResult { + config: { + compilerOptions: ts.CompilerOptions; + files: BettererFilePaths; + include?: BettererFileGlobs; + }; +} diff --git a/packages/typescript/src/typescript.ts b/packages/typescript/src/typescript.ts index 676ba0d86..e9b25fc32 100644 --- a/packages/typescript/src/typescript.ts +++ b/packages/typescript/src/typescript.ts @@ -1,20 +1,13 @@ -import type { BettererFileGlobs, BettererFilePaths } from '@betterer/betterer'; +import type { CompilerOptions, DiagnosticWithLocation, ParseConfigHost } from 'typescript'; +import type { TypeScriptReadConfigResult } from './types.js'; -import { BettererFileTest } from '@betterer/betterer'; -import { BettererError } from '@betterer/errors'; +import { BettererFileTest, BettererCacheStrategy } from '@betterer/betterer'; +import { BettererError, invariantΔ } from '@betterer/errors'; import path from 'node:path'; -import * as ts from 'typescript'; +import ts from 'typescript'; const NEW_LINE = '\n'; -interface TypeScriptReadConfigResult { - config: { - compilerOptions: ts.CompilerOptions; - files: BettererFilePaths; - include?: BettererFileGlobs; - }; -} - // TypeScript throws a 6307 error when it need to access type information from a file // that wasn't included by the tsconfig. This happens whenever we run the compiler on // a subset of files, so we need to filter out those errors! @@ -25,8 +18,8 @@ const CODE_FILE_NOT_INCLUDED = 6307; * to your codebase. * * @remarks {@link @betterer/typescript#typescript | `typescript`} is a {@link @betterer/betterer#BettererFileTest | `BettererFileTest`}, - * so you can use {@link @betterer/betterer#BettererFileTest.include | `include()`}, {@link @betterer/betterer#BettererFileTest.exclude | `exclude()`}, - * {@link @betterer/betterer#BettererFileTest.only | `only()`}, and {@link @betterer/betterer#BettererFileTest.skip | `skip()`}. + * so you can use {@link @betterer/betterer#BettererResolverTest.include | `include()`}, {@link @betterer/betterer#BettererResolverTest.exclude | `exclude()`}, + * {@link @betterer/betterer#BettererTest.only | `only()`}, and {@link @betterer/betterer#BettererTest.skip | `skip()`}. * * @example * ```typescript @@ -48,13 +41,27 @@ const CODE_FILE_NOT_INCLUDED = 6307; * @throws {@link @betterer/errors#BettererError | `BettererError` } * Will throw if the user doesn't pass `configFilePath` or `extraCompilerOptions`. */ -export function typescript(configFilePath: string, extraCompilerOptions: ts.CompilerOptions = {}): BettererFileTest { - if (!configFilePath) { +export function typescript(configFilePath: string, extraCompilerOptions: CompilerOptions): BettererFileTest { + // The `typescript` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `configFilePath?: string`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (configFilePath == null || !configFilePath) { throw new BettererError( "for `@betterer/typescript` to work, you need to provide the path to a tsconfig.json file, e.g. `'./tsconfig.json'`. ❌" ); } + // The `typescript` function could be called from JS code, without type-checking. + // We *could* change the parameter to be `extraCompilerOptions?: CompilerOptions`, + // but that would imply that it was optional, and it isn't. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- see above! + if (!extraCompilerOptions) { + throw new BettererError( + 'For `@betterer/typescript` to work, you need to provide compiler options, e.g. `{ strict: true }`. ❌' + ); + } + return new BettererFileTest((filePaths, fileTestResult, resolver) => { if (filePaths.length === 0) { return; @@ -70,7 +77,8 @@ export function typescript(configFilePath: string, extraCompilerOptions: ts.Comp const fullCompilerOptions = { ...compilerOptions, - ...extraCompilerOptions + ...extraCompilerOptions, + noErrorTruncation: true }; config.compilerOptions = fullCompilerOptions; @@ -80,7 +88,7 @@ export function typescript(configFilePath: string, extraCompilerOptions: ts.Comp } const compilerHost = ts.createCompilerHost(fullCompilerOptions); - const configHost: ts.ParseConfigHost = { + const configHost: ParseConfigHost = { ...compilerHost, readDirectory: ts.sys.readDirectory.bind(ts.sys), useCaseSensitiveFileNames: compilerHost.useCaseSensitiveFileNames() @@ -109,17 +117,83 @@ export function typescript(configFilePath: string, extraCompilerOptions: ts.Comp ]); allDiagnostics - .filter((diagnostic): diagnostic is ts.DiagnosticWithLocation => { + .filter((diagnostic): diagnostic is DiagnosticWithLocation => { const { file, start, length } = diagnostic; return file != null && start != null && length != null; }) - .filter(({ file, code }) => { - return filePaths.includes(file.fileName) && code !== CODE_FILE_NOT_INCLUDED; - }) - .forEach(({ start, length, file: source, messageText }) => { - const file = fileTestResult.addFile(source.fileName, source.getFullText()); + .filter(({ file, code }) => filePaths.includes(file.fileName) && code !== CODE_FILE_NOT_INCLUDED) + .forEach(({ start, length, file, source, messageText }) => { + const resultFile = fileTestResult.addFile(file.fileName, file.getFullText()); const message = ts.flattenDiagnosticMessageText(messageText, NEW_LINE); - file.addIssue(start, start + length, message); + resultFile.addIssue(start, start + length, typescriptIssueMessage(source, message)); }); + }).cache(BettererCacheStrategy.FilePaths); +} + +function typescriptIssueMessage(source = 'tsc', message: string) { + let issueMessage = source ? `${source}: ` : ''; + issueMessage = `${issueMessage}${message}`; + issueMessage = fixUnionOrder(issueMessage); + issueMessage = fixMissingProperties(issueMessage); + return issueMessage; +} + +// TypeScript produces error messages that are unstable. +// Trying to handle this is probably a bad idea (https://github.com/microsoft/TypeScript/issues/49996#issuecomment-1198383661) +// But what the heck, let's give it a go. +// And yes I know this should probably use a parser instead of a RegExp but maybe it's good enough? +// +// Example input: +// "Argument of type 'HTMLElement | null' is not assignable to parameter of type 'Document | Node | Element | Window'.\n Type 'null' is not assignable to type 'Document | Node | Element | Window'.", +// Output: +// "Argument of type 'HTMLElement | null' is not assignable to parameter of type 'Document | Element | Node | Window'.\n Type 'null' is not assignable to type 'Document | Element | Node | Window'.", +const UNION_REGEX = /'([^']*?\s+\|+\s+[^']*?)'/g; +function fixUnionOrder(message: string): string { + const matches = [...message.matchAll(UNION_REGEX)]; + matches.forEach((match) => { + const [, union] = match; + invariantΔ(union, 'RegExp has group so matches must contain union!'); + const members = union.split('|').map((member) => member.trim()); + const sortedMembers = members.sort(); + const sortedUnion = sortedMembers.join(' | '); + message = message.replace(union, sortedUnion); }); + return message; +} + +// Again we will probably regret this but: +// +// Example input: +// "Type '{}' is missing the following properties from type 'D': d1, d2, d3, d4" +// "Type '{}' is missing the following properties from type 'F': f1, f2, f3, f4, and 2 more." +// Output: +// "Type '{}' is missing 4 properties from type 'D'" +// "Type '{}' is missing 6 properties from type 'F'" +const MISSING_PROPERTIES_MESSAGE = 'is missing the following properties from type'; +const MISSING_PROPERTIES_REGEXP = /from type '.*?':((?:\W+.*?,)+\W.*)/g; +const AND_N_MORE_REGEXP = /and\W(.*)\Wmore/; +function fixMissingProperties(message: string): string { + if (message.includes(MISSING_PROPERTIES_MESSAGE)) { + const matches = [...message.matchAll(MISSING_PROPERTIES_REGEXP)]; + matches.forEach((match) => { + const [, props] = match; + invariantΔ(props, 'RegExp has group so matches must contain properties!'); + const propNames = props.split(',').map((member) => member.trim()); + + const last = propNames[propNames.length - 1]; + invariantΔ(last, 'RegExp has matches must contain a property!'); + + let nProps = propNames.length; + const hasNMore = AND_N_MORE_REGEXP.exec(last); + if (hasNMore) { + const [, nStr] = hasNMore; + invariantΔ(nStr, 'RegExp has matches must contain a property!'); + const n = parseFloat(nStr); + nProps = nProps + n - 1; + } + message = message.replace('the following', String(nProps)); + message = message.replace(`:${props}`, ''); + }); + } + return message; } diff --git a/packages/worker/CHANGELOG.md b/packages/worker/CHANGELOG.md new file mode 100644 index 000000000..69ae1224f --- /dev/null +++ b/packages/worker/CHANGELOG.md @@ -0,0 +1,16 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [6.0.0-alpha.1](https://github.com/phenomnomnominal/betterer/compare/v6.0.0-alpha.0...v6.0.0-alpha.1) (2024-12-01) + +**Note:** Version bump only for package @betterer/worker + + + + + +# [6.0.0-alpha.0](https://github.com/phenomnomnominal/betterer/compare/v5.4.0...v6.0.0-alpha.0) (2024-12-01) + +**Note:** Version bump only for package @betterer/worker diff --git a/packages/worker/LICENSE.md b/packages/worker/LICENSE.md new file mode 100644 index 000000000..4a0aa742a --- /dev/null +++ b/packages/worker/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Craig Spence + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/worker/README.md b/packages/worker/README.md index 5f0584616..90cae4ca2 100644 --- a/packages/worker/README.md +++ b/packages/worker/README.md @@ -8,4 +8,4 @@ Worker helpers used within [**`Betterer`**](https://github.com/phenomnomnominal/ ## Usage -> ## 🚨 THIS PACKAGE SHOULD ONLY BE USED WITHIN THE BETTERER MONOREPO 🚨 \ No newline at end of file +> ## 🚨 THIS PACKAGE SHOULD ONLY BE USED WITHIN THE BETTERER MONOREPO 🚨 diff --git a/packages/worker/api-extractor.json b/packages/worker/api-extractor.json index dae7b1544..6923858f4 100644 --- a/packages/worker/api-extractor.json +++ b/packages/worker/api-extractor.json @@ -4,7 +4,7 @@ "messages": { "extractorMessageReporting": { - // We add a suffix __ instead + // We add a suffix Δ instead "ae-internal-missing-underscore": { "logLevel": "none", "addToApiReportFile": false diff --git a/packages/worker/package.json b/packages/worker/package.json index 663845ab1..566489a5d 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,13 +1,14 @@ { "name": "@betterer/worker", "description": "Worker helper functions for @betterer/betterer", - "version": "5.3.4", + "version": "6.0.0-alpha.1", "license": "MIT", "publishConfig": { "access": "public" }, "main": "dist/index.js", "types": "dist/index.d.ts", + "type": "module", "files": [ "dist" ], @@ -25,15 +26,15 @@ "api": "api-extractor run --local --verbose" }, "engines": { - "node": ">=12" + "node": ">=16" }, "dependencies": { - "@betterer/errors": "^5.3.0", + "@betterer/errors": "^6.0.0-alpha.1", "callsite": "^1.0.0", - "comlink": "^4.4.1", - "tslib": "^2.3.1" + "comlink": "^4.4.1" }, "devDependencies": { "@types/callsite": "^1.0.32" - } + }, + "gitHead": "821992635c8b6a4891169dad3334203f866e5521" } diff --git a/packages/worker/src/index.ts b/packages/worker/src/index.ts index 3fdfcd5ab..05dfd6c93 100644 --- a/packages/worker/src/index.ts +++ b/packages/worker/src/index.ts @@ -6,5 +6,5 @@ export type { BettererWorkerAPI, BettererWorkerHandle, BettererWorkerFactory, BettererWorkerPool } from './types.js'; -export { exposeToMain__, exposeToWorker__, importWorker__ } from './worker.js'; -export { createWorkerPool__ } from './worker-pool.js'; +export { exposeToMainΔ, exposeToWorkerΔ, importWorkerΔ } from './worker.js'; +export { createWorkerPoolΔ } from './worker-pool.js'; diff --git a/packages/worker/src/types.ts b/packages/worker/src/types.ts index c175426e5..f4b8fad9f 100644 --- a/packages/worker/src/types.ts +++ b/packages/worker/src/types.ts @@ -1,7 +1,9 @@ import type { Remote } from 'comlink'; /** - * @public A pool of {@link https://nodejs.org/api/worker_threads.html | `Worker`s}, which + * @internal This could change at any point! Please don't use! + * + * A pool of {@link https://nodejs.org/api/worker_threads.html | `Worker`s}, which * can then be used to queue asynchronous threaded tasks. * * @remarks It is designed to be used with {@link @betterer/worker#BettererWorkerAPI | `BettererWorkerAPI`} `Worker`s, @@ -20,13 +22,15 @@ export interface BettererWorkerPool> { } /** - * @public A handle to a `Worker` in a `BettererWorkerPool`. + * @internal This could change at any point! Please don't use! + * + * A handle to a `Worker` in a `BettererWorkerPool`. * * @remarks A handle is in one of the following states: * * [FREE] - waiting to be used. You can call `claim()` on a handle to reserve access to it. * [CLAIMED] - a called has sole access to the handle. You can call `release()` when you're done with it to make it free again. - * [DESTROYED] - the `Worker` has been detroyed and cannot be claimed again. + * [DESTROYED] - the `Worker` has been destroyed and cannot be claimed again. */ export interface BettererWorkerHandle> { /** @@ -44,19 +48,35 @@ export interface BettererWorkerHandle> { } /** - * @public Wrapper around {@link https://github.com/GoogleChromeLabs/comlink | `Comlink.Remote`} to + * @internal This could change at any point! Please don't use! + * + * Wrapper around {@link https://github.com/GoogleChromeLabs/comlink | `Comlink.Remote`} to * make it a bit more ergonomic to use/clean up `Worker`s. * * @remarks The `api` is the remote proxy to the Worker. All functions exposed via this API are - * transformed to be asynchronous. You may need to use `exposeToWorker__` if you're passing a non-serialisable + * transformed to be asynchronous. You may need to use `exposeToWorkerΔ` if you're passing a non-serialisable * object to a remote function. */ -export type BettererWorkerAPI = { +export interface BettererWorkerAPI { + /** + * The exposed API of the worker thread. + * + * @remarks Any functions called via `api` will be executed remotely, and + * asynchronously. Any arguments passed to the function *must* be serialisable. + */ api: Remote; + /** + * Destroy the underlying worker thread. + * + * @remarks Failing to call `destroy()` will result in memory leaks, so + * make sure you clean up! + */ destroy(): Promise; -}; +} /** - * @public A factory function that creates a `BettererWorkerAPI` for use in a `BettererWorkerPool`. + * @internal This could change at any point! Please don't use! + * + * A factory function that creates a `BettererWorkerAPI` for use in a `BettererWorkerPool`. */ -export type BettererWorkerFactory> = () => API; +export type BettererWorkerFactory> = () => API | Promise; diff --git a/packages/worker/src/worker-pool.ts b/packages/worker/src/worker-pool.ts index 12f16446e..ac66d7b8b 100644 --- a/packages/worker/src/worker-pool.ts +++ b/packages/worker/src/worker-pool.ts @@ -1,18 +1,20 @@ import type { BettererWorkerAPI, BettererWorkerFactory, BettererWorkerHandle, BettererWorkerPool } from './types.js'; -import { BettererError } from '@betterer/errors'; +import { invariantΔ } from '@betterer/errors'; -class BettereWorkerHandleΩ> implements BettererWorkerHandle { +class BettererWorkerHandleΩ> implements BettererWorkerHandle { private _destroyed = false; private _free = Promise.resolve(); private _release: (() => void) | null = null; - constructor(private _worker: API) {} + private constructor(private _worker: API) {} + + public static async create>(workerFactory: BettererWorkerFactory) { + return new BettererWorkerHandleΩ(await workerFactory()); + } public async claim(): Promise { - if (this._destroyed) { - throw new BettererError(`Handle has been destroyed so cannot be claimed.`); - } + invariantΔ(!this._destroyed, 'Handle has been destroyed so cannot be claimed!'); await this._free; this._free = new Promise((resolve) => { this._release = resolve; @@ -21,27 +23,30 @@ class BettereWorkerHandleΩ> implements B } public async destroy(): Promise { - if (this._destroyed) { - return; - } + invariantΔ(!this._destroyed, 'Handle has been destroyed so cannot be destroyed again!'); this._destroyed = true; await this._worker.destroy(); } public release(): void { - if (!this._release) { - throw new BettererError(`Handle has not been claimed yet so cannot be released.`); - } + invariantΔ(this._release, 'Handle has not been claimed yet so cannot be released!'); this._release(); } } class BettererRunWorkerPoolΩ> implements BettererWorkerPool { - private _handles: Array> = []; private _handleIndex = 0; - constructor(workerCount: number, workerFactory: BettererWorkerFactory) { - this._handles = Array.from({ length: workerCount }).map(() => new BettereWorkerHandleΩ(workerFactory())); + constructor(private _handles: Array>) {} + + public static async create>( + workerCount: number, + workerFactory: BettererWorkerFactory + ) { + const handles = await Promise.all( + Array.from({ length: workerCount }).map(() => BettererWorkerHandleΩ.create(workerFactory)) + ); + return new BettererRunWorkerPoolΩ(handles); } public async destroy(): Promise { @@ -50,6 +55,7 @@ class BettererRunWorkerPoolΩ> implements public getWorkerHandle(): BettererWorkerHandle { const worker = this._handles[this._handleIndex]; + invariantΔ(worker, `\`this._handleIndex\` should never be out of bounds!`, this._handles, this._handleIndex); this._handleIndex = this._handleIndex + 1 === this._handles.length ? 0 : this._handleIndex + 1; return worker; } @@ -69,9 +75,9 @@ class BettererRunWorkerPoolΩ> implements * @param workerFactory - A factory function which returns an instance of the specific Worker. * The factory should call `importWorker__` with a path to the Worker file. */ -export function createWorkerPool__>( +export async function createWorkerPoolΔ>( workerCount: number, workerFactory: BettererWorkerFactory -): BettererWorkerPool { - return new BettererRunWorkerPoolΩ(workerCount, workerFactory); +): Promise> { + return await BettererRunWorkerPoolΩ.create(workerCount, workerFactory); } diff --git a/packages/worker/src/worker.ts b/packages/worker/src/worker.ts index ad556aaa2..6ba3f8bbb 100644 --- a/packages/worker/src/worker.ts +++ b/packages/worker/src/worker.ts @@ -2,8 +2,9 @@ import type { MessagePort, TransferListItem } from 'node:worker_threads'; import type { BettererWorkerAPI } from './types.js'; -import { BettererError, isBettererError } from '@betterer/errors'; +import { BettererError, invariantΔ, isBettererErrorΔ } from '@betterer/errors'; import assert from 'node:assert'; +import { promises as fs } from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { MessageChannel, Worker, parentPort } from 'node:worker_threads'; @@ -13,99 +14,133 @@ import { expose, proxy, releaseProxy, transferHandlers, wrap } from 'comlink'; /** * @internal This could change at any point! Please don't use! * - * @remarks Create a {@link https://nodejs.org/api/worker_threads.html | `Worker`} from a given path. - * The path should be relative to the file that is calling `importWorker__`. The `Worker` is then + * Create a {@link https://nodejs.org/api/worker_threads.html | `Worker`} from a given path. + * The path should be relative to the file that is calling `importWorkerΔ`. The `Worker` is then * wrapped in the {@link https://github.com/GoogleChromeLabs/comlink | `Comlink`} magic, and then our * own little wrapper around that. * - * You might have something like this, in a file called `my.worker.ts`: + * @example You might have something like this, in a file called `my.worker.ts`: * * ``` - * import { exposeToMain__ } from '@betterer/worker'; + * import { exposeToMainΔ } from '@betterer/worker'; * * export function add (a: number, b: number): number { * return a + b; * } * - * exposeToMain__({ add }); + * exposeToMainΔ({ add }); * ``` * * Not that `add` is exported, which means you can extract the exposed API: * * ``` - * import { importWorker__ } from '@betterer/worker'; + * import { importWorkerΔ } from '@betterer/worker'; * * type MyWorkerAPI = typeof import('./my.worker.js'); * - * const worker = importWorker__('./my-worker.js'); + * const worker = importWorkerΔ('./my-worker.js'); * ``` * * @param importPath - The path to the Worker source. Should have a `.js` extension. - * Should be relative to the file that is calling `importWorker__`. + * Should be relative to the file that is calling `importWorkerΔ`. */ -export function importWorker__(importPath: string): BettererWorkerAPI { +export async function importWorkerΔ(importPath: string): Promise> { const [, call] = callsite(); + invariantΔ(call, `\`call\` should be set!`, call); + let callerFilePath = call.getFileName(); try { callerFilePath = fileURLToPath(callerFilePath); } catch { // Was probably already a file path 🤷‍♂️ } + const idPath = path.resolve(path.dirname(callerFilePath), importPath); - const worker = new Worker(idPath); + const validatedPath = await validatePath(idPath); + + if (process.env.BETTERER_WORKER === 'false') { + return { + api: await importDefault(validatedPath), + destroy: () => Promise.resolve() + } as BettererWorkerAPI; + } + + const worker = new Worker(validatedPath); const api = wrap(nodeEndpoint(worker)); - return exposeToWorker__({ + return exposeToWorkerΔ({ api, - destroy: exposeToWorker__(async () => { + destroy: exposeToWorkerΔ(async () => { api[releaseProxy](); await worker.terminate(); }) } as BettererWorkerAPI); } +interface ESModule { + default: unknown; +} + +async function importDefault(importPath: string): Promise { + const m = (await import(importPath)) as unknown; + return getDefaultExport(m) as T; +} + +function getDefaultExport(module: unknown): unknown { + return (module as ESModule).default || module; +} + /** * @internal This could change at any point! Please don't use! * - * @remarks Use `exposeToMain__` to allow the main thread to call Worker functions across the thread boundary. + * Use `exposeToMainΔ` to allow the main thread to call Worker functions across the thread boundary. * * @throws {@link @betterer/errors#BettererError | `BettererError` } * Will throw if it is called from the main thread. */ -export function exposeToMain__(api: Expose): void { +export function exposeToMainΔ(api: object): void { + if (process.env.BETTERER_WORKER === 'false') { + return; + } + if (!parentPort) { - throw new BettererError(`"exposeToMain__" called from main thread! 🤪`); + throw new BettererError(`"exposeToMainΔ" called from main thread! 🤪`); } expose(api, nodeEndpoint(parentPort)); } /** * @internal This could change at any point! Please don't use! - * @remarks Use `exposeToWorker__` to allow a Worker to call main thread functions across the thread boundary. + * + * Use `exposeToWorkerΔ` to allow a Worker to call main thread functions across the thread boundary. */ -export function exposeToWorker__(api: Expose): Expose { +export function exposeToWorkerΔ(api: Expose): Expose { + if (process.env.BETTERER_WORKER === 'false') { + return api; + } + proxy(api); return api; } -export interface EventSource { +interface EventSource { addEventListener(type: string, listener: EventListenerOrEventListenerObject): void; removeEventListener(type: string, listener: EventListenerOrEventListenerObject): void; } -export interface Endpoint extends EventSource { +interface Endpoint extends EventSource { start?: () => void; postMessage(message: unknown, transfer?: Array): void; } -export interface NodeEndpoint { +interface NodeEndpoint { start?: () => void; postMessage(message: unknown, transfer?: Array | ReadonlyArray): void; on(type: string, listener: EventListenerOrEventListenerObject): void; off(type: string, listener: EventListenerOrEventListenerObject): void; } -export default function nodeEndpoint(nep: NodeEndpoint): Endpoint { +function nodeEndpoint(nep: NodeEndpoint): Endpoint { const listeners = new WeakMap(); return { postMessage: nep.postMessage.bind(nep), @@ -128,30 +163,30 @@ export default function nodeEndpoint(nep: NodeEndpoint): Endpoint { nep.off('message', l); listeners.delete(eh); }, - start: nep.start && nep.start.bind(nep) + start: nep.start?.bind(nep) }; } -export interface TransferHandler { - canHandle(value: unknown): value is T; - serialize(value: T): [S, Transferable[]]; - deserialize(value: S): T; +interface TransferHandler { + canHandle: (value: unknown) => value is T; + serialize: (value: T) => [S, Array]; + deserialize: (value: S) => T; } interface ThrownValue { value: unknown; } -type ThrownErrorSerialized = { +interface ThrownErrorSerialized { isError: true; value: { name: string; message: string; stack?: string; }; -}; +} -type ThrownBettererErrorSerialized = { +interface ThrownBettererErrorSerialized { isError: true; value: { isBettererError: true; @@ -160,7 +195,7 @@ type ThrownBettererErrorSerialized = { stack?: string; details: Array; }; -}; +} type ThrownValueSerialized = | ThrownErrorSerialized @@ -170,12 +205,32 @@ type ThrownValueSerialized = value: unknown; }; +async function validatePath(idPath: string): Promise { + const { name, dir } = path.parse(idPath); + const tsPath = path.join(dir, `${name}.ts`); + + try { + await fs.readFile(idPath); + return idPath; + } catch { + // Original path not found, try TypeScript! + } + + try { + await fs.readFile(tsPath); + return tsPath; + } catch (error) { + // Not TypeScript either! + throw new BettererError(`Could not find file at "${idPath}" or "${tsPath}"`, error as Error); + } +} + function isErrorSerialised(error: unknown): error is ThrownErrorSerialized { - return (error as ThrownErrorSerialized)?.isError; + return !!error && !!(error as Partial).isError; } function isBettererErrorSerialised(error: unknown): error is ThrownBettererErrorSerialized { - return (error as ThrownBettererErrorSerialized)?.value?.isBettererError; + return !!error && !!(error as Partial).value?.isBettererError; } const throwHandler = transferHandlers.get('throw') as TransferHandler; @@ -190,7 +245,7 @@ function serializeBettererError(error: BettererError): ThrownBettererErrorSerial message: error.message, stack: error.stack, details: error.details.map((detail) => { - if (isBettererError(detail)) { + if (isBettererErrorΔ(detail)) { return serializeBettererError(detail); } else if (detail instanceof Error) { assert(throwHandler); @@ -225,7 +280,7 @@ function deserializeBettererError(serialised: ThrownBettererErrorSerialized): Be const originalSerialise = throwHandler.serialize; throwHandler.serialize = (thrown: ThrownValue) => { const { value } = thrown; - if (isBettererError(value)) { + if (isBettererErrorΔ(value)) { const serialised = serializeBettererError(value); return [serialised, []]; } @@ -237,6 +292,9 @@ throwHandler.deserialize = (serialized) => { if (isBettererErrorSerialised(serialized)) { throw deserializeBettererError(serialized); } + // The structure of `TransferHandler` makes it hard to describe this, + // but let's just assume it's fine! 🗑️ + // eslint-disable-next-line @typescript-eslint/only-throw-error -- see above! throw originalDeserialise(serialized); }; diff --git a/test/__snapshots__/angular-cache.spec.ts.snap b/test/__snapshots__/angular-cache.spec.ts.snap new file mode 100644 index 000000000..6fdd53b21 --- /dev/null +++ b/test/__snapshots__/angular-cache.spec.ts.snap @@ -0,0 +1,106 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should still reports errors if another file effects a cached Angular file 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`angular\`] = { + value: \`{ + "src/app/app.component.ts:1689234207": [ + [6, 8, 5, "ngtsc: Property \\'title\\' does not exist on type \\'AppComponent\\'.", "183222373"], + [8, 34, 7, "ngtsc: Type \\'(hero: Hero) => number\\' is not assignable to type \\'TrackByFunction\\'.", "926731729"], + [9, 17, 2, "ngtsc: Property \\'Id\\' does not exist on type \\'Hero\\'. Did you mean \\'id\\'?", "5862152"] + ] + }\` +}; +" +`; + +exports[`betterer > should still reports errors if another file effects a cached Angular file 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 angular: running "angular"! +", + "🎉 Betterer (0ms): 1 test done! +✅ angular: "angular" got checked for the first time! (3 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ angular: "angular" got checked for the first time! (3 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 angular: running "angular"! +", + "🎉 Betterer (0ms): 1 test done! +✅ angular: "angular" stayed the same. (3 issues) 😐 +", + "🎉 Betterer (0ms): 1 test done! +✅ angular: "angular" stayed the same. (3 issues) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +", + "Checking 1 file... 🤔 + +・ fixtures/angular-cache/src/app/app.component.ts + +🌟 Betterer (0ms): +", + "Checking 1 file... 🤔 + +・ fixtures/angular-cache/src/app/app.component.ts + +🌟 Betterer (0ms): 1 test running... +🤔 angular: running "angular"! +", + "Checking 1 file... 🤔 + +・ fixtures/angular-cache/src/app/app.component.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 angular: "angular" got worse. (1 new issue, 3 existing, 4 total) 😔 +・ 3 fixed, 4 new issues in "fixtures/angular-cache/src/app/app.component.ts". +・ Showing first of 4 new issues: +・ +・ 15 | export class AppComponent { +・ 16 | public heroes: Array = [ +・ > 17 | { id: 10, name: "Landon" }, +・ | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ng: Property 'power' is missing in type '{ id: number; name: string; }' but required in type 'Hero'. +・ 18 | { id: 20, name: "Ella" }, +・ 19 | { id: 30, name: "Madelyn" }, +・ 20 | { id: 40, name: "Haley" } +・ +", + "Checked 1 file! 🔍 + +・ fixtures/angular-cache/src/app/app.component.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 angular: "angular" got worse. (1 new issue, 3 existing, 4 total) 😔 +・ 3 fixed, 4 new issues in "fixtures/angular-cache/src/app/app.component.ts". +・ Showing first of 4 new issues: +・ +・ 15 | export class AppComponent { +・ 16 | public heroes: Array = [ +・ > 17 | { id: 10, name: "Landon" }, +・ | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ng: Property 'power' is missing in type '{ id: number; name: string; }' but required in type 'Hero'. +・ 18 | { id: 20, name: "Ella" }, +・ 19 | { id: 30, name: "Madelyn" }, +・ 20 | { id: 40, name: "Haley" } +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 +", +] +`; diff --git a/test/__snapshots__/angular-include.spec.ts.snap b/test/__snapshots__/angular-include.spec.ts.snap new file mode 100644 index 000000000..03e1a4727 --- /dev/null +++ b/test/__snapshots__/angular-include.spec.ts.snap @@ -0,0 +1,36 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should report the status of the Angular compiler on specific files 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`angular\`] = { + value: \`{ + "src/app/hero-list.component.ts:9489403": [ + [14, 29, 2, "ngtsc: Property \\'Id\\' does not exist on type \\'Hero\\'. Did you mean \\'id\\'?", "5862152"] + ] + }\` +}; +" +`; + +exports[`betterer > should report the status of the Angular compiler on specific files 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 angular: running "angular"! +", + "🎉 Betterer (0ms): 1 test done! +✅ angular: "angular" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ angular: "angular" got checked for the first time! (1 issue) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", +] +`; diff --git a/test/__snapshots__/angular-no-compiler-options.spec.ts.snap b/test/__snapshots__/angular-no-compiler-options.spec.ts.snap new file mode 100644 index 000000000..8032fda18 --- /dev/null +++ b/test/__snapshots__/angular-no-compiler-options.spec.ts.snap @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should throw when trying to run Angular with no compiler options 1`] = ` +[ + " +Error: For \`@betterer/angular\` to work, you need to provide compiler options, e.g. \`{ strictTemplates: true }\`. ❌ +", +] +`; diff --git a/test/__snapshots__/angular-no-config-path.spec.ts.snap b/test/__snapshots__/angular-no-config-path.spec.ts.snap new file mode 100644 index 000000000..7695c1713 --- /dev/null +++ b/test/__snapshots__/angular-no-config-path.spec.ts.snap @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should throw when trying to run Angular with no config file path 1`] = ` +[ + " +Error: For \`@betterer/angular\` to work, you need to provide the path to a tsconfig.json file, e.g. \`'./tsconfig.json'\`. ❌ +", +] +`; diff --git a/test/__snapshots__/angular-no-valid-files.spec.ts.snap b/test/__snapshots__/angular-no-valid-files.spec.ts.snap new file mode 100644 index 000000000..ea987437b --- /dev/null +++ b/test/__snapshots__/angular-no-valid-files.spec.ts.snap @@ -0,0 +1,22 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > shouldn't actually run the compiler when there are no valid files 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 +・ No relevant files found. Are the \`include()\`/\`exclude()\` options for this test correct? +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 +・ No relevant files found. Are the \`include()\`/\`exclude()\` options for this test correct? + +1 test got checked. 🤔 +1 test met its goal! 🎉 +", +] +`; diff --git a/test/__snapshots__/angular.spec.ts.snap b/test/__snapshots__/angular.spec.ts.snap index 5b6b68c3c..e11c73065 100644 --- a/test/__snapshots__/angular.spec.ts.snap +++ b/test/__snapshots__/angular.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the status of the Angular compiler in strict mode 1`] = ` +exports[`betterer > should report the status of the Angular compiler in strict mode 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,31 +8,28 @@ exports[`betterer should report the status of the Angular compiler in strict mod // exports[\`angular\`] = { value: \`{ - \\"src/app/app.component.ts:3728100455\\": [ - [10, 8, 5, \\"Property \\\\'title\\\\' does not exist on type \\\\'AppComponent\\\\'.\\", \\"183222373\\"], - [12, 34, 7, \\"Type \\\\'(hero: Hero) => number\\\\' is not assignable to type \\\\'TrackByFunction\\\\'.\\", \\"926731729\\"], - [13, 17, 2, \\"Property \\\\'Id\\\\' does not exist on type \\\\'Hero\\\\'. Did you mean \\\\'id\\\\'?\\", \\"5862152\\"] + "src/app/app.component.ts:3728100455": [ + [10, 8, 5, "ngtsc: Property \\'title\\' does not exist on type \\'AppComponent\\'.", "183222373"], + [12, 34, 7, "ngtsc: Type \\'(hero: Hero) => number\\' is not assignable to type \\'TrackByFunction\\'.", "926731729"], + [13, 17, 2, "ngtsc: Property \\'Id\\' does not exist on type \\'Hero\\'. Did you mean \\'id\\'?", "5862152"] ] }\` }; " `; -exports[`betterer should report the status of the Angular compiler in strict mode 2`] = ` -Array [ +exports[`betterer > should report the status of the Angular compiler in strict mode 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 angular: running \\"angular\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ angular: \\"angular\\" got checked for the first time! (3 issues) 🎉 +🤔 angular: running "angular"! ", "🎉 Betterer (0ms): 1 test done! -✅ angular: \\"angular\\" got checked for the first time! (3 issues) 🎉 +✅ angular: "angular" got checked for the first time! (3 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ angular: \\"angular\\" got checked for the first time! (3 issues) 🎉 +✅ angular: "angular" got checked for the first time! (3 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 diff --git a/test/__snapshots__/better-result.spec.ts.snap b/test/__snapshots__/better-result.spec.ts.snap index cac2bdc3e..242a41e34 100644 --- a/test/__snapshots__/better-result.spec.ts.snap +++ b/test/__snapshots__/better-result.spec.ts.snap @@ -1,16 +1,16 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when a result gets better 1`] = ` -Array [ +exports[`betterer > should work when a result gets better 1`] = ` +[ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 2 tests done! -✅ should shrink: \\"should shrink\\" got checked for the first time! 🎉 -✅ should grow: \\"should grow\\" got checked for the first time! 🎉 +✅ should shrink: "should shrink" got checked for the first time! 🎉 +✅ should grow: "should grow" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 2 tests done! -✅ should shrink: \\"should shrink\\" got checked for the first time! 🎉 -✅ should grow: \\"should grow\\" got checked for the first time! 🎉 +✅ should shrink: "should shrink" got checked for the first time! 🎉 +✅ should grow: "should grow" got checked for the first time! 🎉 2 tests got checked. 🤔 2 tests got checked for the first time! 🎉 @@ -18,12 +18,12 @@ Array [ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 2 tests done! -✅ should shrink: \\"should shrink\\" got better! 😍 -✅ should grow: \\"should grow\\" got better! 😍 +✅ should shrink: "should shrink" got better! 😍 +✅ should grow: "should grow" got better! 😍 ", "🎉 Betterer (0ms): 2 tests done! -✅ should shrink: \\"should shrink\\" got better! 😍 -✅ should grow: \\"should grow\\" got better! 😍 +✅ should shrink: "should shrink" got better! 😍 +✅ should grow: "should grow" got better! 😍 2 tests got checked. 🤔 2 tests got better! 😍 @@ -31,7 +31,7 @@ Array [ ] `; -exports[`betterer should work when a result gets better 2`] = ` +exports[`betterer > should work when a result gets better 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: diff --git a/test/__snapshots__/better-test-change.spec.ts.snap b/test/__snapshots__/better-test-change.spec.ts.snap index 1012ea3af..7e35d0793 100644 --- a/test/__snapshots__/better-test-change.spec.ts.snap +++ b/test/__snapshots__/better-test-change.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when a test changes and makes the result better 1`] = ` -Array [ +exports[`betterer > should work when a test changes and makes the result better 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,16 +19,15 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! (1 fixed issue, 2 remaining) 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 2 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 2 remaining) 😍 +・ 1 fixed, 2 existing issues in "fixtures/better-test-change/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 2 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 2 remaining) 😍 +・ 1 fixed, 2 existing issues in "fixtures/better-test-change/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -39,7 +35,7 @@ Array [ ] `; -exports[`betterer should work when a test changes and makes the result better 2`] = ` +exports[`betterer > should work when a test changes and makes the result better 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -47,9 +43,9 @@ exports[`betterer should work when a test changes and makes the result better 2` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:913095150\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"], - [2, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:913095150": [ + [0, 0, 11, "TSQuery match", "3870399096"], + [2, 0, 11, "TSQuery match", "3870399096"] ] }\` }; diff --git a/test/__snapshots__/cache-ci-off.spec.ts.snap b/test/__snapshots__/cache-ci-off.spec.ts.snap new file mode 100644 index 000000000..7cff6e1a2 --- /dev/null +++ b/test/__snapshots__/cache-ci-off.spec.ts.snap @@ -0,0 +1,26 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should not update the cache file in CI mode when the cache is off 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (2 issues) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +", +] +`; diff --git a/test/__snapshots__/cache-ci-on.spec.ts.snap b/test/__snapshots__/cache-ci-on.spec.ts.snap new file mode 100644 index 000000000..82318fd07 --- /dev/null +++ b/test/__snapshots__/cache-ci-on.spec.ts.snap @@ -0,0 +1,38 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should update the cache file in CI mode when the cache is on 1`] = ` +"{ + "version": 2, + "testCache": { + "test": { + ".betterer.js": "24e8bcddcbfb1367a00bd8505f490bae360471fd67edbc6eedd4a3f31613a4dc", + "src/index.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" + } + } +}" +`; + +exports[`betterer > should update the cache file in CI mode when the cache is on 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (2 issues) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +", +] +`; diff --git a/test/__snapshots__/cache-ci.spec.ts.snap b/test/__snapshots__/cache-ci.spec.ts.snap deleted file mode 100644 index e72f7e0d4..000000000 --- a/test/__snapshots__/cache-ci.spec.ts.snap +++ /dev/null @@ -1,85 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer should not update the cache file in CI mode 1`] = ` -"{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/index.ts\\": \\"3994602698153364047\\" - } - } -}" -`; - -exports[`betterer should not update the cache file in CI mode 2`] = ` -Array [ - "🌟 Betterer (0ms): -", - "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 - -1 test got checked. 🤔 -1 test got checked for the first time! 🎉 -", - "🌟 Betterer: -", - "🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer: 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -", - "🌟 Betterer: 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 -", - "💥 Betterer: 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/cache-ci/src/index.ts\\". -・ New issue in \\"/fixtures/cache-ci/src/index.ts\\"! -・ -・ /fixtures/cache-ci/src/index.ts -・ 1 | // HACK: -・ 2 | // HACK: -・ > 3 | // HACK: -・ | ^^^^^^^ RegExp match -・ - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 -", - "💥 Betterer: 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/cache-ci/src/index.ts\\". -・ New issue in \\"/fixtures/cache-ci/src/index.ts\\"! -・ -・ /fixtures/cache-ci/src/index.ts -・ 1 | // HACK: -・ 2 | // HACK: -・ > 3 | // HACK: -・ | ^^^^^^^ RegExp match -・ - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -1 test got checked. 🤔 -1 test got worse. 😔 - - -Unexpected changes detected in these tests while running in CI mode: - - \\"test\\" - -You should make sure the results file is up-to-date before committing! You might want to run \`betterer precommit\` in a commit hook. 💍 -", -] -`; diff --git a/test/__snapshots__/cache-deleted-file.spec.ts.snap b/test/__snapshots__/cache-deleted-file.spec.ts.snap index a5d5a1610..441d9d133 100644 --- a/test/__snapshots__/cache-deleted-file.spec.ts.snap +++ b/test/__snapshots__/cache-deleted-file.spec.ts.snap @@ -1,29 +1,31 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should remove files from the cache when they are deleted 1`] = ` +exports[`betterer > should remove files from the cache when they are deleted 1`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/file-1.ts\\": \\"3994602698153364047\\", - \\"src/file-2.ts\\": \\"3994602698153364047\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "a3a5145d2d2ec4828c977274956d91469148cddeeb33a7629e133b81f05591cf", + "src/file-1.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0", + "src/file-2.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" } } }" `; -exports[`betterer should remove files from the cache when they are deleted 2`] = ` +exports[`betterer > should remove files from the cache when they are deleted 2`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/file-1.ts\\": \\"3994602698153364047\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "a3a5145d2d2ec4828c977274956d91469148cddeeb33a7629e133b81f05591cf", + "src/file-1.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" } } }" `; -exports[`betterer should remove files from the cache when they are deleted 3`] = ` +exports[`betterer > should remove files from the cache when they are deleted 3`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -31,27 +33,28 @@ exports[`betterer should remove files from the cache when they are deleted 3`] = // exports[\`test\`] = { value: \`{ - \\"src/file-1.ts:153364047\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"], - [1, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/file-1.ts:153364047": [ + [0, 0, 7, "RegExp match", "645651780"], + [1, 0, 7, "RegExp match", "645651780"] ] }\` }; " `; -exports[`betterer should remove files from the cache when they are deleted 4`] = ` +exports[`betterer > should remove files from the cache when they are deleted 4`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/file-1.ts\\": \\"3994602698153364047\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "a3a5145d2d2ec4828c977274956d91469148cddeeb33a7629e133b81f05591cf", + "src/file-1.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" } } }" `; -exports[`betterer should remove files from the cache when they are deleted 5`] = ` +exports[`betterer > should remove files from the cache when they are deleted 5`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -59,30 +62,27 @@ exports[`betterer should remove files from the cache when they are deleted 5`] = // exports[\`test\`] = { value: \`{ - \\"src/file-1.ts:153364047\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"], - [1, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/file-1.ts:153364047": [ + [0, 0, 7, "RegExp match", "645651780"], + [1, 0, 7, "RegExp match", "645651780"] ] }\` }; " `; -exports[`betterer should remove files from the cache when they are deleted 6`] = ` -Array [ +exports[`betterer > should remove files from the cache when they are deleted 6`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (4 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (4 issues) 🎉 +✅ test: "test" got checked for the first time! (4 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (4 issues) 🎉 +✅ test: "test" got checked for the first time! (4 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -90,16 +90,15 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! (2 fixed issues, 2 remaining) 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (2 fixed issues, 2 remaining) 😍 +✅ test: "test" got better! (2 fixed issues, 2 remaining) 😍 +・ 2 fixed issues in "fixtures/cache-deleted-file/src/file-2.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (2 fixed issues, 2 remaining) 😍 +✅ test: "test" got better! (2 fixed issues, 2 remaining) 😍 +・ 2 fixed issues in "fixtures/cache-deleted-file/src/file-2.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -107,42 +106,28 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (2 new issues, 4 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (2 new issues, 4 total) 😔 - -Error: \\"test\\" got worse. (2 new issues, 4 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (2 new issues, 4 total) 😔 -・ New issues in \\"/fixtures/cache-deleted-file/src/file-2.ts\\"! +🔥 test: "test" got worse. (2 new issues, 2 existing, 4 total) 😔 +・ 2 new issues in "fixtures/cache-deleted-file/src/file-2.ts". ・ Showing first of 2 new issues: ・ -・ /fixtures/cache-deleted-file/src/file-2.ts ・ > 1 | // HACK: ・ | ^^^^^^^ RegExp match ・ 2 | // HACK: ・ - -Error: \\"test\\" got worse. (2 new issues, 4 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (2 new issues, 4 total) 😔 -・ New issues in \\"/fixtures/cache-deleted-file/src/file-2.ts\\"! +🔥 test: "test" got worse. (2 new issues, 2 existing, 4 total) 😔 +・ 2 new issues in "fixtures/cache-deleted-file/src/file-2.ts". ・ Showing first of 2 new issues: ・ -・ /fixtures/cache-deleted-file/src/file-2.ts ・ > 1 | // HACK: ・ | ^^^^^^^ RegExp match ・ 2 | // HACK: ・ -Error: \\"test\\" got worse. (2 new issues, 4 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 diff --git a/test/__snapshots__/cache-obsolete.spec.ts.snap b/test/__snapshots__/cache-obsolete.spec.ts.snap new file mode 100644 index 000000000..f6bd7765d --- /dev/null +++ b/test/__snapshots__/cache-obsolete.spec.ts.snap @@ -0,0 +1,110 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should hold onto the cache for an obsolete test until it is removed 1`] = ` +"{ + "version": 2, + "testCache": { + "test": { + ".betterer.js": "a7ca2a86a297eea623c11ed135cc829fecd0f8bc01f3ab98ebf6478fc6f8546b", + "src/index.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" + } + } +}" +`; + +exports[`betterer > should hold onto the cache for an obsolete test until it is removed 2`] = ` +"{ + "version": 2, + "testCache": { + "test": { + ".betterer.js": "a7ca2a86a297eea623c11ed135cc829fecd0f8bc01f3ab98ebf6478fc6f8546b", + "src/index.ts": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } +}" +`; + +exports[`betterer > should hold onto the cache for an obsolete test until it is removed 3`] = ` +"{ + "version": 2, + "testCache": { + "test": { + ".betterer.js": "a7ca2a86a297eea623c11ed135cc829fecd0f8bc01f3ab98ebf6478fc6f8546b", + "src/index.ts": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } +}" +`; + +exports[`betterer > should hold onto the cache for an obsolete test until it is removed 4`] = ` +"{ + "version": 2, + "testCache": {} +}" +`; + +exports[`betterer > should hold onto the cache for an obsolete test until it is removed 5`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 +・ 2 fixed issues in "fixtures/cache-obsolete/src/index.ts". +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 +・ 2 fixed issues in "fixtures/cache-obsolete/src/index.ts". + +1 test got checked. 🤔 +1 test got better! 😍 +1 test met its goal! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" is obsolete! 🗑️ +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" is obsolete! 🗑️ + +0 tests got checked. 🤔 +1 test is obsolete! 🗑️ + +You have saved tests results that no longer have tests! If they are no longer needed, you can run \`betterer --update\` to remove the obsolete results from the results file. 🆙 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got removed! 👋🏻 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got removed! 👋🏻 + +0 tests got checked. 🤔 +1 test got removed! 👋🏻 +", +] +`; diff --git a/test/__snapshots__/cache-path.spec.ts.snap b/test/__snapshots__/cache-path.spec.ts.snap index df0003e01..b0f95b1cc 100644 --- a/test/__snapshots__/cache-path.spec.ts.snap +++ b/test/__snapshots__/cache-path.spec.ts.snap @@ -1,28 +1,30 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should write a cache file to a different path 1`] = ` +exports[`betterer > should write a cache file to a different path 1`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"../src/index.ts\\": \\"3994602698153364047\\" + "version": 2, + "testCache": { + "test": { + "../.betterer.js": "01529c29102a4b709ce51447f59bb89f02d53750af41521f8bd3618d02d36ed8", + "../src/index.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" } } }" `; -exports[`betterer should write a cache file to a different path 2`] = ` +exports[`betterer > should write a cache file to a different path 2`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"../src/index.ts\\": \\"3994602698153364047\\" + "version": 2, + "testCache": { + "test": { + "../.betterer.js": "01529c29102a4b709ce51447f59bb89f02d53750af41521f8bd3618d02d36ed8", + "../src/index.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" } } }" `; -exports[`betterer should write a cache file to a different path 3`] = ` +exports[`betterer > should write a cache file to a different path 3`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -30,27 +32,28 @@ exports[`betterer should write a cache file to a different path 3`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:153364047\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"], - [1, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/index.ts:153364047": [ + [0, 0, 7, "RegExp match", "645651780"], + [1, 0, 7, "RegExp match", "645651780"] ] }\` }; " `; -exports[`betterer should write a cache file to a different path 4`] = ` +exports[`betterer > should write a cache file to a different path 4`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"../src/index.ts\\": \\"39946026984126639614\\" + "version": 2, + "testCache": { + "test": { + "../.betterer.js": "01529c29102a4b709ce51447f59bb89f02d53750af41521f8bd3618d02d36ed8", + "../src/index.ts": "8228477b3ac0640fb6fd6402a5648cd6c737cff1716bac36d9855ddd4960e18a" } } }" `; -exports[`betterer should write a cache file to a different path 5`] = ` +exports[`betterer > should write a cache file to a different path 5`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -58,36 +61,38 @@ exports[`betterer should write a cache file to a different path 5`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:4126639614\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/index.ts:4126639614": [ + [0, 0, 7, "RegExp match", "645651780"] ] }\` }; " `; -exports[`betterer should write a cache file to a different path 6`] = ` +exports[`betterer > should write a cache file to a different path 6`] = ` "{ - \\"version\\": 2, - \\"testCache\\": {} + "version": 2, + "testCache": { + "test": { + "../.betterer.js": "01529c29102a4b709ce51447f59bb89f02d53750af41521f8bd3618d02d36ed8", + "../src/index.ts": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } }" `; -exports[`betterer should write a cache file to a different path 7`] = ` -Array [ +exports[`betterer > should write a cache file to a different path 7`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -95,16 +100,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -112,44 +114,28 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/cache-path/src/index.ts\\". -・ New issue in \\"/fixtures/cache-path/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/cache-path/src/index.ts". ・ -・ /fixtures/cache-path/src/index.ts ・ 1 | // HACK: ・ 2 | // HACK: ・ > 3 | // HACK: ・ | ^^^^^^^ RegExp match ・ - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/cache-path/src/index.ts\\". -・ New issue in \\"/fixtures/cache-path/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/cache-path/src/index.ts". ・ -・ /fixtures/cache-path/src/index.ts ・ 1 | // HACK: ・ 2 | // HACK: ・ > 3 | // HACK: ・ | ^^^^^^^ RegExp match ・ -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -158,16 +144,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 1 remaining) 😍 +・ 1 fixed, 1 existing issues in "fixtures/cache-path/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 1 remaining) 😍 +・ 1 fixed, 1 existing issues in "fixtures/cache-path/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -175,16 +160,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" met its goal! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache-path/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache-path/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 diff --git a/test/__snapshots__/cache-precommit.spec.ts.snap b/test/__snapshots__/cache-precommit.spec.ts.snap new file mode 100644 index 000000000..ae3b36806 --- /dev/null +++ b/test/__snapshots__/cache-precommit.spec.ts.snap @@ -0,0 +1,208 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work with precommit 1`] = ` +"{ + "version": 2, + "testCache": { + "no enzyme tests": { + ".betterer.js": "92f35b217570542740490c0963357d1b4d300a6dc7a5a8f5282465f943ffbe4e", + "src/example.test.tsx": "df699ceb1d1d086a3e6bc9e834e6059006523cd8199ee8fd3351e295ee035442" + }, + "no explicit any": { + ".betterer.js": "92f35b217570542740490c0963357d1b4d300a6dc7a5a8f5282465f943ffbe4e", + "src/example.test.tsx": "df699ceb1d1d086a3e6bc9e834e6059006523cd8199ee8fd3351e295ee035442" + }, + "no type assertions": { + ".betterer.js": "92f35b217570542740490c0963357d1b4d300a6dc7a5a8f5282465f943ffbe4e", + "src/example.test.tsx": "df699ceb1d1d086a3e6bc9e834e6059006523cd8199ee8fd3351e295ee035442" + } + } +}" +`; + +exports[`betterer > should work with precommit 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`no enzyme tests\`] = { + value: \`{ + "src/example.test.tsx:2716461667": [ + [0, 26, 13, "RegExp match", "2409514259"] + ] + }\` +}; + +exports[\`no explicit any\`] = { + value: \`{ + "src/example.test.tsx:2716461667": [ + [20, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [42, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [48, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [86, 28, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"], + [126, 30, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"] + ] + }\` +}; + +exports[\`no type assertions\`] = { + value: \`{ + "src/example.test.tsx:2716461667": [ + [20, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [42, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [48, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [86, 28, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"], + [126, 30, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"] + ] + }\` +}; +" +`; + +exports[`betterer > should work with precommit 3`] = ` +"{ + "version": 2, + "testCache": { + "no enzyme tests": { + ".betterer.js": "92f35b217570542740490c0963357d1b4d300a6dc7a5a8f5282465f943ffbe4e", + "src/example.test.tsx": "6e7963438bee7f226bc7ed4d4aa0bf3b32453d8d596cb929995286f744de6bbb" + }, + "no explicit any": { + ".betterer.js": "92f35b217570542740490c0963357d1b4d300a6dc7a5a8f5282465f943ffbe4e", + "src/example.test.tsx": "6e7963438bee7f226bc7ed4d4aa0bf3b32453d8d596cb929995286f744de6bbb" + }, + "no type assertions": { + ".betterer.js": "92f35b217570542740490c0963357d1b4d300a6dc7a5a8f5282465f943ffbe4e", + "src/example.test.tsx": "6e7963438bee7f226bc7ed4d4aa0bf3b32453d8d596cb929995286f744de6bbb" + } + } +}" +`; + +exports[`betterer > should work with precommit 4`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`no enzyme tests\`] = { + value: \`{}\` +}; + +exports[\`no explicit any\`] = { + value: \`{ + "src/example.test.tsx:2127447100": [ + [19, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [41, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [47, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [85, 28, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"], + [125, 30, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"] + ] + }\` +}; + +exports[\`no type assertions\`] = { + value: \`{ + "src/example.test.tsx:2127447100": [ + [19, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [41, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [47, 6, 125, "eslint(@typescript-eslint/ban-ts-comment): Use \\\\"@ts-expect-error\\\\" instead of \\\\"@ts-ignore\\\\", as \\\\"@ts-ignore\\\\" will do nothing if the following line is error-free.", "2422533031"], + [85, 28, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"], + [125, 30, 3, "eslint(@typescript-eslint/no-explicit-any): Unexpected any. Specify a different type.", "193409811"] + ] + }\` +}; +" +`; + +exports[`betterer > should work with precommit 5`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 no enzyme tests: running "no enzyme tests"! +🤔 no explicit any: running "no explicit any"! +🤔 no type assertions: running "no type assertions"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 no enzyme tests: running "no enzyme tests"! +🤔 no explicit any: running "no explicit any"! +🤔 no type assertions: running "no type assertions"! +", + "🌟 Betterer (0ms): 3 tests running... +🤔 no enzyme tests: running "no enzyme tests"! +🤔 no explicit any: running "no explicit any"! +🤔 no type assertions: running "no type assertions"! +", + "🌟 Betterer (0ms): 2 tests running... 1 test done! +✅ no enzyme tests: "no enzyme tests" got checked for the first time! (1 issue) 🎉 +✅ no explicit any: "no explicit any" got checked for the first time! (5 issues) 🎉 +✅ no type assertions: "no type assertions" got checked for the first time! (5 issues) 🎉 +", + "🌟 Betterer (0ms): 1 test running... 2 tests done! +✅ no enzyme tests: "no enzyme tests" got checked for the first time! (1 issue) 🎉 +✅ no explicit any: "no explicit any" got checked for the first time! (5 issues) 🎉 +✅ no type assertions: "no type assertions" got checked for the first time! (5 issues) 🎉 +", + "🎉 Betterer (0ms): 3 tests done! +✅ no enzyme tests: "no enzyme tests" got checked for the first time! (1 issue) 🎉 +✅ no explicit any: "no explicit any" got checked for the first time! (5 issues) 🎉 +✅ no type assertions: "no type assertions" got checked for the first time! (5 issues) 🎉 +", + "🎉 Betterer (0ms): 3 tests done! +✅ no enzyme tests: "no enzyme tests" got checked for the first time! (1 issue) 🎉 +✅ no explicit any: "no explicit any" got checked for the first time! (5 issues) 🎉 +✅ no type assertions: "no type assertions" got checked for the first time! (5 issues) 🎉 + +3 tests got checked. 🤔 +3 tests got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 no enzyme tests: running "no enzyme tests"! +🤔 no explicit any: running "no explicit any"! +🤔 no type assertions: running "no type assertions"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 no enzyme tests: running "no enzyme tests"! +🤔 no explicit any: running "no explicit any"! +🤔 no type assertions: running "no type assertions"! +", + "🌟 Betterer (0ms): 3 tests running... +🤔 no enzyme tests: running "no enzyme tests"! +🤔 no explicit any: running "no explicit any"! +🤔 no type assertions: running "no type assertions"! +", + "🌟 Betterer (0ms): 2 tests running... 1 test done! +✅ no enzyme tests: "no enzyme tests" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache-precommit/src/example.test.tsx". +✅ no explicit any: "no explicit any" stayed the same. (5 issues) 😐 +✅ no type assertions: "no type assertions" stayed the same. (5 issues) 😐 +", + "🌟 Betterer (0ms): 1 test running... 2 tests done! +✅ no enzyme tests: "no enzyme tests" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache-precommit/src/example.test.tsx". +✅ no explicit any: "no explicit any" stayed the same. (5 issues) 😐 +✅ no type assertions: "no type assertions" stayed the same. (5 issues) 😐 +", + "🎉 Betterer (0ms): 3 tests done! +✅ no enzyme tests: "no enzyme tests" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache-precommit/src/example.test.tsx". +✅ no explicit any: "no explicit any" stayed the same. (5 issues) 😐 +✅ no type assertions: "no type assertions" stayed the same. (5 issues) 😐 +", + "🎉 Betterer (0ms): 3 tests done! +✅ no enzyme tests: "no enzyme tests" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache-precommit/src/example.test.tsx". +✅ no explicit any: "no explicit any" stayed the same. (5 issues) 😐 +✅ no type assertions: "no type assertions" stayed the same. (5 issues) 😐 + +3 tests got checked. 🤔 +1 test got better! 😍 +1 test met its goal! 🎉 +2 tests stayed the same. 😐 +", +] +`; diff --git a/test/__snapshots__/cache-worse.spec.ts.snap b/test/__snapshots__/cache-worse.spec.ts.snap index 288177464..42368357a 100644 --- a/test/__snapshots__/cache-worse.spec.ts.snap +++ b/test/__snapshots__/cache-worse.spec.ts.snap @@ -1,42 +1,41 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer doesn't cache if a test gets worse 1`] = ` +exports[`betterer > doesn't cache if a test gets worse 1`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/index.ts\\": \\"39946026984126639614\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "17b7a9d38e8423b7c5674b022577308345078b117ff187ec0964ad141313b94a", + "src/index.ts": "8228477b3ac0640fb6fd6402a5648cd6c737cff1716bac36d9855ddd4960e18a" } } }" `; -exports[`betterer doesn't cache if a test gets worse 2`] = ` +exports[`betterer > doesn't cache if a test gets worse 2`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/index.ts\\": \\"39946026984126639614\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "17b7a9d38e8423b7c5674b022577308345078b117ff187ec0964ad141313b94a", + "src/index.ts": "8228477b3ac0640fb6fd6402a5648cd6c737cff1716bac36d9855ddd4960e18a" } } }" `; -exports[`betterer doesn't cache if a test gets worse 3`] = ` -Array [ +exports[`betterer > doesn't cache if a test gets worse 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -44,16 +43,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -61,42 +57,26 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/cache-worse/src/index.ts\\". -・ New issue in \\"/fixtures/cache-worse/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/cache-worse/src/index.ts". ・ -・ /fixtures/cache-worse/src/index.ts ・ 1 | // HACK: ・ > 2 | // HACK: ・ | ^^^^^^^ RegExp match ・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/cache-worse/src/index.ts\\". -・ New issue in \\"/fixtures/cache-worse/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/cache-worse/src/index.ts". ・ -・ /fixtures/cache-worse/src/index.ts ・ 1 | // HACK: ・ > 2 | // HACK: ・ | ^^^^^^^ RegExp match ・ -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -105,42 +85,26 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/cache-worse/src/index.ts\\". -・ New issue in \\"/fixtures/cache-worse/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/cache-worse/src/index.ts". ・ -・ /fixtures/cache-worse/src/index.ts ・ 1 | // HACK: ・ > 2 | // HACK: ・ | ^^^^^^^ RegExp match ・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/cache-worse/src/index.ts\\". -・ New issue in \\"/fixtures/cache-worse/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/cache-worse/src/index.ts". ・ -・ /fixtures/cache-worse/src/index.ts ・ 1 | // HACK: ・ > 2 | // HACK: ・ | ^^^^^^^ RegExp match ・ -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 diff --git a/test/__snapshots__/cache.spec.ts.snap b/test/__snapshots__/cache.spec.ts.snap index 470c7c83d..2495e963c 100644 --- a/test/__snapshots__/cache.spec.ts.snap +++ b/test/__snapshots__/cache.spec.ts.snap @@ -1,28 +1,30 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should write a cache file 1`] = ` +exports[`betterer > should write a cache file 1`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/index.ts\\": \\"3994602698153364047\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "37daa4917945dac116dd2f8c930525ffe11f06df4ca2b4b30d54d51430c80603", + "src/index.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" } } }" `; -exports[`betterer should write a cache file 2`] = ` +exports[`betterer > should write a cache file 2`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/index.ts\\": \\"3994602698153364047\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "37daa4917945dac116dd2f8c930525ffe11f06df4ca2b4b30d54d51430c80603", + "src/index.ts": "5458e7616c690e6baf27a785a3f14f3e6fc3737fce3fd1f1e6c8e6692c093be0" } } }" `; -exports[`betterer should write a cache file 3`] = ` +exports[`betterer > should write a cache file 3`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -30,27 +32,28 @@ exports[`betterer should write a cache file 3`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:153364047\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"], - [1, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/index.ts:153364047": [ + [0, 0, 7, "RegExp match", "645651780"], + [1, 0, 7, "RegExp match", "645651780"] ] }\` }; " `; -exports[`betterer should write a cache file 4`] = ` +exports[`betterer > should write a cache file 4`] = ` "{ - \\"version\\": 2, - \\"testCache\\": { - \\"test\\": { - \\"src/index.ts\\": \\"39946026984126639614\\" + "version": 2, + "testCache": { + "test": { + ".betterer.js": "37daa4917945dac116dd2f8c930525ffe11f06df4ca2b4b30d54d51430c80603", + "src/index.ts": "8228477b3ac0640fb6fd6402a5648cd6c737cff1716bac36d9855ddd4960e18a" } } }" `; -exports[`betterer should write a cache file 5`] = ` +exports[`betterer > should write a cache file 5`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -58,36 +61,38 @@ exports[`betterer should write a cache file 5`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:4126639614\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/index.ts:4126639614": [ + [0, 0, 7, "RegExp match", "645651780"] ] }\` }; " `; -exports[`betterer should write a cache file 6`] = ` +exports[`betterer > should write a cache file 6`] = ` "{ - \\"version\\": 2, - \\"testCache\\": {} + "version": 2, + "testCache": { + "test": { + ".betterer.js": "37daa4917945dac116dd2f8c930525ffe11f06df4ca2b4b30d54d51430c80603", + "src/index.ts": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855" + } + } }" `; -exports[`betterer should write a cache file 7`] = ` -Array [ +exports[`betterer > should write a cache file 7`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -95,16 +100,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -112,44 +114,28 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/cache/src/index.ts\\". -・ New issue in \\"/fixtures/cache/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/cache/src/index.ts". ・ -・ /fixtures/cache/src/index.ts ・ 1 | // HACK: ・ 2 | // HACK: ・ > 3 | // HACK: ・ | ^^^^^^^ RegExp match ・ - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/cache/src/index.ts\\". -・ New issue in \\"/fixtures/cache/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/cache/src/index.ts". ・ -・ /fixtures/cache/src/index.ts ・ 1 | // HACK: ・ 2 | // HACK: ・ > 3 | // HACK: ・ | ^^^^^^^ RegExp match ・ -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -158,16 +144,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 1 remaining) 😍 +・ 1 fixed, 1 existing issues in "fixtures/cache/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 1 remaining) 😍 +・ 1 fixed, 1 existing issues in "fixtures/cache/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -175,16 +160,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" met its goal! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/cache/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 diff --git a/test/__snapshots__/complete.spec.ts.snap b/test/__snapshots__/complete.spec.ts.snap index fb086985d..a222e731f 100644 --- a/test/__snapshots__/complete.spec.ts.snap +++ b/test/__snapshots__/complete.spec.ts.snap @@ -1,55 +1,175 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should mark a test as complete when it reaches its goal 1`] = ` -Array [ +exports[`betterer > should mark a test as complete when it reaches its goal 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`should complete\`] = { + value: \`1 +\` +}; + +exports[\`complete\`] = { + value: \`0 +\` +}; + +exports[\`should complete then get worse\`] = { + value: \`1 +\` +}; +" +`; + +exports[`betterer > should mark a test as complete when it reaches its goal 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`should complete\`] = { + value: \`2 +\` +}; + +exports[\`complete\`] = { + value: \`0 +\` +}; + +exports[\`should complete then get worse\`] = { + value: \`2 +\` +}; +" +`; + +exports[`betterer > should mark a test as complete when it reaches its goal 3`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`should complete\`] = { + value: \`3 +\` +}; + +exports[\`complete\`] = { + value: \`0 +\` +}; + +exports[\`should complete then get worse\`] = { + value: \`3 +\` +}; +" +`; + +exports[`betterer > should mark a test as complete when it reaches its goal 4`] = ` +[ "🌟 Betterer (0ms): ", - "🎉 Betterer (0ms): 2 tests done! -✅ should complete: \\"should complete\\" got checked for the first time! 🎉 -✅ complete: \\"complete\\" has already met its goal! ✨ + "🎉 Betterer (0ms): 3 tests done! +✅ should complete: "should complete" got checked for the first time! 🎉 +✅ complete: "complete" met its goal! 🎉 +✅ should complete then get worse: "should complete then get worse" got checked for the first time! 🎉 ", - "🎉 Betterer (0ms): 2 tests done! -✅ should complete: \\"should complete\\" got checked for the first time! 🎉 -✅ complete: \\"complete\\" has already met its goal! ✨ + "🎉 Betterer (0ms): 3 tests done! +✅ should complete: "should complete" got checked for the first time! 🎉 +✅ complete: "complete" met its goal! 🎉 +✅ should complete then get worse: "should complete then get worse" got checked for the first time! 🎉 -2 tests got checked. 🤔 -1 test got checked for the first time! 🎉 +3 tests got checked. 🤔 +2 tests got checked for the first time! 🎉 1 test met its goal! 🎉 ", "🌟 Betterer (0ms): ", - "🎉 Betterer (0ms): 2 tests done! -✅ should complete: \\"should complete\\" met its goal! 🎉 -✅ complete: \\"complete\\" has already met its goal! ✨ + "🎉 Betterer (0ms): 3 tests done! +✅ should complete: "should complete" met its goal! 🎉 +✅ complete: "complete" has already met its goal! ✨ +✅ should complete then get worse: "should complete then get worse" met its goal! 🎉 ", - "🎉 Betterer (0ms): 2 tests done! -✅ should complete: \\"should complete\\" met its goal! 🎉 -✅ complete: \\"complete\\" has already met its goal! ✨ + "🎉 Betterer (0ms): 3 tests done! +✅ should complete: "should complete" met its goal! 🎉 +✅ complete: "complete" has already met its goal! ✨ +✅ should complete then get worse: "should complete then get worse" met its goal! 🎉 -2 tests got checked. 🤔 -1 test got better! 😍 -2 tests met its goal! 🎉 +3 tests got checked. 🤔 +2 tests got better! 😍 +3 tests met their goal! 🎉 ", "🌟 Betterer (0ms): ", - "🎉 Betterer (0ms): 2 tests done! -✅ should complete: \\"should complete\\" has already met its goal! ✨ -✅ complete: \\"complete\\" has already met its goal! ✨ + "🎉 Betterer (0ms): 3 tests done! +✅ should complete: "should complete" met its goal! 🎉 +✅ complete: "complete" has already met its goal! ✨ +✅ should complete then get worse: "should complete then get worse" met its goal! 🎉 ", - "🎉 Betterer (0ms): 2 tests done! -✅ should complete: \\"should complete\\" has already met its goal! ✨ -✅ complete: \\"complete\\" has already met its goal! ✨ + "🎉 Betterer (0ms): 3 tests done! +✅ should complete: "should complete" met its goal! 🎉 +✅ complete: "complete" has already met its goal! ✨ +✅ should complete then get worse: "should complete then get worse" met its goal! 🎉 -2 tests got checked. 🤔 -2 tests met its goal! 🎉 +3 tests got checked. 🤔 +2 tests got better! 😍 +3 tests met their goal! 🎉 +", + "🌟 Betterer (0ms): +", + "💥 Betterer (0ms): 3 tests done! 1 test errored! +✅ should complete: "should complete" met its goal! 🎉 +✅ complete: "complete" has already met its goal! ✨ +🔥 should complete then get worse: "should complete then get worse" got worse. 😔 +・ - Expected +・ + Result +・ +・ - 3 +・ + 1 +", + "💥 Betterer (0ms): 3 tests done! 1 test errored! +✅ should complete: "should complete" met its goal! 🎉 +✅ complete: "complete" has already met its goal! ✨ +🔥 should complete then get worse: "should complete then get worse" got worse. 😔 +・ - Expected +・ + Result +・ +・ - 3 +・ + 1 + +3 tests got checked. 🤔 +1 test got better! 😍 +2 tests met their goal! 🎉 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 ", ] `; -exports[`betterer should mark a test as complete when it reaches its goal 2`] = ` +exports[`betterer > should mark a test as complete when it reaches its goal 5`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: // https://phenomnomnominal.github.io/betterer/docs/results-file/#merge -//" +// +exports[\`should complete\`] = { + value: \`4 +\` +}; + +exports[\`complete\`] = { + value: \`0 +\` +}; + +exports[\`should complete then get worse\`] = { + value: \`3 +\` +}; +" `; diff --git a/test/__snapshots__/config-duplicate-names.spec.ts.snap b/test/__snapshots__/config-duplicate-names.spec.ts.snap new file mode 100644 index 000000000..6f2486beb --- /dev/null +++ b/test/__snapshots__/config-duplicate-names.spec.ts.snap @@ -0,0 +1,23 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work with multiple .betterer.ts files 1`] = ` +[ + " + / | / _ _ _ + '-.ooo.-' | |__ ___| |_| |_ ___ _ __ ___ _ __ +---ooooo--- | '_ // _ / __| __/ _ / '__/ _ / '__| + .-'ooo'-. | |_)| __/ |_| || __/ | | __/ | + / | / |_.__//___|/__|/__/___|_| /___|_| +", + " + / | / _ _ _ + '-.ooo.-' | |__ ___| |_| |_ ___ _ __ ___ _ __ +---ooooo--- | '_ // _ / __| __/ _ / '__/ _ / '__| + .-'ooo'-. | |_)| __/ |_| || __/ | | __/ | + / | / |_.__//___|/__|/__/___|_| /___|_| + + +Error: Duplicate test name found in "fixtures/config-multiple/grows.betterer.ts" and "fixtures/config-multiple/shrinks.betterer.ts": "test" +", +] +`; diff --git a/test/__snapshots__/config-invalid.spec.ts.snap b/test/__snapshots__/config-invalid.spec.ts.snap index bc068c998..acebf0a61 100644 --- a/test/__snapshots__/config-invalid.spec.ts.snap +++ b/test/__snapshots__/config-invalid.spec.ts.snap @@ -1,16 +1,14 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw when there is an invalid config file 1`] = ` -Array [ +exports[`betterer > should throw when there is an invalid config file 1`] = ` +[ " -Error: could not import config from \\"/fixtures/config-invalid/.betterer.ts\\". 😔 - -Error: ⨯ Unable to compile TypeScript: - fixtures/config-invalid/.betterer.ts:1:20 - error TS1109: Expression expected. - - 1 export const test = // Syntax Error +Error: could not import config from "fixtures/config-invalid/.betterer.ts". 😔 +Error: could not import "fixtures/config-invalid/.betterer.ts". 😔 +Error: Build failed with 1 error: + fixtures/config-invalid/.betterer.ts:1:35: ERROR: Unexpected end of file ", ] `; diff --git a/test/__snapshots__/config-js-esm.spec.ts.snap b/test/__snapshots__/config-js-esm.spec.ts.snap new file mode 100644 index 000000000..f79b32915 --- /dev/null +++ b/test/__snapshots__/config-js-esm.spec.ts.snap @@ -0,0 +1,47 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work with a .betterer.js file that uses ES modules 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got better! 😍 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got better! 😍 + +1 test got checked. 🤔 +1 test got better! 😍 +", +] +`; + +exports[`betterer > should work with a .betterer.js file that uses ES modules 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`2 +\` +}; +" +`; diff --git a/test/__snapshots__/config-missing.spec.ts.snap b/test/__snapshots__/config-missing.spec.ts.snap index b8cbabc58..b004242c2 100644 --- a/test/__snapshots__/config-missing.spec.ts.snap +++ b/test/__snapshots__/config-missing.spec.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw when there is not a config file 1`] = ` -Array [ +exports[`betterer > should throw when there is not a config file 1`] = ` +[ " -Error: could not find config file at \\"/fixtures/config-missing/.betterer\\". 😔 +Error: could not find config file at "fixtures/config-missing/.betterer.ts". 😔 -Error: Cannot find module '/fixtures/config-missing/.betterer' from 'packages/betterer/dist/config/config.js' +Error: All promises were rejected ", ] `; diff --git a/test/__snapshots__/config-multiple.spec.ts.snap b/test/__snapshots__/config-multiple.spec.ts.snap new file mode 100644 index 000000000..2d1b0b124 --- /dev/null +++ b/test/__snapshots__/config-multiple.spec.ts.snap @@ -0,0 +1,49 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work with multiple .betterer.ts files 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 grows: running "grows"! +🤔 shrinks: running "shrinks"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 grows: running "grows"! +🤔 shrinks: running "shrinks"! +", + "🌟 Betterer (0ms): 1 test running... 1 test done! +✅ grows: "grows" got checked for the first time! 🎉 +✅ shrinks: "shrinks" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ grows: "grows" got checked for the first time! 🎉 +✅ shrinks: "shrinks" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ grows: "grows" got checked for the first time! 🎉 +✅ shrinks: "shrinks" got checked for the first time! 🎉 + +2 tests got checked. 🤔 +2 tests got checked for the first time! 🎉 +", +] +`; + +exports[`betterer > should work with multiple .betterer.ts files 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`grows\`] = { + value: \`1 +\` +}; + +exports[\`shrinks\`] = { + value: \`-1 +\` +}; +" +`; diff --git a/test/__snapshots__/config-named-exports.spec.ts.snap b/test/__snapshots__/config-named-exports.spec.ts.snap index 0022fcbc5..9bdc666cb 100644 --- a/test/__snapshots__/config-named-exports.spec.ts.snap +++ b/test/__snapshots__/config-named-exports.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work with named exports in the config file 1`] = ` -Array [ +exports[`betterer > should work with named exports in the config file 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,16 +19,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 1 test got checked. 🤔 1 test got better! 😍 @@ -39,7 +33,7 @@ Array [ ] `; -exports[`betterer should work with named exports in the config file 2`] = ` +exports[`betterer > should work with named exports in the config file 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: diff --git a/test/__snapshots__/config-no-esbuild.spec.ts.snap b/test/__snapshots__/config-no-esbuild.spec.ts.snap new file mode 100644 index 000000000..0f914c626 --- /dev/null +++ b/test/__snapshots__/config-no-esbuild.spec.ts.snap @@ -0,0 +1,14 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should throw with a .betterer.ts file when esbuild is not available 1`] = ` +[ + " +Error: could not import config from "fixtures/config-no-esbuild/.betterer.tsx". 😔 + +Error: could not import "fixtures/config-no-esbuild/.betterer.tsx". 😔 + +Error: Transform failed with 1 error: + fixtures/config-no-esbuild/.betterer.tsx:4:1: ERROR: Expected identifier but found "{" +", +] +`; diff --git a/test/__snapshots__/config-no-extension.spec.ts.snap b/test/__snapshots__/config-no-extension.spec.ts.snap new file mode 100644 index 000000000..f169c06cc --- /dev/null +++ b/test/__snapshots__/config-no-extension.spec.ts.snap @@ -0,0 +1,20 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work with a TS config file that has no extension 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", +] +`; diff --git a/test/__snapshots__/config-ts-esm.spec.ts.snap b/test/__snapshots__/config-ts-esm.spec.ts.snap index 5da917baf..8ccb2086b 100644 --- a/test/__snapshots__/config-ts-esm.spec.ts.snap +++ b/test/__snapshots__/config-ts-esm.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work with a .betterer.ts file that uses ES modules 1`] = ` -Array [ +exports[`betterer > should work with a .betterer.ts file that uses ES modules 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,16 +19,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 1 test got checked. 🤔 1 test got better! 😍 @@ -39,7 +33,7 @@ Array [ ] `; -exports[`betterer should work with a .betterer.ts file that uses ES modules 2`] = ` +exports[`betterer > should work with a .betterer.ts file that uses ES modules 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: diff --git a/test/__snapshots__/config-ts.spec.ts.snap b/test/__snapshots__/config-ts.spec.ts.snap index 8751576a4..d84f72498 100644 --- a/test/__snapshots__/config-ts.spec.ts.snap +++ b/test/__snapshots__/config-ts.spec.ts.snap @@ -1,4 +1,56 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work with a .betterer.ts file 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🌟 Betterer (0ms): 1 test running... +✅ test: "test" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🌟 Betterer (0ms): 1 test running... +✅ test: "test" got better! 😍 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got better! 😍 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got better! 😍 + +1 test got checked. 🤔 +1 test got better! 😍 +", +] +`; + +exports[`betterer > should work with a .betterer.ts file 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`2 +\` +}; +" +`; exports[`betterer should work with a .betterer.ts file 1`] = ` Array [ diff --git a/test/__snapshots__/config-tsconfig.spec.ts.snap b/test/__snapshots__/config-tsconfig.spec.ts.snap deleted file mode 100644 index 6fa142064..000000000 --- a/test/__snapshots__/config-tsconfig.spec.ts.snap +++ /dev/null @@ -1,11 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer should load a custom tsconfigPath 1`] = ` -Array [ - " -Error: ⨯ Unable to compile TypeScript: - error TS6046: Argument for '--target' option must be: 'es3', 'es5', 'es6', 'es2015', 'es2016', 'es2017', 'es2018', 'es2019', 'es2020', 'es2021', 'esnext'. - -", -] -`; diff --git a/test/__snapshots__/config-validation.spec.ts.snap b/test/__snapshots__/config-validation.spec.ts.snap index 3e492e533..da5cfeacf 100644 --- a/test/__snapshots__/config-validation.spec.ts.snap +++ b/test/__snapshots__/config-validation.spec.ts.snap @@ -1,144 +1,337 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw when there is invalid config 1`] = ` -Array [ +exports[`betterer > should throw when there is invalid config: { cache: 'betterer' } 1`] = ` +[ " -Error: \\"cache\\" must be \`true\` or \`false\`. Received \`1234\`. -", - " -Error: \\"cache\\" must be \`true\` or \`false\`. Received \`\\"betterer\\"\`. -", - " -Error: \\"cache\\" must be \`true\` or \`false\`. Received \`{}\`. -", - " -Error: \\"cachePath\\" must be a string. Received \`1234\`. -", - " -Error: \\"cachePath\\" must be a string. Received \`{}\`. +Error: "cache" must be \`true\` or \`false\`. Received \`"betterer"\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { cache: {} } 1`] = ` +[ " -Error: \\"cachePath\\" must be a string. Received \`true\`. +Error: "cache" must be \`true\` or \`false\`. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { cache: 1234 } 1`] = ` +[ " -Error: \\"ci\\" must be \`true\` or \`false\`. Received \`1234\`. +Error: "cache" must be \`true\` or \`false\`. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { cachePath: {} } 1`] = ` +[ " -Error: \\"ci\\" must be \`true\` or \`false\`. Received \`\\"betterer\\"\`. +Error: "cachePath" must be a string or an array. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { cachePath: 1234 } 1`] = ` +[ " -Error: \\"ci\\" must be \`true\` or \`false\`. Received \`{}\`. +Error: "cachePath" must be a string or an array. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { cachePath: true } 1`] = ` +[ " -Error: \\"configPaths\\" must be an array of strings. Received \`[1234]\`. +Error: "cachePath" must be a string or an array. Received \`true\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { ci: 'betterer' } 1`] = ` +[ " -Error: \\"configPaths\\" must be an array of strings. Received \`[true]\`. +Error: "ci" must be \`true\` or \`false\`. Received \`"betterer"\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { ci: {} } 1`] = ` +[ " -Error: \\"configPaths\\" must be an array of strings. Received \`[{}]\`. +Error: "ci" must be \`true\` or \`false\`. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { ci: 1234 } 1`] = ` +[ " -Error: \\"configPaths\\" must be an array of strings. Received \`[1234]\`. +Error: "ci" must be \`true\` or \`false\`. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { configPaths: [ 1234 ] } 1`] = ` +[ " -Error: \\"cwd\\" must be a string. Received \`1234\`. +Error: "configPaths" must be an array of strings. Received \`[1234]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { configPaths: {} } 1`] = ` +[ " -Error: \\"cwd\\" must be a string. Received \`{}\`. +Error: "configPaths" must be an array of strings. Received \`[{}]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { configPaths: 1234 } 1`] = ` +[ " -Error: \\"filters\\" must be an array of strings or RegExps. Received \`[1234]\`. +Error: "configPaths" must be an array of strings. Received \`[1234]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { configPaths: true } 1`] = ` +[ " -Error: \\"filters\\" must be an array of strings or RegExps. Received \`[true]\`. +Error: "configPaths" must be an array of strings. Received \`[true]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { cwd: {} } 1`] = ` +[ " -Error: \\"filters\\" must be an array of strings or RegExps. Received \`[{}]\`. +Error: "cwd" must be a string. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { cwd: 1234 } 1`] = ` +[ " -Error: \\"filters\\" must be an array of strings or RegExps. Received \`[1234]\`. +Error: "cwd" must be a string. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { filters: [ 1234 ] } 1`] = ` +[ " -Error: \\"ignores\\" must be an array of strings. Received \`[1234]\`. +Error: "filters" must be an array of strings or RegExps. Received \`[1234]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { filters: {} } 1`] = ` +[ " -Error: \\"ignores\\" must be an array of strings. Received \`[true]\`. +Error: "filters" must be an array of strings or RegExps. Received \`[{}]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { filters: 1234 } 1`] = ` +[ " -Error: \\"ignores\\" must be an array of strings. Received \`[{}]\`. +Error: "filters" must be an array of strings or RegExps. Received \`[1234]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { filters: true } 1`] = ` +[ " -Error: \\"ignores\\" must be an array of strings. Received \`[1234]\`. +Error: "filters" must be an array of strings or RegExps. Received \`[true]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { logo: [ 1234 ] } 1`] = ` +[ " -Error: \\"logo\\" must be \`true\` or \`false\`. Received \`1234\`. +Error: "logo" must be \`true\` or \`false\`. Received \`[1234]\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { logo: {} } 1`] = ` +[ " -Error: \\"logo\\" must be \`true\` or \`false\`. Received \`{}\`. +Error: "logo" must be \`true\` or \`false\`. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { logo: 1234 } 1`] = ` +[ " -Error: \\"logo\\" must be \`true\` or \`false\`. Received \`[1234]\`. +Error: "logo" must be \`true\` or \`false\`. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { precommit: 'betterer' } 1`] = ` +[ " -Error: \\"precommit\\" must be \`true\` or \`false\`. Received \`1234\`. +Error: "precommit" must be \`true\` or \`false\`. Received \`"betterer"\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { precommit: {} } 1`] = ` +[ " -Error: \\"precommit\\" must be \`true\` or \`false\`. Received \`\\"betterer\\"\`. +Error: "precommit" must be \`true\` or \`false\`. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { precommit: 1234 } 1`] = ` +[ " -Error: \\"precommit\\" must be \`true\` or \`false\`. Received \`{}\`. +Error: "precommit" must be \`true\` or \`false\`. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { resultsPath: {} } 1`] = ` +[ " -Error: \\"resultsPath\\" must be a string. Received \`1234\`. +Error: "resultsPath" must be a string or an array. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { resultsPath: 1234 } 1`] = ` +[ " -Error: \\"resultsPath\\" must be a string. Received \`true\`. +Error: "resultsPath" must be a string or an array. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { resultsPath: true } 1`] = ` +[ " -Error: \\"resultsPath\\" must be a string. Received \`{}\`. +Error: "resultsPath" must be a string or an array. Received \`true\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { silent: 'betterer' } 1`] = ` +[ " -Error: \\"silent\\" must be \`true\` or \`false\`. Received \`1234\`. +Error: "silent" must be \`true\` or \`false\`. Received \`"betterer"\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { silent: {} } 1`] = ` +[ " -Error: \\"silent\\" must be \`true\` or \`false\`. Received \`\\"betterer\\"\`. +Error: "silent" must be \`true\` or \`false\`. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { silent: 1234 } 1`] = ` +[ " -Error: \\"silent\\" must be \`true\` or \`false\`. Received \`{}\`. +Error: "silent" must be \`true\` or \`false\`. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { strict: 'betterer' } 1`] = ` +[ " -Error: \\"strict\\" must be \`true\` or \`false\`. Received \`1234\`. +Error: "strict" must be \`true\` or \`false\`. Received \`"betterer"\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { strict: {} } 1`] = ` +[ " -Error: \\"strict\\" must be \`true\` or \`false\`. Received \`\\"betterer\\"\`. +Error: "strict" must be \`true\` or \`false\`. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { strict: 1234 } 1`] = ` +[ " -Error: \\"strict\\" must be \`true\` or \`false\`. Received \`{}\`. +Error: "strict" must be \`true\` or \`false\`. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { update: 'betterer' } 1`] = ` +[ " -Error: \\"update\\" must be \`true\` or \`false\`. Received \`1234\`. +Error: "update" must be \`true\` or \`false\`. Received \`"betterer"\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { update: {} } 1`] = ` +[ " -Error: \\"update\\" must be \`true\` or \`false\`. Received \`\\"betterer\\"\`. +Error: "update" must be \`true\` or \`false\`. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { update: 1234 } 1`] = ` +[ " -Error: \\"update\\" must be \`true\` or \`false\`. Received \`{}\`. +Error: "update" must be \`true\` or \`false\`. Received \`1234\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { workers: 'betterer' } 1`] = ` +[ " -Error: \\"workers\\" must be a number. Received \`\\"betterer\\"\`. +Error: "workers" must be a number. Received \`"betterer"\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { workers: {} } 1`] = ` +[ " -Error: \\"workers\\" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`null\`. +Error: "workers" must be a number. Received \`{}\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { workers: -1 } 1`] = ` +[ " -Error: \\"workers\\" must be a number. Received \`{}\`. +Error: "workers" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`-1\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { workers: 1000 } 1`] = ` +[ " -Error: \\"workers\\" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`-1\`. +Error: "workers" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`1000\`. ", +] +`; + +exports[`betterer > should throw when there is invalid config: { workers: NaN } 1`] = ` +[ " -Error: \\"workers\\" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`1000\`. +Error: "workers" must be more than zero and not more than the number of available CPUs (1). To disable workers, set to \`false\`. Received \`null\`. ", ] `; diff --git a/test/__snapshots__/conflict.spec.ts.snap b/test/__snapshots__/conflict.spec.ts.snap index 234707b3e..2059bff46 100644 --- a/test/__snapshots__/conflict.spec.ts.snap +++ b/test/__snapshots__/conflict.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when there is a merge conflict in the results file 1`] = ` -Array [ +exports[`betterer > should work when there is a merge conflict in the results file 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -22,7 +19,7 @@ Array [ ] `; -exports[`betterer should work when there is a merge conflict in the results file 2`] = ` +exports[`betterer > should work when there is a merge conflict in the results file 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -30,8 +27,8 @@ exports[`betterer should work when there is a merge conflict in the results file // exports[\`test\`] = { value: \`{ - \\"src/index.ts:1884655653\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:1884655653": [ + [0, 0, 11, "TSQuery match", "3870399096"] ] }\` }; diff --git a/test/__snapshots__/coverage-files-better.spec.ts.snap b/test/__snapshots__/coverage-files-better.spec.ts.snap index af9fbba03..9d9fbfc5c 100644 --- a/test/__snapshots__/coverage-files-better.spec.ts.snap +++ b/test/__snapshots__/coverage-files-better.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report an improved file coverage result 1`] = ` -Array [ +exports[`betterer > should report an improved file coverage result 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,16 +19,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 1 test got checked. 🤔 1 test got better! 😍 @@ -39,16 +37,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ new file: src/file-1.ts +・ src/file-1.ts is gone. ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ new file: src/file-1.ts +・ src/file-1.ts is gone. 1 test got checked. 🤔 1 test got better! 😍 @@ -56,16 +55,29 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" met its goal! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ "branches" coverage is worse in "src/file-2.ts": 100 > 0 +・ "functions" coverage is worse in "src/file-2.ts": 4 > 0 +・ "lines" coverage is worse in "src/file-2.ts": 60 > 0 +・ "statements" coverage is worse in "src/file-2.ts": 140 > 0 +・ "branches" coverage is better in "src/file-2.ts": 0 < 100 +・ "functions" coverage is better in "src/file-2.ts": 0 < 4 +・ "lines" coverage is better in "src/file-2.ts": 0 < 60 +・ "statements" coverage is better in "src/file-2.ts": 0 < 140 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ "branches" coverage is worse in "src/file-2.ts": 100 > 0 +・ "functions" coverage is worse in "src/file-2.ts": 4 > 0 +・ "lines" coverage is worse in "src/file-2.ts": 60 > 0 +・ "statements" coverage is worse in "src/file-2.ts": 140 > 0 +・ "branches" coverage is better in "src/file-2.ts": 0 < 100 +・ "functions" coverage is better in "src/file-2.ts": 0 < 4 +・ "lines" coverage is better in "src/file-2.ts": 0 < 60 +・ "statements" coverage is better in "src/file-2.ts": 0 < 140 1 test got checked. 🤔 1 test got better! 😍 diff --git a/test/__snapshots__/coverage-files-exclude.spec.ts.snap b/test/__snapshots__/coverage-files-exclude.spec.ts.snap index 071b05d70..d0ecf7db8 100644 --- a/test/__snapshots__/coverage-files-exclude.spec.ts.snap +++ b/test/__snapshots__/coverage-files-exclude.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when excluding specific files 1`] = ` -Array [ +exports[`betterer > should work when excluding specific files 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,16 +19,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 1 test got checked. 🤔 1 test got better! 😍 @@ -39,16 +37,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/coverage-files-include.spec.ts.snap b/test/__snapshots__/coverage-files-include.spec.ts.snap index 7d8f1be73..a5efd3bfb 100644 --- a/test/__snapshots__/coverage-files-include.spec.ts.snap +++ b/test/__snapshots__/coverage-files-include.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when including specific files 1`] = ` -Array [ +exports[`betterer > should work when including specific files 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,16 +19,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 1 test got checked. 🤔 1 test got better! 😍 @@ -39,16 +37,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/coverage-files-same.spec.ts.snap b/test/__snapshots__/coverage-files-same.spec.ts.snap index c51734f30..0c1d61704 100644 --- a/test/__snapshots__/coverage-files-same.spec.ts.snap +++ b/test/__snapshots__/coverage-files-same.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report a stable per-file coverage result 1`] = ` +exports[`betterer > should report a stable per-file coverage result 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,17 +8,17 @@ exports[`betterer should report a stable per-file coverage result 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/file-1.ts\\": { - \\"lines\\": 50, - \\"statements\\": 130, - \\"functions\\": 15, - \\"branches\\": 100 + "src/file-1.ts": { + "lines": 50, + "statements": 130, + "functions": 15, + "branches": 100 }, - \\"src/file-2.ts\\": { - \\"lines\\": 60, - \\"statements\\": 140, - \\"functions\\": 4, - \\"branches\\": 100 + "src/file-2.ts": { + "lines": 60, + "statements": 140, + "functions": 4, + "branches": 100 } } \` @@ -26,21 +26,18 @@ exports[\`test\`] = { " `; -exports[`betterer should report a stable per-file coverage result 2`] = ` -Array [ +exports[`betterer > should report a stable per-file coverage result 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -48,16 +45,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -65,16 +59,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -82,16 +73,15 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 +・ src/file-3.ts is gone. ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 +・ src/file-3.ts is gone. 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/coverage-files-worse.spec.ts.snap b/test/__snapshots__/coverage-files-worse.spec.ts.snap index c9ab74762..d1996ede6 100644 --- a/test/__snapshots__/coverage-files-worse.spec.ts.snap +++ b/test/__snapshots__/coverage-files-worse.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report a worse file coverage result 1`] = ` -Array [ +exports[`betterer > should report a worse file coverage result 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,27 +19,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 - -Error: \\"test\\" got worse. 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"lines\\" coverage is worse in \\"src/file-1.ts\\": 60 > 50 - -Error: \\"test\\" got worse. 😔 +🔥 test: "test" got worse. 😔 +・ "lines" coverage is better in "src/file-1.ts": 50 < 60 +・ "lines" coverage is worse in "src/file-1.ts": 60 > 50 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"lines\\" coverage is worse in \\"src/file-1.ts\\": 60 > 50 - -Error: \\"test\\" got worse. 😔 +🔥 test: "test" got worse. 😔 +・ "lines" coverage is better in "src/file-1.ts": 50 < 60 +・ "lines" coverage is worse in "src/file-1.ts": 60 > 50 1 test got checked. 🤔 1 test got worse. 😔 @@ -52,29 +39,21 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 - -Error: \\"test\\" got worse. 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"lines\\" coverage is better in \\"src/file-1.ts\\": 40 < 50 -・ \\"lines\\" coverage is worse in \\"src/file-2.ts\\": 90 > 60 - -Error: \\"test\\" got worse. 😔 +🔥 test: "test" got worse. 😔 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-2.ts": 60 < 90 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 +・ "lines" coverage is worse in "src/file-2.ts": 90 > 60 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"lines\\" coverage is better in \\"src/file-1.ts\\": 40 < 50 -・ \\"lines\\" coverage is worse in \\"src/file-2.ts\\": 90 > 60 - -Error: \\"test\\" got worse. 😔 +🔥 test: "test" got worse. 😔 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-2.ts": 60 < 90 +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 +・ "lines" coverage is worse in "src/file-2.ts": 90 > 60 1 test got checked. 🤔 1 test got worse. 😔 @@ -84,32 +63,26 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 - -Error: \\"test\\" got worse. 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"lines\\" coverage is better in \\"src/file-1.ts\\": 40 < 50 -・ \\"lines\\" coverage is worse in \\"src/file-2.ts\\": 90 > 60 +🔥 test: "test" got worse. 😔 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-2.ts": 60 < 90 +・ src/file-3.ts is gone. +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 +・ "lines" coverage is worse in "src/file-2.ts": 90 > 60 ・ new file: src/file-3.ts - -Error: \\"test\\" got worse. 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"lines\\" coverage is better in \\"src/file-1.ts\\": 40 < 50 -・ \\"lines\\" coverage is worse in \\"src/file-2.ts\\": 90 > 60 +🔥 test: "test" got worse. 😔 +・ "lines" coverage is worse in "src/file-1.ts": 50 > 40 +・ "lines" coverage is better in "src/file-2.ts": 60 < 90 +・ src/file-3.ts is gone. +・ "lines" coverage is better in "src/file-1.ts": 40 < 50 +・ "lines" coverage is worse in "src/file-2.ts": 90 > 60 ・ new file: src/file-3.ts -Error: \\"test\\" got worse. 😔 - 1 test got checked. 🤔 1 test got worse. 😔 diff --git a/test/__snapshots__/coverage-report-invalid.spec.ts.snap b/test/__snapshots__/coverage-report-invalid.spec.ts.snap index c1f98718e..9c8f062f8 100644 --- a/test/__snapshots__/coverage-report-invalid.spec.ts.snap +++ b/test/__snapshots__/coverage-report-invalid.spec.ts.snap @@ -1,24 +1,14 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should fail when the coverage report is invalid 1`] = ` -Array [ +exports[`betterer > should fail when the coverage report is invalid 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: Could not read coverage summary -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: Could not read coverage summary - -Error: Could not read coverage summary +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! 🔥 test: Could not read coverage summary - -Error: Could not read coverage summary ", "💥 Betterer (0ms): 1 test done! 1 test errored! 🔥 test: Could not read coverage summary diff --git a/test/__snapshots__/coverage-report-missing.spec.ts.snap b/test/__snapshots__/coverage-report-missing.spec.ts.snap index 5f7d30c72..5c25e7aa9 100644 --- a/test/__snapshots__/coverage-report-missing.spec.ts.snap +++ b/test/__snapshots__/coverage-report-missing.spec.ts.snap @@ -1,24 +1,14 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should fail when the coverage report is missing 1`] = ` -Array [ +exports[`betterer > should fail when the coverage report is missing 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: Could not read coverage summary -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: Could not read coverage summary - -Error: Could not read coverage summary +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! 🔥 test: Could not read coverage summary - -Error: Could not read coverage summary ", "💥 Betterer (0ms): 1 test done! 1 test errored! 🔥 test: Could not read coverage summary diff --git a/test/__snapshots__/coverage-total-include.spec.ts.snap b/test/__snapshots__/coverage-total-include.spec.ts.snap new file mode 100644 index 000000000..430f9ed47 --- /dev/null +++ b/test/__snapshots__/coverage-total-include.spec.ts.snap @@ -0,0 +1,117 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should report the total coverage for included files 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "total": { "lines": 50, "statements": 130, "functions": 15, "branches": 100 } +} +\` +}; +" +`; + +exports[`betterer > should report the total coverage for included files 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "total": { "lines": 30, "statements": 130, "functions": 15, "branches": 100 } +} +\` +}; +" +`; + +exports[`betterer > should report the total coverage for included files 3`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "total": { "lines": 30, "statements": 130, "functions": 15, "branches": 100 } +} +\` +}; +" +`; + +exports[`betterer > should report the total coverage for included files 4`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. 😐 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "total": 50 > 30 +・ "lines" coverage is better in "total": 30 < 50 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "total": 50 > 30 +・ "lines" coverage is better in "total": 30 < 50 + +1 test got checked. 🤔 +1 test got better! 😍 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. 😔 +・ "lines" coverage is better in "total": 30 < 60 +・ "lines" coverage is worse in "total": 60 > 30 +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. 😔 +・ "lines" coverage is better in "total": 30 < 60 +・ "lines" coverage is worse in "total": 60 > 30 + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 +", +] +`; diff --git a/test/__snapshots__/coverage-total.spec.ts.snap b/test/__snapshots__/coverage-total.spec.ts.snap index 9b2b3d7d3..0406eb907 100644 --- a/test/__snapshots__/coverage-total.spec.ts.snap +++ b/test/__snapshots__/coverage-total.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the total coverage 1`] = ` +exports[`betterer > should report the total coverage 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,28 +8,25 @@ exports[`betterer should report the total coverage 1`] = ` // exports[\`test\`] = { value: \`{ - \\"total\\": { \\"lines\\": 110, \\"statements\\": 270, \\"functions\\": 19, \\"branches\\": 200 } + "total": { "lines": 110, "statements": 270, "functions": 19, "branches": 200 } } \` }; " `; -exports[`betterer should report the total coverage 2`] = ` -Array [ +exports[`betterer > should report the total coverage 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -37,16 +34,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 +✅ test: "test" stayed the same. 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -54,16 +48,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "total": 110 > 10 +・ "lines" coverage is better in "total": 10 < 110 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 +・ "lines" coverage is worse in "total": 110 > 10 +・ "lines" coverage is better in "total": 10 < 110 1 test got checked. 🤔 1 test got better! 😍 @@ -71,27 +66,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. 😔 - -Error: \\"test\\" got worse. 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"branches\\" coverage is worse in \\"total\\": 210 > 200 - -Error: \\"test\\" got worse. 😔 +🔥 test: "test" got worse. 😔 +・ "branches" coverage is better in "total": 200 < 210 +・ "branches" coverage is worse in "total": 210 > 200 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. 😔 -・ \\"branches\\" coverage is worse in \\"total\\": 210 > 200 - -Error: \\"test\\" got worse. 😔 +🔥 test: "test" got worse. 😔 +・ "branches" coverage is better in "total": 200 < 210 +・ "branches" coverage is worse in "total": 210 > 200 1 test got checked. 🤔 1 test got worse. 😔 diff --git a/test/__snapshots__/deadline-file-test-expired.spec.ts.snap b/test/__snapshots__/deadline-file-test-expired.spec.ts.snap index a2c2494e0..a560ab20d 100644 --- a/test/__snapshots__/deadline-file-test-expired.spec.ts.snap +++ b/test/__snapshots__/deadline-file-test-expired.spec.ts.snap @@ -1,31 +1,28 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should mark a file test as expired when it is past its deadline 1`] = ` -Array [ +exports[`betterer > should mark a file test as expired when it is past its deadline 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 -・ \\"test\\" has passed its deadline. 👻 +✅ test: "test" got checked for the first time! (1 issue) 🎉 +・ "test" has passed its deadline. 👻 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 -・ \\"test\\" has passed its deadline. 👻 +✅ test: "test" got checked for the first time! (1 issue) 🎉 +・ "test" has passed its deadline. 👻 1 test got checked. 🤔 1 test got checked for the first time! 🎉 -1 test has passed its deadline. 👻) +1 test has passed its deadline. 👻 ", ] `; -exports[`betterer should mark a file test as expired when it is past its deadline 2`] = ` +exports[`betterer > should mark a file test as expired when it is past its deadline 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -33,8 +30,8 @@ exports[`betterer should mark a file test as expired when it is past its deadlin // exports[\`test\`] = { value: \`{ - \\"src/index.ts:4288672895\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:4288672895": [ + [0, 0, 11, "TSQuery match", "3870399096"] ] }\` }; diff --git a/test/__snapshots__/deadline-future.spec.ts.snap b/test/__snapshots__/deadline-future.spec.ts.snap index 7b5bbf8fc..6be58ca7e 100644 --- a/test/__snapshots__/deadline-future.spec.ts.snap +++ b/test/__snapshots__/deadline-future.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should do nothing when a test is not past its deadline 1`] = ` -Array [ +exports[`betterer > should do nothing when a test is not past its deadline 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 +✅ test: "test" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,7 +19,7 @@ Array [ ] `; -exports[`betterer should do nothing when a test is not past its deadline 2`] = ` +exports[`betterer > should do nothing when a test is not past its deadline 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: diff --git a/test/__snapshots__/deadline-invalid.spec.ts.snap b/test/__snapshots__/deadline-invalid.spec.ts.snap new file mode 100644 index 000000000..320dc2b86 --- /dev/null +++ b/test/__snapshots__/deadline-invalid.spec.ts.snap @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should do throw when the deadline is not a valid date 1`] = ` +[ + " +Error: invalid deadline: Oi oi oi +", +] +`; diff --git a/test/__snapshots__/deadline-test-expired.spec.ts.snap b/test/__snapshots__/deadline-test-expired.spec.ts.snap index 6bfd265d6..648df97e7 100644 --- a/test/__snapshots__/deadline-test-expired.spec.ts.snap +++ b/test/__snapshots__/deadline-test-expired.spec.ts.snap @@ -1,31 +1,28 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should mark a test as expired when it is past its deadline 1`] = ` -Array [ +exports[`betterer > should mark a test as expired when it is past its deadline 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 -・ \\"test\\" has passed its deadline. 👻 +✅ test: "test" got checked for the first time! 🎉 +・ "test" has passed its deadline. 👻 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 -・ \\"test\\" has passed its deadline. 👻 +✅ test: "test" got checked for the first time! 🎉 +・ "test" has passed its deadline. 👻 1 test got checked. 🤔 1 test got checked for the first time! 🎉 -1 test has passed its deadline. 👻) +1 test has passed its deadline. 👻 ", ] `; -exports[`betterer should mark a test as expired when it is past its deadline 2`] = ` +exports[`betterer > should mark a test as expired when it is past its deadline 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: diff --git a/test/__snapshots__/eslint-complex-project.spec.ts.snap b/test/__snapshots__/eslint-complex-project.spec.ts.snap index 6279411f9..1454f74a3 100644 --- a/test/__snapshots__/eslint-complex-project.spec.ts.snap +++ b/test/__snapshots__/eslint-complex-project.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the status of a new eslint rule with a complex set up 1`] = ` +exports[`betterer > should report the status of a new eslint rule with a complex set up 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,29 @@ exports[`betterer should report the status of a new eslint rule with a complex s // exports[\`test\`] = { value: \`{ - \\"src/index.ts:3201740415\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/directory/index.ts:2738652613": [ + [0, 22, 18, "eslint(@typescript-eslint/prefer-string-starts-ends-with): Use \\'String#startsWith\\' method instead.", "2194816964"] + ], + "src/index.ts:3201740415": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer should report the status of a new eslint rule with a complex set up 2`] = ` -Array [ +exports[`betterer > should report the status of a new eslint rule with a complex set up 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,16 +38,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -55,42 +52,26 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/eslint-complex-project/src/index.ts\\". -・ New issue in \\"/fixtures/eslint-complex-project/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 1 existing, 1 new issues in "fixtures/eslint-complex-project/src/index.ts". ・ -・ /fixtures/eslint-complex-project/src/index.ts ・ 1 | debugger; ・ > 2 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/eslint-complex-project/src/index.ts\\". -・ New issue in \\"/fixtures/eslint-complex-project/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 1 existing, 1 new issues in "fixtures/eslint-complex-project/src/index.ts". ・ -・ /fixtures/eslint-complex-project/src/index.ts ・ 1 | debugger; ・ > 2 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -99,16 +80,17 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" met its goal! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/eslint-complex-project/src/directory/index.ts". +・ 1 fixed issue in "fixtures/eslint-complex-project/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/eslint-complex-project/src/directory/index.ts". +・ 1 fixed issue in "fixtures/eslint-complex-project/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -117,16 +99,13 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" has already met its goal! ✨ +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ +✅ test: "test" has already met its goal! ✨ ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ +✅ test: "test" has already met its goal! ✨ 1 test got checked. 🤔 1 test met its goal! 🎉 diff --git a/test/__snapshots__/eslint-complex-rule.spec.ts.snap b/test/__snapshots__/eslint-complex-rule.spec.ts.snap index 5a595a7e0..041d8a289 100644 --- a/test/__snapshots__/eslint-complex-rule.spec.ts.snap +++ b/test/__snapshots__/eslint-complex-rule.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should handle complex eslint rule options 1`] = ` +exports[`betterer > should handle complex eslint rule options 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should handle complex eslint rule options 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:1015454386\\": [ - [0, 0, 34, \\"Prefer named exports\\", \\"1332276585\\"] + "src/index.ts:1015454386": [ + [0, 0, 34, "eslint(no-restricted-syntax): Prefer named exports", "1332276585"] ] }\` }; " `; -exports[`betterer should handle complex eslint rule options 2`] = ` -Array [ +exports[`betterer > should handle complex eslint rule options 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 diff --git a/test/__snapshots__/eslint-files-config.spec.ts.snap b/test/__snapshots__/eslint-files-config.spec.ts.snap new file mode 100644 index 000000000..958998fae --- /dev/null +++ b/test/__snapshots__/eslint-files-config.spec.ts.snap @@ -0,0 +1,10 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should throw if there are files options included in the config 1`] = ` +[ + " +Error: Please use \`eslint({ ... }).include()\` or \`eslint({ ... }).exclude()\` to control linting extra files, using paths relative to your test definition file. + This makes it easier to configure exactly which files should be checked! ❌ +", +] +`; diff --git a/test/__snapshots__/eslint-ignores-config.spec.ts.snap b/test/__snapshots__/eslint-ignores-config.spec.ts.snap new file mode 100644 index 000000000..8855ee627 --- /dev/null +++ b/test/__snapshots__/eslint-ignores-config.spec.ts.snap @@ -0,0 +1,10 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should throw if there are ignores options included in the config 1`] = ` +[ + " +Error: Please use \`eslint({ ... }).include()\` or \`eslint({ ... }).exclude()\` to control linting extra files, using paths relative to your test definition file. + This makes it easier to configure exactly which files should be checked! ❌ +", +] +`; diff --git a/test/__snapshots__/eslint-no-column-rule.spec.ts.snap b/test/__snapshots__/eslint-no-column-rule.spec.ts.snap new file mode 100644 index 000000000..3b727c314 --- /dev/null +++ b/test/__snapshots__/eslint-no-column-rule.spec.ts.snap @@ -0,0 +1,37 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should handle eslint rules that mark the entire line of code 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "src/index.ts:3395480044": [ + [0, 0, 27, "eslint(@eslint-community/eslint-comments/no-unlimited-disable): Unexpected unlimited \\'eslint-disable-next-line\\' comment. Specify some rule names to disable.", "1912322876"], + [0, 0, 27, "eslint(@eslint-community/eslint-comments/require-description): Unexpected undescribed directive comment. Include descriptions to explain why the comment is necessary.", "1912322876"] + ] + }\` +}; +" +`; + +exports[`betterer > should handle eslint rules that mark the entire line of code 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", +] +`; diff --git a/test/__snapshots__/eslint-no-config.spec.ts.snap b/test/__snapshots__/eslint-no-config.spec.ts.snap index 747c8819f..5062d7e90 100644 --- a/test/__snapshots__/eslint-no-config.spec.ts.snap +++ b/test/__snapshots__/eslint-no-config.spec.ts.snap @@ -1,9 +1,9 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if there are no config 1`] = ` -Array [ +exports[`betterer > should throw when trying to run ESLint with no config 1`] = ` +[ " -Error: for \`@betterer/eslint\` to work, you need to provide rule options, e.g. \`{ 'no-debugger': 'error' }\`. ❌ +Error: for \`@betterer/eslint\` to work, you need to provide configuration options, e.g. \`{ rules: { 'no-debugger': 'error' } }\`. ❌ ", ] `; diff --git a/test/__snapshots__/eslint-plugin-rules.spec.ts.snap b/test/__snapshots__/eslint-plugin-rules.spec.ts.snap new file mode 100644 index 000000000..6ae6d942e --- /dev/null +++ b/test/__snapshots__/eslint-plugin-rules.spec.ts.snap @@ -0,0 +1,38 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should handle eslint rule from other plugins 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "src/index.ts:3387724021": [ + [0, 0, 20, "eslint(@eslint-community/eslint-comments/disable-enable-pair): Requires \\'eslint-enable\\' directive.", "3387724021"], + [0, 0, 20, "eslint(@eslint-community/eslint-comments/no-unlimited-disable): Unexpected unlimited \\'eslint-disable\\' comment. Specify some rule names to disable.", "3387724021"], + [0, 0, 0, "eslint: Unused eslint-disable directive (no problems were reported).", "963424369"] + ] + }\` +}; +" +`; + +exports[`betterer > should handle eslint rule from other plugins 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (3 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (3 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", +] +`; diff --git a/test/__snapshots__/eslint.spec.ts.snap b/test/__snapshots__/eslint.spec.ts.snap index 646eba29a..fc60e1ec3 100644 --- a/test/__snapshots__/eslint.spec.ts.snap +++ b/test/__snapshots__/eslint.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the status of a new eslint rule 1`] = ` +exports[`betterer > should report the status of a new eslint rule 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should report the status of a new eslint rule 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:3201740415\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/index.ts:3201740415": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer should report the status of a new eslint rule 2`] = ` -Array [ +exports[`betterer > should report the status of a new eslint rule 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,16 +35,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -55,42 +49,26 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/eslint/src/index.ts\\". -・ New issue in \\"/fixtures/eslint/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/eslint/src/index.ts". ・ -・ /fixtures/eslint/src/index.ts ・ 1 | debugger; ・ > 2 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/eslint/src/index.ts\\". -・ New issue in \\"/fixtures/eslint/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/eslint/src/index.ts". ・ -・ /fixtures/eslint/src/index.ts ・ 1 | debugger; ・ > 2 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -99,16 +77,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" met its goal! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/eslint/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/eslint/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -117,16 +94,13 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" has already met its goal! ✨ +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ +✅ test: "test" has already met its goal! ✨ ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ +✅ test: "test" has already met its goal! ✨ 1 test got checked. 🤔 1 test met its goal! 🎉 diff --git a/test/__snapshots__/exclude-files.spec.ts.snap b/test/__snapshots__/exclude-files.spec.ts.snap index 81ddc048f..57254d795 100644 --- a/test/__snapshots__/exclude-files.spec.ts.snap +++ b/test/__snapshots__/exclude-files.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should exclude specific files from results 1`] = ` +exports[`betterer > should exclude specific files from results 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,18 +8,21 @@ exports[`betterer should exclude specific files from results 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/exclude.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/exclude-glob.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ], - \\"src/index.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/exclude.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] + ], + "src/index.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ] }\` }; " `; -exports[`betterer should exclude specific files from results 2`] = ` +exports[`betterer > should exclude specific files from results 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -27,29 +30,26 @@ exports[`betterer should exclude specific files from results 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/index.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ] }\` }; " `; -exports[`betterer should exclude specific files from results 3`] = ` -Array [ +exports[`betterer > should exclude specific files from results 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -57,16 +57,17 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (2 fixed issues, 1 remaining) 😍 +・ 1 fixed issue in "fixtures/exclude-files/src/exclude-glob.ts". +・ 1 fixed issue in "fixtures/exclude-files/src/exclude.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (2 fixed issues, 1 remaining) 😍 +・ 1 fixed issue in "fixtures/exclude-files/src/exclude-glob.ts". +・ 1 fixed issue in "fixtures/exclude-files/src/exclude.ts". 1 test got checked. 🤔 1 test got better! 😍 diff --git a/test/__snapshots__/exclude-global.spec.ts.snap b/test/__snapshots__/exclude-global.spec.ts.snap index ff491c9ae..083a0a2be 100644 --- a/test/__snapshots__/exclude-global.spec.ts.snap +++ b/test/__snapshots__/exclude-global.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should handle a global exclude 1`] = ` +exports[`betterer > should handle a global exclude 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,18 +8,18 @@ exports[`betterer should handle a global exclude 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/global.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/global.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ], - \\"src/index.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/index.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ] }\` }; " `; -exports[`betterer should handle a global exclude 2`] = ` +exports[`betterer > should handle a global exclude 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -27,69 +27,59 @@ exports[`betterer should handle a global exclude 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/global.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/global.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ], - \\"src/index.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/index.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ] }\` }; " `; -exports[`betterer should handle a global exclude 3`] = ` -Array [ +exports[`betterer > should handle a global exclude 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", "Checking 1 file... 🤔 -・ /fixtures/exclude-global/src/index.ts +・ fixtures/exclude-global/src/index.ts 🌟 Betterer (0ms): ", "Checking 1 file... 🤔 -・ /fixtures/exclude-global/src/index.ts - -🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "Checking 1 file... 🤔 - -・ /fixtures/exclude-global/src/index.ts +・ fixtures/exclude-global/src/index.ts 🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +🤔 test: running "test"! ", "Checking 1 file... 🤔 -・ /fixtures/exclude-global/src/index.ts +・ fixtures/exclude-global/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 ", "Checked 1 file! 🔍 -・ /fixtures/exclude-global/src/index.ts +・ fixtures/exclude-global/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/failed-test-error.spec.ts.snap b/test/__snapshots__/failed-test-error.spec.ts.snap index bba06c48c..a57d2ccb2 100644 --- a/test/__snapshots__/failed-test-error.spec.ts.snap +++ b/test/__snapshots__/failed-test-error.spec.ts.snap @@ -1,24 +1,14 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when a test fails 1`] = ` -Array [ +exports[`betterer > should work when a test fails 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: OH NO! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: OH NO! - -Error: OH NO! +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! 🔥 test: OH NO! - -Error: OH NO! ", "💥 Betterer (0ms): 1 test done! 1 test errored! 🔥 test: OH NO! diff --git a/test/__snapshots__/file-test-constraint.spec.ts.snap b/test/__snapshots__/file-test-constraint.spec.ts.snap index 389a57909..a1d846495 100644 --- a/test/__snapshots__/file-test-constraint.spec.ts.snap +++ b/test/__snapshots__/file-test-constraint.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should let you override the constraint of a file test 1`] = ` +exports[`betterer > should let you override the constraint of a file test 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,31 +8,28 @@ exports[`betterer should let you override the constraint of a file test 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:1761844991\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [2, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/index.ts:1761844991": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [2, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer should let you override the constraint of a file test 2`] = ` -Array [ +exports[`betterer > should let you override the constraint of a file test 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -40,16 +37,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 new issue, 3 total) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 new issue, 3 total) 😐 +✅ test: "test" stayed the same. (1 new issue, 2 existing, 3 total) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 new issue, 3 total) 😐 +✅ test: "test" stayed the same. (1 new issue, 2 existing, 3 total) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/file-test-goal.spec.ts.snap b/test/__snapshots__/file-test-goal.spec.ts.snap index f91fcdf24..362f28e23 100644 --- a/test/__snapshots__/file-test-goal.spec.ts.snap +++ b/test/__snapshots__/file-test-goal.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should let you override the goal of a file test 1`] = ` +exports[`betterer > should let you override the goal of a file test 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,30 +8,27 @@ exports[`betterer should let you override the goal of a file test 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/index.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer should let you override the goal of a file test 2`] = ` -Array [ +exports[`betterer > should let you override the goal of a file test 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -39,16 +36,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -56,44 +50,28 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/file-test-goal/src/index.ts\\". -・ New issue in \\"/fixtures/file-test-goal/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/file-test-goal/src/index.ts". ・ -・ /fixtures/file-test-goal/src/index.ts ・ 1 | debugger; ・ 2 | debugger; ・ > 3 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/file-test-goal/src/index.ts\\". -・ New issue in \\"/fixtures/file-test-goal/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/file-test-goal/src/index.ts". ・ -・ /fixtures/file-test-goal/src/index.ts ・ 1 | debugger; ・ 2 | debugger; ・ > 3 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -102,16 +80,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" met its goal! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed, 1 existing issues in "fixtures/file-test-goal/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed, 1 existing issues in "fixtures/file-test-goal/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -120,16 +97,13 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" has already met its goal! ✨ +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ +✅ test: "test" has already met its goal! ✨ ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ +✅ test: "test" has already met its goal! ✨ 1 test got checked. 🤔 1 test met its goal! 🎉 diff --git a/test/__snapshots__/file-test-line-endings.spec.ts.snap b/test/__snapshots__/file-test-line-endings.spec.ts.snap index 0f3456a74..cba856e05 100644 --- a/test/__snapshots__/file-test-line-endings.spec.ts.snap +++ b/test/__snapshots__/file-test-line-endings.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should normalise line endings within issues 1`] = ` +exports[`betterer > should normalise line endings within issues 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,8 +8,8 @@ exports[`betterer should normalise line endings within issues 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.js:1440504519\\": [ - [0, 0, 30, \\"\\", \\"1440504519\\"] + "src/index.js:1440504519": [ + [0, 0, 30, "", "1440504519"] ] }\` }; diff --git a/test/__snapshots__/file-test-sort-absolute.spec.ts.snap b/test/__snapshots__/file-test-sort-absolute.spec.ts.snap index 51545b38a..00c609c5b 100644 --- a/test/__snapshots__/file-test-sort-absolute.spec.ts.snap +++ b/test/__snapshots__/file-test-sort-absolute.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should sort files by their file path correctly with absolute paths 1`] = ` +exports[`betterer > should sort files by their file path correctly with absolute paths 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,97 +8,83 @@ exports[`betterer should sort files by their file path correctly with absolute p // exports[\`test\`] = { value: \`{ - \\"src/a.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/a.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/b.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/b.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/c.ts:1761844991\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [2, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/c.ts:1761844991": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [2, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/d.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/d.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer should sort files by their file path correctly with absolute paths 2`] = ` -Array [ +exports[`betterer > should sort files by their file path correctly with absolute paths 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +✅ test: "test" got checked for the first time! (8 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +✅ test: "test" got checked for the first time! (8 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", "Checking 1 file... 🤔 -・ /fixtures/file-test-sort-absolute/src/c.ts +・ fixtures/file-test-sort-absolute/src/c.ts 🌟 Betterer (0ms): ", "Checking 1 file... 🤔 -・ /fixtures/file-test-sort-absolute/src/c.ts - -🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "Checking 1 file... 🤔 - -・ /fixtures/file-test-sort-absolute/src/c.ts +・ fixtures/file-test-sort-absolute/src/c.ts 🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got force updated. (1 new issue, 9 total) 🆙 +🤔 test: running "test"! ", "Checking 1 file... 🤔 -・ /fixtures/file-test-sort-absolute/src/c.ts +・ fixtures/file-test-sort-absolute/src/c.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 9 total) 🆙 -・ 2 existing issues in \\"/fixtures/file-test-sort-absolute/src/c.ts\\". -・ New issue in \\"/fixtures/file-test-sort-absolute/src/c.ts\\"! +✅ test: "test" got force updated. (1 new issue, 8 existing, 9 total) 🆙 +・ 2 existing, 1 new issues in "fixtures/file-test-sort-absolute/src/c.ts". ・ -・ /fixtures/file-test-sort-absolute/src/c.ts ・ 1 | debugger; ・ 2 | debugger; ・ > 3 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ ", "Checked 1 file! 🔍 -・ /fixtures/file-test-sort-absolute/src/c.ts +・ fixtures/file-test-sort-absolute/src/c.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 9 total) 🆙 -・ 2 existing issues in \\"/fixtures/file-test-sort-absolute/src/c.ts\\". -・ New issue in \\"/fixtures/file-test-sort-absolute/src/c.ts\\"! +✅ test: "test" got force updated. (1 new issue, 8 existing, 9 total) 🆙 +・ 2 existing, 1 new issues in "fixtures/file-test-sort-absolute/src/c.ts". ・ -・ /fixtures/file-test-sort-absolute/src/c.ts ・ 1 | debugger; ・ 2 | debugger; ・ > 3 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ 1 test got checked. 🤔 diff --git a/test/__snapshots__/file-test-sort-all.spec.ts.snap b/test/__snapshots__/file-test-sort-all.spec.ts.snap index 0018e591b..7c1d33ef8 100644 --- a/test/__snapshots__/file-test-sort-all.spec.ts.snap +++ b/test/__snapshots__/file-test-sort-all.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should sort files by their file path 1`] = ` +exports[`betterer > should sort files by their file path 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,42 +8,39 @@ exports[`betterer should sort files by their file path 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/a.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/a.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/b.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/b.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/c.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/c.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/d.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/d.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer should sort files by their file path 2`] = ` -Array [ +exports[`betterer > should sort files by their file path 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +✅ test: "test" got checked for the first time! (8 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +✅ test: "test" got checked for the first time! (8 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 diff --git a/test/__snapshots__/file-test-sort-subset.spec.ts.snap b/test/__snapshots__/file-test-sort-subset.spec.ts.snap index 5168da6cb..67cad004b 100644 --- a/test/__snapshots__/file-test-sort-subset.spec.ts.snap +++ b/test/__snapshots__/file-test-sort-subset.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should sort files by their file path even when only running on a single file 1`] = ` +exports[`betterer > should sort files by their file path even when only running on a single file 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,77 +8,83 @@ exports[`betterer should sort files by their file path even when only running on // exports[\`test\`] = { value: \`{ - \\"src/a.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/a.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/b.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/b.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/c.ts:1761844991\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [2, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/c.ts:1761844991": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [2, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/d.ts:2053668783\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"], - [1, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/d.ts:2053668783": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"], + [1, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer should sort files by their file path even when only running on a single file 2`] = ` -Array [ +exports[`betterer > should sort files by their file path even when only running on a single file 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +✅ test: "test" got checked for the first time! (8 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (8 issues) 🎉 +✅ test: "test" got checked for the first time! (8 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", - "🌟 Betterer (0ms): -", - "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! + "Checking 1 file... 🤔 + +・ fixtures/file-test-sort-subset/src/c.ts + +🌟 Betterer (0ms): ", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got force updated. (1 new issue, 9 total) 🆙 + "Checking 1 file... 🤔 + +・ fixtures/file-test-sort-subset/src/c.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! ", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 9 total) 🆙 -・ 2 existing issues in \\"/fixtures/file-test-sort-subset/src/c.ts\\". -・ New issue in \\"/fixtures/file-test-sort-subset/src/c.ts\\"! + "Checking 1 file... 🤔 + +・ fixtures/file-test-sort-subset/src/c.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" got force updated. (1 new issue, 8 existing, 9 total) 🆙 +・ 2 existing, 1 new issues in "fixtures/file-test-sort-subset/src/c.ts". ・ -・ /fixtures/file-test-sort-subset/src/c.ts ・ 1 | debugger; ・ 2 | debugger; ・ > 3 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ ", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 9 total) 🆙 -・ 2 existing issues in \\"/fixtures/file-test-sort-subset/src/c.ts\\". -・ New issue in \\"/fixtures/file-test-sort-subset/src/c.ts\\"! + "Checked 1 file! 🔍 + +・ fixtures/file-test-sort-subset/src/c.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" got force updated. (1 new issue, 8 existing, 9 total) 🆙 +・ 2 existing, 1 new issues in "fixtures/file-test-sort-subset/src/c.ts". ・ -・ /fixtures/file-test-sort-subset/src/c.ts ・ 1 | debugger; ・ 2 | debugger; ・ > 3 | debugger; -・ | ^^^^^^^^^ Unexpected 'debugger' statement. +・ | ^^^^^^^^^ eslint(no-debugger): Unexpected 'debugger' statement. ・ 1 test got checked. 🤔 diff --git a/test/__snapshots__/filter-only.spec.ts.snap b/test/__snapshots__/filter-only.spec.ts.snap index e07f3c7ed..02ac5be93 100644 --- a/test/__snapshots__/filter-only.spec.ts.snap +++ b/test/__snapshots__/filter-only.spec.ts.snap @@ -1,20 +1,20 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should run only specific tests called with only() 1`] = ` -Array [ +exports[`betterer > should run only specific tests called with only() 1`] = ` +[ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 4 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! 🎉 -✅ test 4: \\"test 4\\" got checked for the first time! (1 issue) 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! 🎉 +✅ test 4: "test 4" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 4 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! 🎉 -✅ test 4: \\"test 4\\" got checked for the first time! (1 issue) 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! 🎉 +✅ test 4: "test 4" got checked for the first time! (1 issue) 🎉 4 tests got checked. 🤔 4 tests got checked for the first time! 🎉 @@ -22,16 +22,16 @@ Array [ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 4 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" got skipped. 🚫 -✅ test 4: \\"test 4\\" stayed the same. (1 issue) 😐 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" got skipped. 🚫 +✅ test 4: "test 4" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 4 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" got skipped. 🚫 -✅ test 4: \\"test 4\\" stayed the same. (1 issue) 😐 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" got skipped. 🚫 +✅ test 4: "test 4" stayed the same. (1 issue) 😐 2 tests got checked. 🤔 2 tests stayed the same. 😐 @@ -40,7 +40,7 @@ Array [ ] `; -exports[`betterer should run only specific tests called with only() 2`] = ` +exports[`betterer > should run only specific tests called with only() 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -63,8 +63,8 @@ exports[\`test 3\`] = { exports[\`test 4\`] = { value: \`{ - \\"src/index.ts:4126639614\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/index.ts:4126639614": [ + [0, 0, 7, "RegExp match", "645651780"] ] }\` }; diff --git a/test/__snapshots__/filter-skip.spec.ts.snap b/test/__snapshots__/filter-skip.spec.ts.snap index ce6621710..29d356d28 100644 --- a/test/__snapshots__/filter-skip.spec.ts.snap +++ b/test/__snapshots__/filter-skip.spec.ts.snap @@ -1,16 +1,16 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should not run a specific test called with skip() 1`] = ` -Array [ +exports[`betterer > should not run a specific test called with skip() 1`] = ` +[ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 2 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! (1 issue) 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 2 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! (1 issue) 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! (1 issue) 🎉 2 tests got checked. 🤔 2 tests got checked for the first time! 🎉 @@ -18,12 +18,12 @@ Array [ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 2 tests done! -✅ test 1: \\"test 1\\" got skipped. 🚫 -✅ test 2: \\"test 2\\" got skipped. 🚫 +✅ test 1: "test 1" got skipped. 🚫 +✅ test 2: "test 2" got skipped. 🚫 ", "🎉 Betterer (0ms): 2 tests done! -✅ test 1: \\"test 1\\" got skipped. 🚫 -✅ test 2: \\"test 2\\" got skipped. 🚫 +✅ test 1: "test 1" got skipped. 🚫 +✅ test 2: "test 2" got skipped. 🚫 0 tests got checked. 🤔 2 tests got skipped. 🚫 @@ -31,7 +31,7 @@ Array [ ] `; -exports[`betterer should not run a specific test called with skip() 2`] = ` +exports[`betterer > should not run a specific test called with skip() 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -44,8 +44,8 @@ exports[\`test 1\`] = { exports[\`test 2\`] = { value: \`{ - \\"src/index.ts:4126639614\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/index.ts:4126639614": [ + [0, 0, 7, "RegExp match", "645651780"] ] }\` }; diff --git a/test/__snapshots__/include-global.spec.ts.snap b/test/__snapshots__/include-global.spec.ts.snap index d6ba55f0a..acd27f2cc 100644 --- a/test/__snapshots__/include-global.spec.ts.snap +++ b/test/__snapshots__/include-global.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should handle a global include 1`] = ` +exports[`betterer > should handle a global include 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,15 +8,15 @@ exports[`betterer should handle a global include 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/index.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ] }\` }; " `; -exports[`betterer should handle a global include 2`] = ` +exports[`betterer > should handle a global include 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -24,83 +24,70 @@ exports[`betterer should handle a global include 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/global.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/global.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ], - \\"src/index.ts:645618020\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645618020\\"] + "src/index.ts:645618020": [ + [0, 0, 7, "RegExp match", "645618020"] ] }\` }; " `; -exports[`betterer should handle a global include 3`] = ` -Array [ +exports[`betterer > should handle a global include 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", "Checking 2 files... 🤔 -・ /fixtures/include-global/global.ts -・ /fixtures/include-global/src/global.ts +・ fixtures/include-global/global.ts +・ fixtures/include-global/src/global.ts 🌟 Betterer (0ms): ", "Checking 2 files... 🤔 -・ /fixtures/include-global/global.ts -・ /fixtures/include-global/src/global.ts - -🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "Checking 2 files... 🤔 - -・ /fixtures/include-global/global.ts -・ /fixtures/include-global/src/global.ts +・ fixtures/include-global/global.ts +・ fixtures/include-global/src/global.ts 🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got force updated. (1 new issue, 2 total) 🆙 +🤔 test: running "test"! ", "Checking 2 files... 🤔 -・ /fixtures/include-global/global.ts -・ /fixtures/include-global/src/global.ts +・ fixtures/include-global/global.ts +・ fixtures/include-global/src/global.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 2 total) 🆙 -・ New issue in \\"/fixtures/include-global/src/global.ts\\"! +✅ test: "test" got force updated. (1 new issue, 1 existing, 2 total) 🆙 +・ 1 new issue in "fixtures/include-global/src/global.ts". ・ -・ /fixtures/include-global/src/global.ts ・ > 1 | // Hack ・ | ^^^^^^^ RegExp match ・ ", "Checked 2 files! 🔍 -・ /fixtures/include-global/global.ts -・ /fixtures/include-global/src/global.ts +・ fixtures/include-global/global.ts +・ fixtures/include-global/src/global.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 2 total) 🆙 -・ New issue in \\"/fixtures/include-global/src/global.ts\\"! +✅ test: "test" got force updated. (1 new issue, 1 existing, 2 total) 🆙 +・ 1 new issue in "fixtures/include-global/src/global.ts". ・ -・ /fixtures/include-global/src/global.ts ・ > 1 | // Hack ・ | ^^^^^^^ RegExp match ・ diff --git a/test/__snapshots__/knip-no-config.spec.ts.snap b/test/__snapshots__/knip-no-config.spec.ts.snap new file mode 100644 index 000000000..a4847d7bc --- /dev/null +++ b/test/__snapshots__/knip-no-config.spec.ts.snap @@ -0,0 +1,9 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should throw if there is no config file path 1`] = ` +[ + " +Error: For \`@betterer/knip\` to work, you need to provide the path to a knip.json file, e.g. \`'./knip.json'\`. ❌ +", +] +`; diff --git a/test/__snapshots__/knip.spec.ts.snap b/test/__snapshots__/knip.spec.ts.snap new file mode 100644 index 000000000..342549805 --- /dev/null +++ b/test/__snapshots__/knip.spec.ts.snap @@ -0,0 +1,132 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should report the status of a new knip config 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`knip\`] = { + value: \`{ + "package.json:4234438035": [ + [0, 0, 0, "Unused dependencies: fuck-shit-up", "3192981842"] + ], + "src/index.ts:1955377078": [ + [0, 0, 0, "Unlisted dependencies: thanos-glove", "1179044059"] + ] + }\` +}; +" +`; + +exports[`betterer > should report the status of a new knip config 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 knip: running "knip"! +", + "🌟 Betterer (0ms): 1 test running... +✅ knip: "knip" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 knip: running "knip"! +", + "🌟 Betterer (0ms): 1 test running... +✅ knip: "knip" stayed the same. (2 issues) 😐 +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" stayed the same. (2 issues) 😐 +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" stayed the same. (2 issues) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 knip: running "knip"! +", + "🌟 Betterer (0ms): 1 test running... +🔥 knip: "knip" got worse. (1 new issue, 2 existing, 3 total) 😔 +", + "🌟 Betterer (0ms): 1 test running... +🔥 knip: "knip" got worse. (1 new issue, 2 existing, 3 total) 😔 + +Error: "knip" got worse. (1 new issue, 2 existing, 3 total) 😔 +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 knip: "knip" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 1 existing, 1 new issues in "fixtures/knip/src/index.ts". +・ +・ > 1 | import 'thanos-glove'; import 'console.fuck'; +・ | ^ Unlisted dependencies: console.fuck +・ + +Error: "knip" got worse. (1 new issue, 2 existing, 3 total) 😔 +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 knip: "knip" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 1 existing, 1 new issues in "fixtures/knip/src/index.ts". +・ +・ > 1 | import 'thanos-glove'; import 'console.fuck'; +・ | ^ Unlisted dependencies: console.fuck +・ + +Error: "knip" got worse. (1 new issue, 2 existing, 3 total) 😔 + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 knip: running "knip"! +", + "🌟 Betterer (0ms): 1 test running... +✅ knip: "knip" met its goal! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" met its goal! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" met its goal! 🎉 + +1 test got checked. 🤔 +1 test got better! 😍 +1 test met its goal! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 knip: running "knip"! +", + "🌟 Betterer (0ms): 1 test running... +✅ knip: "knip" has already met its goal! ✨ +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" has already met its goal! ✨ +", + "🎉 Betterer (0ms): 1 test done! +✅ knip: "knip" has already met its goal! ✨ + +1 test got checked. 🤔 +1 test met its goal! 🎉 +", +] +`; diff --git a/test/__snapshots__/merge.spec.ts.snap b/test/__snapshots__/merge.spec.ts.snap new file mode 100644 index 000000000..c6a2bf10b --- /dev/null +++ b/test/__snapshots__/merge.spec.ts.snap @@ -0,0 +1,33 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should merge the results file 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "src/index.ts:913095150": [ + [0, 0, 11, "TSQuery match", "3870399096"] + ] + }\` +}; +" +`; + +exports[`betterer > should merge the results file 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "src/index.ts:913095150": [ + [0, 0, 11, "TSQuery match", "3870399096"] + ] + }\` +}; +" +`; diff --git a/test/__snapshots__/mixed-results.spec.ts.snap b/test/__snapshots__/mixed-results.spec.ts.snap new file mode 100644 index 000000000..2066d736c --- /dev/null +++ b/test/__snapshots__/mixed-results.spec.ts.snap @@ -0,0 +1,83 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work when some tests gets worse and others get better 1`] = ` +[ + "🌟 Betterer (0ms): +", + "💥 Betterer (0ms): 4 tests done! 1 test errored! +✅ should shrink: "should shrink" got checked for the first time! 🎉 +✅ should grow: "should grow" got checked for the first time! 🎉 +✅ should stay the same: "should stay the same" got checked for the first time! 🎉 +🔥 should fail: throws +", + "💥 Betterer (0ms): 4 tests done! 1 test errored! +✅ should shrink: "should shrink" got checked for the first time! 🎉 +✅ should grow: "should grow" got checked for the first time! 🎉 +✅ should stay the same: "should stay the same" got checked for the first time! 🎉 +🔥 should fail: throws + +Error: throws + +3 tests got checked. 🤔 +3 tests got checked for the first time! 🎉 +1 test failed to run. 🔥 +", + "🌟 Betterer (0ms): +", + "💥 Betterer (0ms): 4 tests done! 2 tests errored! +✅ should shrink: "should shrink" got better! 😍 +🔥 should grow: "should grow" got worse. 😔 +・ - Expected +・ + Result +・ +・ - -1 +・ + -2 +✅ should stay the same: "should stay the same" stayed the same. 😐 +🔥 should fail: throws +", + "💥 Betterer (0ms): 4 tests done! 2 tests errored! +✅ should shrink: "should shrink" got better! 😍 +🔥 should grow: "should grow" got worse. 😔 +・ - Expected +・ + Result +・ +・ - -1 +・ + -2 +✅ should stay the same: "should stay the same" stayed the same. 😐 +🔥 should fail: throws + +Error: throws + +3 tests got checked. 🤔 +1 test got better! 😍 +1 test stayed the same. 😐 +1 test failed to run. 🔥 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 +", +] +`; + +exports[`betterer > should work when some tests gets worse and others get better 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`should shrink\`] = { + value: \`0 +\` +}; + +exports[\`should grow\`] = { + value: \`-1 +\` +}; + +exports[\`should stay the same\`] = { + value: \`1 +\` +}; +" +`; diff --git a/test/__snapshots__/obsolete.spec.ts.snap b/test/__snapshots__/obsolete.spec.ts.snap new file mode 100644 index 000000000..4c62ae890 --- /dev/null +++ b/test/__snapshots__/obsolete.spec.ts.snap @@ -0,0 +1,114 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should report obsolete tests and remove them with the update flag 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`will be renamed\`] = { + value: \`{ + "src/index.ts:4087252068": [ + [0, 0, 11, "TSQuery match", "3870399096"] + ] + }\` +}; + +exports[\`has been renamed\`] = { + value: \`{ + "src/index.ts:4087252068": [ + [0, 0, 11, "TSQuery match", "3870399096"] + ] + }\` +}; +" +`; + +exports[`betterer > should report obsolete tests and remove them with the update flag 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`has been renamed\`] = { + value: \`{ + "src/index.ts:4087252068": [ + [0, 0, 11, "TSQuery match", "3870399096"] + ] + }\` +}; +" +`; + +exports[`betterer > should report obsolete tests and remove them with the update flag 3`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 will be renamed: running "will be renamed"! +", + "🎉 Betterer (0ms): 1 test done! +✅ will be renamed: "will be renamed" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ will be renamed: "will be renamed" got checked for the first time! (1 issue) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 will be renamed: running "will be renamed"! +🤔 has been renamed: running "has been renamed"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 will be renamed: running "will be renamed"! +🤔 has been renamed: running "has been renamed"! +", + "🌟 Betterer (0ms): 1 test running... 1 test done! +✅ will be renamed: "will be renamed" is obsolete! 🗑️ +✅ has been renamed: "has been renamed" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ will be renamed: "will be renamed" is obsolete! 🗑️ +✅ has been renamed: "has been renamed" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ will be renamed: "will be renamed" is obsolete! 🗑️ +✅ has been renamed: "has been renamed" got checked for the first time! (1 issue) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +1 test is obsolete! 🗑️ + +You have saved tests results that no longer have tests! If they are no longer needed, you can run \`betterer --update\` to remove the obsolete results from the results file. 🆙 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 will be renamed: running "will be renamed"! +🤔 has been renamed: running "has been renamed"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 will be renamed: running "will be renamed"! +🤔 has been renamed: running "has been renamed"! +", + "🌟 Betterer (0ms): 1 test running... 1 test done! +✅ will be renamed: "will be renamed" got removed! 👋🏻 +✅ has been renamed: "has been renamed" stayed the same. (1 issue) 😐 +", + "🎉 Betterer (0ms): 2 tests done! +✅ will be renamed: "will be renamed" got removed! 👋🏻 +✅ has been renamed: "has been renamed" stayed the same. (1 issue) 😐 +", + "🎉 Betterer (0ms): 2 tests done! +✅ will be renamed: "will be renamed" got removed! 👋🏻 +✅ has been renamed: "has been renamed" stayed the same. (1 issue) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +1 test got removed! 👋🏻 +", +] +`; diff --git a/test/__snapshots__/printer-pathological.spec.ts.snap b/test/__snapshots__/printer-pathological.spec.ts.snap index 2060923ae..c14a3f25f 100644 --- a/test/__snapshots__/printer-pathological.spec.ts.snap +++ b/test/__snapshots__/printer-pathological.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should handle printing for pathological cases 1`] = ` +exports[`betterer > should handle printing for pathological cases 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,50 +8,50 @@ exports[`betterer should handle printing for pathological cases 1`] = ` // exports[\`big array\`] = { value: \`[ - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\", - \\"./some/long/path/to/some/file\\" + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file", + "./some/long/path/to/some/file" ] \` }; exports[\`big object\`] = { value: \`{ - \\"a\\": \\"./some/long/path/to/some/file\\", - \\"b\\": \\"./some/long/path/to/some/file\\", - \\"c\\": \\"./some/long/path/to/some/file\\", - \\"d\\": \\"./some/long/path/to/some/file\\", - \\"e\\": \\"./some/long/path/to/some/file\\", - \\"f\\": \\"./some/long/path/to/some/file\\", - \\"g\\": \\"./some/long/path/to/some/file\\", - \\"h\\": \\"./some/long/path/to/some/file\\", - \\"i\\": \\"./some/long/path/to/some/file\\", - \\"j\\": \\"./some/long/path/to/some/file\\", - \\"k\\": \\"./some/long/path/to/some/file\\", - \\"l\\": \\"./some/long/path/to/some/file\\", - \\"m\\": \\"./some/long/path/to/some/file\\", - \\"n\\": \\"./some/long/path/to/some/file\\", - \\"o\\": \\"./some/long/path/to/some/file\\", - \\"p\\": \\"./some/long/path/to/some/file\\", - \\"q\\": \\"./some/long/path/to/some/file\\", - \\"r\\": \\"./some/long/path/to/some/file\\", - \\"s\\": \\"./some/long/path/to/some/file\\" + "a": "./some/long/path/to/some/file", + "b": "./some/long/path/to/some/file", + "c": "./some/long/path/to/some/file", + "d": "./some/long/path/to/some/file", + "e": "./some/long/path/to/some/file", + "f": "./some/long/path/to/some/file", + "g": "./some/long/path/to/some/file", + "h": "./some/long/path/to/some/file", + "i": "./some/long/path/to/some/file", + "j": "./some/long/path/to/some/file", + "k": "./some/long/path/to/some/file", + "l": "./some/long/path/to/some/file", + "m": "./some/long/path/to/some/file", + "n": "./some/long/path/to/some/file", + "o": "./some/long/path/to/some/file", + "p": "./some/long/path/to/some/file", + "q": "./some/long/path/to/some/file", + "r": "./some/long/path/to/some/file", + "s": "./some/long/path/to/some/file" } \` }; diff --git a/test/__snapshots__/regexp-message.spec.ts.snap b/test/__snapshots__/regexp-message.spec.ts.snap index 359bb0aa3..4c77a3a3d 100644 --- a/test/__snapshots__/regexp-message.spec.ts.snap +++ b/test/__snapshots__/regexp-message.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the existence of RegExp matches, with a custom issue message 1`] = ` +exports[`betterer > should report the existence of RegExp matches, with a custom issue message 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should report the existence of RegExp matches, with a custom i // exports[\`regexp\`] = { value: \`{ - \\"src/index.ts:4126639614\\": [ - [0, 0, 7, \\"no hacks here!\\", \\"645651780\\"] + "src/index.ts:4126639614": [ + [0, 0, 7, "no hacks here!", "645651780"] ] }\` }; " `; -exports[`betterer should report the existence of RegExp matches, with a custom issue message 2`] = ` -Array [ +exports[`betterer > should report the existence of RegExp matches, with a custom issue message 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 regexp: running \\"regexp\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ regexp: \\"regexp\\" got checked for the first time! (1 issue) 🎉 +🤔 regexp: running "regexp"! ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" got checked for the first time! (1 issue) 🎉 +✅ regexp: "regexp" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" got checked for the first time! (1 issue) 🎉 +✅ regexp: "regexp" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 diff --git a/test/__snapshots__/regexp-no-regexp.spec.ts.snap b/test/__snapshots__/regexp-no-regexp.spec.ts.snap index aff501e26..4d552f3e4 100644 --- a/test/__snapshots__/regexp-no-regexp.spec.ts.snap +++ b/test/__snapshots__/regexp-no-regexp.spec.ts.snap @@ -1,7 +1,7 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if there is no regexp 1`] = ` -Array [ +exports[`betterer > should throw if there is no regexp 1`] = ` +[ " Error: for \`@betterer/regexp\` to work, you need to provide a RegExp, e.g. \`/^foo$/\`. ❌ ", diff --git a/test/__snapshots__/regexp.spec.ts.snap b/test/__snapshots__/regexp.spec.ts.snap index 5d371ee3c..dae82ce57 100644 --- a/test/__snapshots__/regexp.spec.ts.snap +++ b/test/__snapshots__/regexp.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the existence of RegExp matches 1`] = ` +exports[`betterer > should report the existence of RegExp matches 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should report the existence of RegExp matches 1`] = ` // exports[\`regexp\`] = { value: \`{ - \\"src/index.ts:4126639614\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"] + "src/index.ts:4126639614": [ + [0, 0, 7, "RegExp match", "645651780"] ] }\` }; " `; -exports[`betterer should report the existence of RegExp matches 2`] = ` -Array [ +exports[`betterer > should report the existence of RegExp matches 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 regexp: running \\"regexp\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ regexp: \\"regexp\\" got checked for the first time! (1 issue) 🎉 +🤔 regexp: running "regexp"! ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" got checked for the first time! (1 issue) 🎉 +✅ regexp: "regexp" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" got checked for the first time! (1 issue) 🎉 +✅ regexp: "regexp" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,16 +35,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 regexp: running \\"regexp\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ regexp: \\"regexp\\" stayed the same. (1 issue) 😐 +🤔 regexp: running "regexp"! ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" stayed the same. (1 issue) 😐 +✅ regexp: "regexp" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" stayed the same. (1 issue) 😐 +✅ regexp: "regexp" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -55,42 +49,26 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 regexp: running \\"regexp\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 regexp: \\"regexp\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 regexp: \\"regexp\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"regexp\\" got worse. (1 new issue, 2 total) 😔 +🤔 regexp: running "regexp"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 regexp: \\"regexp\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/regexp/src/index.ts\\". -・ New issue in \\"/fixtures/regexp/src/index.ts\\"! +🔥 regexp: "regexp" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/regexp/src/index.ts". ・ -・ /fixtures/regexp/src/index.ts ・ 1 | // HACK: ・ > 2 | // HACK: ・ | ^^^^^^^ RegExp match ・ - -Error: \\"regexp\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 regexp: \\"regexp\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/regexp/src/index.ts\\". -・ New issue in \\"/fixtures/regexp/src/index.ts\\"! +🔥 regexp: "regexp" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/regexp/src/index.ts". ・ -・ /fixtures/regexp/src/index.ts ・ 1 | // HACK: ・ > 2 | // HACK: ・ | ^^^^^^^ RegExp match ・ -Error: \\"regexp\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -99,16 +77,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 regexp: running \\"regexp\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ regexp: \\"regexp\\" met its goal! 🎉 +🤔 regexp: running "regexp"! ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" met its goal! 🎉 +✅ regexp: "regexp" met its goal! 🎉 +・ 1 fixed issue in "fixtures/regexp/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" met its goal! 🎉 +✅ regexp: "regexp" met its goal! 🎉 +・ 1 fixed issue in "fixtures/regexp/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -117,16 +94,13 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 regexp: running \\"regexp\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ regexp: \\"regexp\\" has already met its goal! ✨ +🤔 regexp: running "regexp"! ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" has already met its goal! ✨ +✅ regexp: "regexp" has already met its goal! ✨ ", "🎉 Betterer (0ms): 1 test done! -✅ regexp: \\"regexp\\" has already met its goal! ✨ +✅ regexp: "regexp" has already met its goal! ✨ 1 test got checked. 🤔 1 test met its goal! 🎉 diff --git a/test/__snapshots__/reporter-invalid-hook-function.spec.ts.snap b/test/__snapshots__/reporter-invalid-hook-function.spec.ts.snap index 4352a718b..14b1ae194 100644 --- a/test/__snapshots__/reporter-invalid-hook-function.spec.ts.snap +++ b/test/__snapshots__/reporter-invalid-hook-function.spec.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer --reporter should throw when a hook is not a function 1`] = ` -Array [ +exports[`betterer --reporter > should throw when a hook is not a function 1`] = ` +[ " -Error: could not require \\"/fixtures/reporter-invalid-hook-function/reporter.js\\". 😔 +Error: could not import "fixtures/reporter-invalid-hook-function/reporter.js". 😔 -Error: \\"contextStart\\" is not a function. 😔 +Error: "contextStart" is not a function. 😔 ", ] `; diff --git a/test/__snapshots__/reporter-invalid-hook-name.spec.ts.snap b/test/__snapshots__/reporter-invalid-hook-name.spec.ts.snap index b85f91a87..7cc8f1ab3 100644 --- a/test/__snapshots__/reporter-invalid-hook-name.spec.ts.snap +++ b/test/__snapshots__/reporter-invalid-hook-name.spec.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer --reporter should throw when there is an invalid hook name 1`] = ` -Array [ +exports[`betterer --reporter > should throw when there is an invalid hook name 1`] = ` +[ " -Error: could not require \\"/fixtures/reporter-invalid-hook-name/reporter.js\\". 😔 +Error: could not import "fixtures/reporter-invalid-hook-name/reporter.js". 😔 -Error: \\"notAHook\\" is not a valid reporter hook name. 😔 +Error: "notAHook" is not a valid reporter hook name. 😔 ", ] `; diff --git a/test/__snapshots__/reporter-no-export.spec.ts.snap b/test/__snapshots__/reporter-no-export.spec.ts.snap index 359abd407..66530a7dc 100644 --- a/test/__snapshots__/reporter-no-export.spec.ts.snap +++ b/test/__snapshots__/reporter-no-export.spec.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer --reporter should throw when there is nothing exported 1`] = ` -Array [ +exports[`betterer --reporter > should throw when there is nothing exported 1`] = ` +[ " -Error: could not require \\"/fixtures/reporter-no-export/reporter.js\\". 😔 +Error: could not import "fixtures/reporter-no-export/reporter.js". 😔 -Error: \\"/fixtures/reporter-no-export/reporter.js\\" didn't create a reporter. 😔 +Error: "fixtures/reporter-no-export/reporter.js" didn't create a reporter. 😔 ", ] `; diff --git a/test/__snapshots__/results-escape.spec.ts.snap b/test/__snapshots__/results-escape.spec.ts.snap index d32ea2989..34fc173e3 100644 --- a/test/__snapshots__/results-escape.spec.ts.snap +++ b/test/__snapshots__/results-escape.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should escape interpolation characters in the result file 1`] = ` +exports[`betterer > should escape interpolation characters in the result file 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should escape interpolation characters in the result file 1`] // exports[\`test\`] = { value: \`{ - \\"src/index.ts:5381\\": [ - [0, 0, 0, \\"\\\\\`$\\\\{key}\\\\\`\\", \\"5381\\"] + "src/index.ts:5381": [ + [0, 0, 0, "\\\`$\\{key}\\\`", "2284429680"] ] }\` }; " `; -exports[`betterer should escape interpolation characters in the result file 2`] = ` -Array [ +exports[`betterer > should escape interpolation characters in the result file 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,16 +35,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/results-file-paths.spec.ts.snap b/test/__snapshots__/results-file-paths.spec.ts.snap new file mode 100644 index 000000000..4143e088f --- /dev/null +++ b/test/__snapshots__/results-file-paths.spec.ts.snap @@ -0,0 +1,65 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should remove the version control path from issue messages 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test\`] = { + value: \`{ + "src/another-file.ts:5381": [ + [0, 0, 0, "some error found in ./another-file.ts oh no", "1569250134"], + [0, 0, 0, "some error found in ../../some/file/path and ../../some/other/file/path oh no", "3421279934"], + [0, 0, 0, "some error found in \\'./another-file.ts\\' oh no", "2549770710"], + [0, 0, 0, "some error found in [../../some/file/path] and \\\\"../../some/other/file/path\\\\" oh no", "2281893176"], + [0, 0, 0, "some error found in \\\`./another-file.ts\\\` oh no", "2401868310"], + [0, 0, 0, "some error found in (../../some/file/path) and {../../some/other/file/path} oh no", "656960857"], + [0, 0, 0, "some error found in <./another-file.ts> oh no", "3813503124"] + ], + "src/index.ts:5381": [ + [0, 0, 0, "some error found in ./index.ts oh no", "112608808"], + [0, 0, 0, "some error found in ../../some/file/path and ../../some/other/file/path oh no", "3421279934"], + [0, 0, 0, "some error found in \\'./index.ts\\' oh no", "3372577928"], + [0, 0, 0, "some error found in [../../some/file/path] and \\\\"../../some/other/file/path\\\\" oh no", "2281893176"], + [0, 0, 0, "some error found in \\\`./index.ts\\\` oh no", "1404741928"], + [0, 0, 0, "some error found in (../../some/file/path) and {../../some/other/file/path} oh no", "656960857"], + [0, 0, 0, "some error found in <./index.ts> oh no", "699898666"] + ] + }\` +}; +" +`; + +exports[`betterer > should remove the version control path from issue messages 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (14 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (14 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (14 issues) 😐 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (14 issues) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +", +] +`; diff --git a/test/__snapshots__/results-path.spec.ts.snap b/test/__snapshots__/results-path.spec.ts.snap index 1dd7c17c4..bb645d353 100644 --- a/test/__snapshots__/results-path.spec.ts.snap +++ b/test/__snapshots__/results-path.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should write a results file to a different path 1`] = ` +exports[`betterer > should write a results file to a different path 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should write a results file to a different path 1`] = ` // exports[\`test\`] = { value: \`{ - \\"../src/index.ts:5381\\": [ - [0, 0, 0, \\"\\\\\`$\\\\{key}\\\\\`\\", \\"5381\\"] + "../src/index.ts:5381": [ + [0, 0, 0, "issue", "180017116"] ] }\` }; " `; -exports[`betterer should write a results file to a different path 2`] = ` -Array [ +exports[`betterer > should write a results file to a different path 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,16 +35,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/results-read-error.spec.ts.snap b/test/__snapshots__/results-read-error.spec.ts.snap index 8e921bd54..ea50d9879 100644 --- a/test/__snapshots__/results-read-error.spec.ts.snap +++ b/test/__snapshots__/results-read-error.spec.ts.snap @@ -1,9 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw when reading the results file fails 1`] = ` -Array [ +exports[`betterer > should throw when reading the results file fails 1`] = ` +[ " -Error: could not read results from \\"/fixtures/results-read-error/.betterer.results\\". 😔 +Error: could not read results from "fixtures/results-read-error/.betterer.results". 😔 + +Error: ", ] `; diff --git a/test/__snapshots__/same-move-file.spec.ts.snap b/test/__snapshots__/same-move-file.spec.ts.snap index ebef0564f..cced360c1 100644 --- a/test/__snapshots__/same-move-file.spec.ts.snap +++ b/test/__snapshots__/same-move-file.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should stay the same when a file is moved 1`] = ` +exports[`betterer > should stay the same when a file is moved 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,15 +8,15 @@ exports[`betterer should stay the same when a file is moved 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:1499252024\\": [ - [2, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/index.ts:1499252024": [ + [2, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer should stay the same when a file is moved 2`] = ` +exports[`betterer > should stay the same when a file is moved 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -24,29 +24,26 @@ exports[`betterer should stay the same when a file is moved 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/moved.ts:1499252024\\": [ - [2, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/moved.ts:1499252024": [ + [2, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer should stay the same when a file is moved 3`] = ` -Array [ +exports[`betterer > should stay the same when a file is moved 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -54,16 +51,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/same-move-issue.spec.ts.snap b/test/__snapshots__/same-move-issue.spec.ts.snap index f1190404c..2c977d616 100644 --- a/test/__snapshots__/same-move-issue.spec.ts.snap +++ b/test/__snapshots__/same-move-issue.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should stay the same when an issue is moved 1`] = ` +exports[`betterer > should stay the same when an issue is moved 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,15 +8,15 @@ exports[`betterer should stay the same when an issue is moved 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:1499252024\\": [ - [2, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/index.ts:1499252024": [ + [2, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer should stay the same when an issue is moved 2`] = ` +exports[`betterer > should stay the same when an issue is moved 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -24,29 +24,26 @@ exports[`betterer should stay the same when an issue is moved 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:2615232350\\": [ - [3, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/index.ts:2615232350": [ + [3, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer should stay the same when an issue is moved 3`] = ` -Array [ +exports[`betterer > should stay the same when an issue is moved 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -54,16 +51,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/same-move-issues.spec.ts.snap b/test/__snapshots__/same-move-issues.spec.ts.snap index decf78863..0a2925f9c 100644 --- a/test/__snapshots__/same-move-issues.spec.ts.snap +++ b/test/__snapshots__/same-move-issues.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should stay the same when multiple issues are moved 1`] = ` +exports[`betterer > should stay the same when multiple issues are moved 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,16 +8,16 @@ exports[`betterer should stay the same when multiple issues are moved 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:3120621594\\": [ - [2, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"], - [3, 18, 1, \\"The right-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/index.ts:3120621594": [ + [2, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"], + [3, 18, 1, "tsc: The right-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer should stay the same when multiple issues are moved 2`] = ` +exports[`betterer > should stay the same when multiple issues are moved 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -25,30 +25,27 @@ exports[`betterer should stay the same when multiple issues are moved 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:3189117303\\": [ - [4, 18, 1, \\"The right-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"], - [5, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/index.ts:3189117303": [ + [4, 18, 1, "tsc: The right-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"], + [5, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer should stay the same when multiple issues are moved 3`] = ` -Array [ +exports[`betterer > should stay the same when multiple issues are moved 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -56,16 +53,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/same-result.spec.ts.snap b/test/__snapshots__/same-result.spec.ts.snap index be4b1fc8a..99a29ec09 100644 --- a/test/__snapshots__/same-result.spec.ts.snap +++ b/test/__snapshots__/same-result.spec.ts.snap @@ -1,39 +1,48 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when a test is the same 1`] = ` -Array [ +exports[`betterer > should work when a test is the same 1`] = ` +[ "🌟 Betterer (0ms): ", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 + "🎉 Betterer (0ms): 2 tests done! +✅ bigger: "bigger" got checked for the first time! 🎉 +✅ smaller: "smaller" got checked for the first time! 🎉 ", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! 🎉 + "🎉 Betterer (0ms): 2 tests done! +✅ bigger: "bigger" got checked for the first time! 🎉 +✅ smaller: "smaller" got checked for the first time! 🎉 -1 test got checked. 🤔 -1 test got checked for the first time! 🎉 +2 tests got checked. 🤔 +2 tests got checked for the first time! 🎉 ", "🌟 Betterer (0ms): ", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 + "🎉 Betterer (0ms): 2 tests done! +✅ bigger: "bigger" stayed the same. 😐 +✅ smaller: "smaller" stayed the same. 😐 ", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. 😐 + "🎉 Betterer (0ms): 2 tests done! +✅ bigger: "bigger" stayed the same. 😐 +✅ smaller: "smaller" stayed the same. 😐 -1 test got checked. 🤔 -1 test stayed the same. 😐 +2 tests got checked. 🤔 +2 tests stayed the same. 😐 ", ] `; -exports[`betterer should work when a test is the same 2`] = ` +exports[`betterer > should work when a test is the same 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: // https://phenomnomnominal.github.io/betterer/docs/results-file/#merge // -exports[\`test\`] = { +exports[\`bigger\`] = { + value: \`0 +\` +}; + +exports[\`smaller\`] = { value: \`0 \` }; diff --git a/test/__snapshots__/silent-mute.spec.ts.snap b/test/__snapshots__/silent-mute.spec.ts.snap index 3a913c26e..48b5c0a3d 100644 --- a/test/__snapshots__/silent-mute.spec.ts.snap +++ b/test/__snapshots__/silent-mute.spec.ts.snap @@ -1,3 +1,3 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer --silent should mute all console output 1`] = `Array []`; +exports[`betterer --silent > should mute all console output 1`] = `[]`; diff --git a/test/__snapshots__/silent-unmute.spec.ts.snap b/test/__snapshots__/silent-unmute.spec.ts.snap index 5e6a54e6d..406161d72 100644 --- a/test/__snapshots__/silent-unmute.spec.ts.snap +++ b/test/__snapshots__/silent-unmute.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer --silent should be possible to unmute a subsequent run 1`] = ` -Array [ +exports[`betterer --silent > should be possible to unmute a subsequent run 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! 😍 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! 😍 +✅ test: "test" got better! 😍 1 test got checked. 🤔 1 test got better! 😍 diff --git a/test/__snapshots__/styelint.spec.ts.snap b/test/__snapshots__/styelint.spec.ts.snap deleted file mode 100644 index 31899092a..000000000 --- a/test/__snapshots__/styelint.spec.ts.snap +++ /dev/null @@ -1,129 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer should report the status of a new stylelint rule 1`] = ` -"// BETTERER RESULTS V2. -// -// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: -// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge -// -exports[\`stylelint\`] = { - value: \`{ - \\"src/styles.scss:3896471814\\": [ - [3, 2, 0, \\"Expected rule with selector matching \\\\\\\\\\"/^&:\\\\\\\\\\\\\\\\w/\\\\\\\\\\" to come before rule with selector matching \\\\\\\\\\"/^&/\\\\\\\\\\" (order/order)\\", \\"Expected rule with selector matching \\\\\\\\\\"/^&:\\\\\\\\\\\\\\\\w/\\\\\\\\\\" to come before rule with selector matching \\\\\\\\\\"/^&/\\\\\\\\\\" (order/order)\\"], - [7, 9, 0, \\"Unexpected unknown unit \\\\\\\\\\"borks\\\\\\\\\\" (unit-no-unknown)\\", \\"Unexpected unknown unit \\\\\\\\\\"borks\\\\\\\\\\" (unit-no-unknown)\\"] - ] - }\` -}; -" -`; - -exports[`betterer should report the status of a new stylelint rule 2`] = ` -Array [ - "🌟 Betterer (0ms): -", - "🌟 Betterer (0ms): 1 test running... -🤔 stylelint: running \\"stylelint\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ stylelint: \\"stylelint\\" got checked for the first time! (2 issues) 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ stylelint: \\"stylelint\\" got checked for the first time! (2 issues) 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ stylelint: \\"stylelint\\" got checked for the first time! (2 issues) 🎉 - -1 test got checked. 🤔 -1 test got checked for the first time! 🎉 -", - "🌟 Betterer (0ms): -", - "🌟 Betterer (0ms): 1 test running... -🤔 stylelint: running \\"stylelint\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 stylelint: \\"stylelint\\" got worse. (2 new issues, 4 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 stylelint: \\"stylelint\\" got worse. (2 new issues, 4 total) 😔 - -Error: \\"stylelint\\" got worse. (2 new issues, 4 total) 😔 -", - "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 stylelint: \\"stylelint\\" got worse. (2 new issues, 4 total) 😔 -・ 2 existing issues in \\"/fixtures/stylelint/src/styles.scss\\". -・ New issues in \\"/fixtures/stylelint/src/styles.scss\\"! -・ Showing first of 2 new issues: -・ -・ /fixtures/stylelint/src/styles.scss -・ 12 | b & {} -・ 13 | & b {} -・ > 14 | &:hover {} -・ | ^ Expected rule with selector matching \\"/^&:/w/\\" to come before rule with selector matching \\"/^&/\\" (order/order) -・ 15 | } -・ 16 | -・ 17 | .foo { -・ - -Error: \\"stylelint\\" got worse. (2 new issues, 4 total) 😔 -", - "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 stylelint: \\"stylelint\\" got worse. (2 new issues, 4 total) 😔 -・ 2 existing issues in \\"/fixtures/stylelint/src/styles.scss\\". -・ New issues in \\"/fixtures/stylelint/src/styles.scss\\"! -・ Showing first of 2 new issues: -・ -・ /fixtures/stylelint/src/styles.scss -・ 12 | b & {} -・ 13 | & b {} -・ > 14 | &:hover {} -・ | ^ Expected rule with selector matching \\"/^&:/w/\\" to come before rule with selector matching \\"/^&/\\" (order/order) -・ 15 | } -・ 16 | -・ 17 | .foo { -・ - -Error: \\"stylelint\\" got worse. (2 new issues, 4 total) 😔 - -1 test got checked. 🤔 -1 test got worse. 😔 - -You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 -", - "🌟 Betterer (0ms): -", - "🌟 Betterer (0ms): 1 test running... -🤔 stylelint: running \\"stylelint\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ stylelint: \\"stylelint\\" met its goal! 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ stylelint: \\"stylelint\\" met its goal! 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ stylelint: \\"stylelint\\" met its goal! 🎉 - -1 test got checked. 🤔 -1 test got better! 😍 -1 test met its goal! 🎉 -", - "🌟 Betterer (0ms): -", - "🌟 Betterer (0ms): 1 test running... -🤔 stylelint: running \\"stylelint\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ stylelint: \\"stylelint\\" has already met its goal! ✨ -", - "🎉 Betterer (0ms): 1 test done! -✅ stylelint: \\"stylelint\\" has already met its goal! ✨ -", - "🎉 Betterer (0ms): 1 test done! -✅ stylelint: \\"stylelint\\" has already met its goal! ✨ - -1 test got checked. 🤔 -1 test met its goal! 🎉 -", -] -`; diff --git a/test/__snapshots__/stylelint-no-config.spec.ts.snap b/test/__snapshots__/stylelint-no-config.spec.ts.snap index de1bf4620..57aa5e7fe 100644 --- a/test/__snapshots__/stylelint-no-config.spec.ts.snap +++ b/test/__snapshots__/stylelint-no-config.spec.ts.snap @@ -1,9 +1,9 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if there is no config 1`] = ` -Array [ +exports[`betterer > should throw if there is no config 1`] = ` +[ " -Error: for \`@betterer/stylelint\` to work, you need to provide configuration options, e.g. \`{ rules: { \\"unit-no-unknown\\": true } }\`. ❌ +Error: for \`@betterer/stylelint\` to work, you need to provide configuration options, e.g. \`{ rules: { "unit-no-unknown": true } }\`. ❌ ", ] `; diff --git a/test/__snapshots__/stylelint-no-files.spec.ts.snap b/test/__snapshots__/stylelint-no-files.spec.ts.snap new file mode 100644 index 000000000..cdb91998d --- /dev/null +++ b/test/__snapshots__/stylelint-no-files.spec.ts.snap @@ -0,0 +1,22 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work when there are no relevant files for a StyleLint test 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 stylelint: running "stylelint"! +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" met its goal! 🎉 +・ No relevant files found. Are the \`include()\`/\`exclude()\` options for this test correct? +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" met its goal! 🎉 +・ No relevant files found. Are the \`include()\`/\`exclude()\` options for this test correct? + +1 test got checked. 🤔 +1 test met its goal! 🎉 +", +] +`; diff --git a/test/__snapshots__/stylelint.spec.ts.snap b/test/__snapshots__/stylelint.spec.ts.snap new file mode 100644 index 000000000..8c1ab6348 --- /dev/null +++ b/test/__snapshots__/stylelint.spec.ts.snap @@ -0,0 +1,106 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should report the status of a new stylelint rule 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`stylelint\`] = { + value: \`{ + "src/styles.scss:3896471814": [ + [3, 2, 0, "stylelint(order/order): Expected rule with selector matching \\\\"/^&:\\\\\\\\w/\\\\" to come before rule with selector matching \\\\"/^&/\\\\"", "1075804560"], + [7, 9, 0, "stylelint(unit-no-unknown): Unexpected unknown unit \\\\"borks\\\\"", "3713529269"] + ] + }\` +}; +" +`; + +exports[`betterer > should report the status of a new stylelint rule 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 stylelint: running "stylelint"! +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 stylelint: running "stylelint"! +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 stylelint: "stylelint" got worse. (2 new issues, 2 existing, 4 total) 😔 +・ 2 existing, 2 new issues in "fixtures/stylelint/src/styles.scss". +・ Showing first of 2 new issues: +・ +・ 12 | b & {} +・ 13 | & b {} +・ > 14 | &:hover {} +・ | ^ stylelint(order/order): Expected rule with selector matching "/^&:/w/" to come before rule with selector matching "/^&/" +・ 15 | } +・ 16 | +・ 17 | .foo { +・ +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 stylelint: "stylelint" got worse. (2 new issues, 2 existing, 4 total) 😔 +・ 2 existing, 2 new issues in "fixtures/stylelint/src/styles.scss". +・ Showing first of 2 new issues: +・ +・ 12 | b & {} +・ 13 | & b {} +・ > 14 | &:hover {} +・ | ^ stylelint(order/order): Expected rule with selector matching "/^&:/w/" to come before rule with selector matching "/^&/" +・ 15 | } +・ 16 | +・ 17 | .foo { +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 stylelint: running "stylelint"! +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" met its goal! 🎉 +・ 2 fixed issues in "fixtures/stylelint/src/styles.scss". +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" met its goal! 🎉 +・ 2 fixed issues in "fixtures/stylelint/src/styles.scss". + +1 test got checked. 🤔 +1 test got better! 😍 +1 test met its goal! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 stylelint: running "stylelint"! +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" has already met its goal! ✨ +", + "🎉 Betterer (0ms): 1 test done! +✅ stylelint: "stylelint" has already met its goal! ✨ + +1 test got checked. 🤔 +1 test met its goal! 🎉 +", +] +`; diff --git a/test/__snapshots__/test-local.spec.ts.snap b/test/__snapshots__/test-local.spec.ts.snap new file mode 100644 index 000000000..e769e650c --- /dev/null +++ b/test/__snapshots__/test-local.spec.ts.snap @@ -0,0 +1,31 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should handle importing from local files 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 shrinks: running "shrinks"! +🤔 grows: running "grows"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 shrinks: running "shrinks"! +🤔 grows: running "grows"! +", + "🌟 Betterer (0ms): 1 test running... 1 test done! +✅ shrinks: "shrinks" got checked for the first time! 🎉 +✅ grows: "grows" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ shrinks: "shrinks" got checked for the first time! 🎉 +✅ grows: "grows" got checked for the first time! 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ shrinks: "shrinks" got checked for the first time! 🎉 +✅ grows: "grows" got checked for the first time! 🎉 + +2 tests got checked. 🤔 +2 tests got checked for the first time! 🎉 +", +] +`; diff --git a/test/__snapshots__/test-no-constraint.spec.ts.snap b/test/__snapshots__/test-no-constraint.spec.ts.snap index 578922dcd..5846d91dd 100644 --- a/test/__snapshots__/test-no-constraint.spec.ts.snap +++ b/test/__snapshots__/test-no-constraint.spec.ts.snap @@ -1,7 +1,7 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if there is no constraint 1`] = ` -Array [ +exports[`betterer > should throw if there is no constraint 1`] = ` +[ " Error: for a test to work, it must have a \`constraint\` function. ❌ ", diff --git a/test/__snapshots__/test-no-test.spec.ts.snap b/test/__snapshots__/test-no-test.spec.ts.snap index 920009874..c76a65b66 100644 --- a/test/__snapshots__/test-no-test.spec.ts.snap +++ b/test/__snapshots__/test-no-test.spec.ts.snap @@ -1,7 +1,7 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if there is no test 1`] = ` -Array [ +exports[`betterer > should throw if there is no test 1`] = ` +[ " Error: for a test to work, it must have a \`test\` function. ❌ ", diff --git a/test/__snapshots__/test-not-a-betterer-test.spec.ts.snap b/test/__snapshots__/test-not-a-betterer-test.spec.ts.snap index 83da5e5b5..28458b843 100644 --- a/test/__snapshots__/test-not-a-betterer-test.spec.ts.snap +++ b/test/__snapshots__/test-not-a-betterer-test.spec.ts.snap @@ -1,9 +1,9 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if it doesn't return a BettererTest 1`] = ` -Array [ +exports[`betterer > should throw if it doesn't return a BettererTest 1`] = ` +[ " -Error: \\"test\\" must return a \`BettererTest\`. +Error: "test" must return a \`BettererTest\`. ", ] `; diff --git a/test/__snapshots__/test-not-a-function.spec.ts.snap b/test/__snapshots__/test-not-a-function.spec.ts.snap index c77c7e11b..7303d4f3e 100644 --- a/test/__snapshots__/test-not-a-function.spec.ts.snap +++ b/test/__snapshots__/test-not-a-function.spec.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if a test is not a function 1`] = ` -Array [ +exports[`betterer > should throw if a test is not a function 1`] = ` +[ " -Error: could not import config from \\"/fixtures/test-not-a-function/.betterer.js\\". 😔 +Error: could not create "test" from "fixtures/test-not-a-function/.betterer.js". 😔 -Error: \\"test\\" must be a function. +Error: "test" must be a function. ", ] `; diff --git a/test/__snapshots__/tsquery-message.spec.ts.snap b/test/__snapshots__/tsquery-message.spec.ts.snap index 4cfae95b0..5dc76ea77 100644 --- a/test/__snapshots__/tsquery-message.spec.ts.snap +++ b/test/__snapshots__/tsquery-message.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should include custom TSQuery warning messages 1`] = ` +exports[`betterer > should include custom TSQuery warning messages 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should include custom TSQuery warning messages 1`] = ` // exports[\`tsquery\`] = { value: \`{ - \\"src/index.ts:4087252068\\": [ - [0, 0, 11, \\"no console logs here\\", \\"3870399096\\"] + "src/index.ts:4087252068": [ + [0, 0, 11, "no console logs here", "3870399096"] ] }\` }; " `; -exports[`betterer should include custom TSQuery warning messages 2`] = ` -Array [ +exports[`betterer > should include custom TSQuery warning messages 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 tsquery: running \\"tsquery\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ tsquery: \\"tsquery\\" got checked for the first time! (1 issue) 🎉 +🤔 tsquery: running "tsquery"! ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" got checked for the first time! (1 issue) 🎉 +✅ tsquery: "tsquery" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" got checked for the first time! (1 issue) 🎉 +✅ tsquery: "tsquery" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 diff --git a/test/__snapshots__/tsquery-no-files.spec.ts.snap b/test/__snapshots__/tsquery-no-files.spec.ts.snap new file mode 100644 index 000000000..aebd824e1 --- /dev/null +++ b/test/__snapshots__/tsquery-no-files.spec.ts.snap @@ -0,0 +1,22 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should work when there are no relevant files for a TSQuery test 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 tsquery: running "tsquery"! +", + "🎉 Betterer (0ms): 1 test done! +✅ tsquery: "tsquery" met its goal! 🎉 +・ No relevant files found. Are the \`include()\`/\`exclude()\` options for this test correct? +", + "🎉 Betterer (0ms): 1 test done! +✅ tsquery: "tsquery" met its goal! 🎉 +・ No relevant files found. Are the \`include()\`/\`exclude()\` options for this test correct? + +1 test got checked. 🤔 +1 test met its goal! 🎉 +", +] +`; diff --git a/test/__snapshots__/tsquery-no-query.spec.ts.snap b/test/__snapshots__/tsquery-no-query.spec.ts.snap index 4d2798259..f239cef38 100644 --- a/test/__snapshots__/tsquery-no-query.spec.ts.snap +++ b/test/__snapshots__/tsquery-no-query.spec.ts.snap @@ -1,7 +1,7 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if there is no query 1`] = ` -Array [ +exports[`betterer > should throw if there is no query 1`] = ` +[ " Error: for \`@betterer/tsquery\` to work, you need to provide a query, e.g. \`'CallExpression > PropertyAccessExpression'\`. ❌ ", diff --git a/test/__snapshots__/tsquery.spec.ts.snap b/test/__snapshots__/tsquery.spec.ts.snap index f6cdfecf3..c536179c1 100644 --- a/test/__snapshots__/tsquery.spec.ts.snap +++ b/test/__snapshots__/tsquery.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the existence of TSQuery matches 1`] = ` +exports[`betterer > should report the existence of TSQuery matches 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should report the existence of TSQuery matches 1`] = ` // exports[\`tsquery\`] = { value: \`{ - \\"src/index.ts:4087252068\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:4087252068": [ + [0, 0, 11, "TSQuery match", "3870399096"] ] }\` }; " `; -exports[`betterer should report the existence of TSQuery matches 2`] = ` -Array [ +exports[`betterer > should report the existence of TSQuery matches 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 tsquery: running \\"tsquery\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ tsquery: \\"tsquery\\" got checked for the first time! (1 issue) 🎉 +🤔 tsquery: running "tsquery"! ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" got checked for the first time! (1 issue) 🎉 +✅ tsquery: "tsquery" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" got checked for the first time! (1 issue) 🎉 +✅ tsquery: "tsquery" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,16 +35,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 tsquery: running \\"tsquery\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ tsquery: \\"tsquery\\" stayed the same. (1 issue) 😐 +🤔 tsquery: running "tsquery"! ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" stayed the same. (1 issue) 😐 +✅ tsquery: "tsquery" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" stayed the same. (1 issue) 😐 +✅ tsquery: "tsquery" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -55,42 +49,26 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 tsquery: running \\"tsquery\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 tsquery: \\"tsquery\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 tsquery: \\"tsquery\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"tsquery\\" got worse. (1 new issue, 2 total) 😔 +🤔 tsquery: running "tsquery"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 tsquery: \\"tsquery\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/tsquery/src/index.ts\\". -・ New issue in \\"/fixtures/tsquery/src/index.ts\\"! +🔥 tsquery: "tsquery" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/tsquery/src/index.ts". ・ -・ /fixtures/tsquery/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match ・ - -Error: \\"tsquery\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 tsquery: \\"tsquery\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/tsquery/src/index.ts\\". -・ New issue in \\"/fixtures/tsquery/src/index.ts\\"! +🔥 tsquery: "tsquery" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/tsquery/src/index.ts". ・ -・ /fixtures/tsquery/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match ・ -Error: \\"tsquery\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -99,16 +77,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 tsquery: running \\"tsquery\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ tsquery: \\"tsquery\\" met its goal! 🎉 +🤔 tsquery: running "tsquery"! ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" met its goal! 🎉 +✅ tsquery: "tsquery" met its goal! 🎉 +・ 1 fixed issue in "fixtures/tsquery/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" met its goal! 🎉 +✅ tsquery: "tsquery" met its goal! 🎉 +・ 1 fixed issue in "fixtures/tsquery/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -117,16 +94,13 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 tsquery: running \\"tsquery\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ tsquery: \\"tsquery\\" has already met its goal! ✨ +🤔 tsquery: running "tsquery"! ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" has already met its goal! ✨ +✅ tsquery: "tsquery" has already met its goal! ✨ ", "🎉 Betterer (0ms): 1 test done! -✅ tsquery: \\"tsquery\\" has already met its goal! ✨ +✅ tsquery: "tsquery" has already met its goal! ✨ 1 test got checked. 🤔 1 test met its goal! 🎉 diff --git a/test/__snapshots__/typescript-cache.spec.ts.snap b/test/__snapshots__/typescript-cache.spec.ts.snap new file mode 100644 index 000000000..880afc8e4 --- /dev/null +++ b/test/__snapshots__/typescript-cache.spec.ts.snap @@ -0,0 +1,100 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should still reports errors if another file effects a cached TypeScript file 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`typescript\`] = { + value: \`{ + "src/index.ts:2822297654": [ + [5, 4, 5, "tsc: Object literal may only specify known properties, and \\'three\\' does not exist in type \\'MyThing\\'.", "183191147"] + ] + }\` +}; +" +`; + +exports[`betterer > should still reports errors if another file effects a cached TypeScript file 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 typescript: running "typescript"! +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 typescript: running "typescript"! +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" stayed the same. (1 issue) 😐 +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" stayed the same. (1 issue) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 +", + "Checking 1 file... 🤔 + +・ fixtures/typescript-cache/src/index.ts + +🌟 Betterer (0ms): +", + "Checking 1 file... 🤔 + +・ fixtures/typescript-cache/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 typescript: running "typescript"! +", + "Checking 1 file... 🤔 + +・ fixtures/typescript-cache/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 typescript: "typescript" got worse. (1 issue) 😔 +・ 1 fixed, 1 new issues in "fixtures/typescript-cache/src/index.ts". +・ +・ 3 | const myThing: MyThing = { +・ 4 | one: 1, +・ > 5 | two: 2, +・ | ^^^ tsc: Object literal may only specify known properties, and 'two' does not exist in type 'MyThing'. +・ 6 | three: 3 +・ 7 | } +・ +", + "Checked 1 file! 🔍 + +・ fixtures/typescript-cache/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 typescript: "typescript" got worse. (1 issue) 😔 +・ 1 fixed, 1 new issues in "fixtures/typescript-cache/src/index.ts". +・ +・ 3 | const myThing: MyThing = { +・ 4 | one: 1, +・ > 5 | two: 2, +・ | ^^^ tsc: Object literal may only specify known properties, and 'two' does not exist in type 'MyThing'. +・ 6 | three: 3 +・ 7 | } +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 +", +] +`; diff --git a/test/__snapshots__/typescript-dependency.spec.ts.snap b/test/__snapshots__/typescript-dependency.spec.ts.snap index cfda836bf..c58ceff78 100644 --- a/test/__snapshots__/typescript-dependency.spec.ts.snap +++ b/test/__snapshots__/typescript-dependency.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the status of the TypeScript compiler when there is a npm dependency 1`] = ` -Array [ +exports[`betterer > should report the status of the TypeScript compiler when there is a npm dependency 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 diff --git a/test/__snapshots__/typescript-fix-missing-properties.spec.ts.snap b/test/__snapshots__/typescript-fix-missing-properties.spec.ts.snap new file mode 100644 index 000000000..f299c4b1a --- /dev/null +++ b/test/__snapshots__/typescript-fix-missing-properties.spec.ts.snap @@ -0,0 +1,41 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should stabilise the number of missing properties in issue messages 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`typescript\`] = { + value: \`{ + "src/index.ts:3182043371": [ + [34, 6, 1, "tsc: Property \\'a1\\' is missing in type \\'{}\\' but required in type \\'A\\'.", "177604"], + [35, 6, 1, "tsc: Type \\'{}\\' is missing 2 properties from type \\'B\\'", "177607"], + [36, 6, 1, "tsc: Type \\'{}\\' is missing 3 properties from type \\'C\\'", "177606"], + [37, 6, 1, "tsc: Type \\'{}\\' is missing 4 properties from type \\'D\\'", "177601"], + [38, 6, 1, "tsc: Type \\'{}\\' is missing 5 properties from type \\'E\\'", "177600"], + [39, 6, 1, "tsc: Type \\'{}\\' is missing 6 properties from type \\'F\\'", "177603"] + ] + }\` +}; +" +`; + +exports[`betterer > should stabilise the number of missing properties in issue messages 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 typescript: running "typescript"! +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" got checked for the first time! (6 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" got checked for the first time! (6 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", +] +`; diff --git a/test/__snapshots__/typescript-fix-union-issue.spec.ts.snap b/test/__snapshots__/typescript-fix-union-issue.spec.ts.snap new file mode 100644 index 000000000..2ee109ddc --- /dev/null +++ b/test/__snapshots__/typescript-fix-union-issue.spec.ts.snap @@ -0,0 +1,37 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should stabilise the order of union types in issue messages 1`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`typescript\`] = { + value: \`{ + "src/index.ts:2327987794": [ + [1, 6, 1, "tsc: Type \\'1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | null\\' is not assignable to type \\'\\\\"A\\\\" | \\\\"B\\\\" | \\\\"C\\\\" | \\\\"D\\\\" | \\\\"E\\\\" | \\\\"F\\\\" | \\\\"G\\\\" | \\\\"H\\\\" | \\\\"I\\\\" | \\\\"J\\\\" | \\\\"K\\\\" | \\\\"L\\\\" | \\\\"M\\\\" | \\\\"N\\\\" | \\\\"O\\\\" | \\\\"P\\\\" | \\\\"Q\\\\" | \\\\"R\\\\" | \\\\"S\\\\" | \\\\"T\\\\" | \\\\"U\\\\" | \\\\"V\\\\" | \\\\"W\\\\" | \\\\"X\\\\" | \\\\"Y\\\\" | \\\\"Z\\\\"\\'.\\\\n Type \\'null\\' is not assignable to type \\'\\\\"A\\\\" | \\\\"B\\\\" | \\\\"C\\\\" | \\\\"D\\\\" | \\\\"E\\\\" | \\\\"F\\\\" | \\\\"G\\\\" | \\\\"H\\\\" | \\\\"I\\\\" | \\\\"J\\\\" | \\\\"K\\\\" | \\\\"L\\\\" | \\\\"M\\\\" | \\\\"N\\\\" | \\\\"O\\\\" | \\\\"P\\\\" | \\\\"Q\\\\" | \\\\"R\\\\" | \\\\"S\\\\" | \\\\"T\\\\" | \\\\"U\\\\" | \\\\"V\\\\" | \\\\"W\\\\" | \\\\"X\\\\" | \\\\"Y\\\\" | \\\\"Z\\\\"\\'.", "177607"], + [1, 171, 1, "tsc: Variable \\'a\\' is used before being assigned.", "177604"] + ] + }\` +}; +" +`; + +exports[`betterer > should stabilise the order of union types in issue messages 2`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 typescript: running "typescript"! +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" got checked for the first time! (2 issues) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ typescript: "typescript" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", +] +`; diff --git a/test/__snapshots__/typescript-incremental.spec.ts.snap b/test/__snapshots__/typescript-incremental.spec.ts.snap index 3f1c63649..a247bce86 100644 --- a/test/__snapshots__/typescript-incremental.spec.ts.snap +++ b/test/__snapshots__/typescript-incremental.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work with an incremental build 1`] = ` -Array [ +exports[`betterer > should work with an incremental build 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -22,16 +19,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" stayed the same. (1 issue) 😐 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" stayed the same. (1 issue) 😐 +✅ typescript: "typescript" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" stayed the same. (1 issue) 😐 +✅ typescript: "typescript" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/__snapshots__/typescript-no-config-file.spec.ts.snap b/test/__snapshots__/typescript-no-config-file.spec.ts.snap index 8f877b2df..1560b812b 100644 --- a/test/__snapshots__/typescript-no-config-file.spec.ts.snap +++ b/test/__snapshots__/typescript-no-config-file.spec.ts.snap @@ -1,7 +1,7 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should throw if there is no configFilePath 1`] = ` -Array [ +exports[`betterer > should throw if there is no configFilePath 1`] = ` +[ " Error: for \`@betterer/typescript\` to work, you need to provide the path to a tsconfig.json file, e.g. \`'./tsconfig.json'\`. ❌ ", diff --git a/test/__snapshots__/typescript-strict.spec.ts.snap b/test/__snapshots__/typescript-strict.spec.ts.snap index 79fb9b741..3ad78615a 100644 --- a/test/__snapshots__/typescript-strict.spec.ts.snap +++ b/test/__snapshots__/typescript-strict.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the status of the TypeScript compiler in strict mode 1`] = ` +exports[`betterer > should report the status of the TypeScript compiler in strict mode 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,34 +8,31 @@ exports[`betterer should report the status of the TypeScript compiler in strict // exports[\`typescript\`] = { value: \`{ - \\"src/index.ts:3281126131\\": [ - [0, 27, 4, \\"Parameter \\\\'list\\\\' implicitly has an \\\\'any\\\\' type.\\", \\"2087656743\\"], - [1, 18, 6, \\"Parameter \\\\'member\\\\' implicitly has an \\\\'any\\\\' type.\\", \\"1468198325\\"], - [5, 9, 4, \\"\\\\'this\\\\' implicitly has type \\\\'any\\\\' because it does not have a type annotation.\\", \\"2087959715\\"], - [17, 9, 6, \\"Object is possibly \\\\'undefined\\\\'.\\", \\"1682699846\\"], - [21, 10, 3, \\"Property \\\\'bar\\\\' has no initializer and is not definitely assigned in the constructor.\\", \\"193415156\\"], - [29, 16, 9, \\"Argument of type \\\\'[number, number, number]\\\\' is not assignable to parameter of type \\\\'[num1: number, num2: number]\\\\'.\\\\\\\\n Source has 3 element(s) but target allows only 2.\\", \\"2320562899\\"] + "src/index.ts:3281126131": [ + [0, 27, 4, "tsc: Parameter \\'list\\' implicitly has an \\'any\\' type.", "2087656743"], + [1, 18, 6, "tsc: Parameter \\'member\\' implicitly has an \\'any\\' type.", "1468198325"], + [5, 9, 4, "tsc: \\'this\\' implicitly has type \\'any\\' because it does not have a type annotation.", "2087959715"], + [17, 9, 6, "tsc: \\'number\\' is possibly \\'undefined\\'.", "1682699846"], + [21, 10, 3, "tsc: Property \\'bar\\' has no initializer and is not definitely assigned in the constructor.", "193415156"], + [29, 16, 9, "tsc: Argument of type \\'[number, number, number]\\' is not assignable to parameter of type \\'[num1: number, num2: number]\\'.\\\\n Source has 3 element(s) but target allows only 2.", "2320562899"] ] }\` }; " `; -exports[`betterer should report the status of the TypeScript compiler in strict mode 2`] = ` -Array [ +exports[`betterer > should report the status of the TypeScript compiler in strict mode 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" got checked for the first time! (6 issues) 🎉 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (6 issues) 🎉 +✅ typescript: "typescript" got checked for the first time! (6 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (6 issues) 🎉 +✅ typescript: "typescript" got checked for the first time! (6 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -43,16 +40,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" stayed the same. (6 issues) 😐 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" stayed the same. (6 issues) 😐 +✅ typescript: "typescript" stayed the same. (6 issues) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" stayed the same. (6 issues) 😐 +✅ typescript: "typescript" stayed the same. (6 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -60,44 +54,28 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 7 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 7 total) 😔 - -Error: \\"typescript\\" got worse. (1 new issue, 7 total) 😔 +🤔 typescript: running "typescript"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 7 total) 😔 -・ 6 existing issues in \\"/fixtures/typescript-strict/src/index.ts\\". -・ New issue in \\"/fixtures/typescript-strict/src/index.ts\\"! +🔥 typescript: "typescript" got worse. (1 new issue, 6 existing, 7 total) 😔 +・ 6 existing, 1 new issues in "fixtures/typescript-strict/src/index.ts". ・ -・ /fixtures/typescript-strict/src/index.ts ・ 32 | const a = 'a'; ・ 33 | const one = 1; ・ > 34 | console.log(a * one); -・ | ^ The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. +・ | ^ tsc: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. ・ - -Error: \\"typescript\\" got worse. (1 new issue, 7 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 7 total) 😔 -・ 6 existing issues in \\"/fixtures/typescript-strict/src/index.ts\\". -・ New issue in \\"/fixtures/typescript-strict/src/index.ts\\"! +🔥 typescript: "typescript" got worse. (1 new issue, 6 existing, 7 total) 😔 +・ 6 existing, 1 new issues in "fixtures/typescript-strict/src/index.ts". ・ -・ /fixtures/typescript-strict/src/index.ts ・ 32 | const a = 'a'; ・ 33 | const one = 1; ・ > 34 | console.log(a * one); -・ | ^ The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. +・ | ^ tsc: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. ・ -Error: \\"typescript\\" got worse. (1 new issue, 7 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -106,16 +84,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" got better! (1 fixed issue, 5 remaining) 😍 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got better! (1 fixed issue, 5 remaining) 😍 +✅ typescript: "typescript" got better! (1 fixed issue, 5 remaining) 😍 +・ 1 fixed, 5 existing issues in "fixtures/typescript-strict/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got better! (1 fixed issue, 5 remaining) 😍 +✅ typescript: "typescript" got better! (1 fixed issue, 5 remaining) 😍 +・ 1 fixed, 5 existing issues in "fixtures/typescript-strict/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 diff --git a/test/__snapshots__/typescript.spec.ts.snap b/test/__snapshots__/typescript.spec.ts.snap index fd53819fc..6d6748f05 100644 --- a/test/__snapshots__/typescript.spec.ts.snap +++ b/test/__snapshots__/typescript.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should report the status of the TypeScript compiler 1`] = ` +exports[`betterer > should report the status of the TypeScript compiler 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should report the status of the TypeScript compiler 1`] = ` // exports[\`typescript\`] = { value: \`{ - \\"src/index.ts:1499252024\\": [ - [2, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/index.ts:1499252024": [ + [2, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer should report the status of the TypeScript compiler 2`] = ` -Array [ +exports[`betterer > should report the status of the TypeScript compiler 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" got checked for the first time! (1 issue) 🎉 +✅ typescript: "typescript" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,16 +35,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" stayed the same. (1 issue) 😐 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" stayed the same. (1 issue) 😐 +✅ typescript: "typescript" stayed the same. (1 issue) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" stayed the same. (1 issue) 😐 +✅ typescript: "typescript" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -55,44 +49,28 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"typescript\\" got worse. (1 new issue, 2 total) 😔 +🤔 typescript: running "typescript"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/typescript/src/index.ts\\". -・ New issue in \\"/fixtures/typescript/src/index.ts\\"! +🔥 typescript: "typescript" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/typescript/src/index.ts". ・ -・ /fixtures/typescript/src/index.ts ・ 1 | const a = 'a'; ・ 2 | const one = 1; ・ > 3 | console.log(a * one, one * a); -・ | ^ The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. +・ | ^ tsc: The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. ・ - -Error: \\"typescript\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 typescript: \\"typescript\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/typescript/src/index.ts\\". -・ New issue in \\"/fixtures/typescript/src/index.ts\\"! +🔥 typescript: "typescript" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/typescript/src/index.ts". ・ -・ /fixtures/typescript/src/index.ts ・ 1 | const a = 'a'; ・ 2 | const one = 1; ・ > 3 | console.log(a * one, one * a); -・ | ^ The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. +・ | ^ tsc: The right-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. ・ -Error: \\"typescript\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 @@ -101,16 +79,15 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" met its goal! 🎉 +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" met its goal! 🎉 +✅ typescript: "typescript" met its goal! 🎉 +・ 1 fixed issue in "fixtures/typescript/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" met its goal! 🎉 +✅ typescript: "typescript" met its goal! 🎉 +・ 1 fixed issue in "fixtures/typescript/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -119,16 +96,13 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 typescript: running \\"typescript\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ typescript: \\"typescript\\" has already met its goal! ✨ +🤔 typescript: running "typescript"! ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" has already met its goal! ✨ +✅ typescript: "typescript" has already met its goal! ✨ ", "🎉 Betterer (0ms): 1 test done! -✅ typescript: \\"typescript\\" has already met its goal! ✨ +✅ typescript: "typescript" has already met its goal! ✨ 1 test got checked. 🤔 1 test met its goal! 🎉 diff --git a/test/__snapshots__/workers.e2e.spec.ts.snap b/test/__snapshots__/workers.e2e.spec.ts.snap new file mode 100644 index 000000000..c2805e566 --- /dev/null +++ b/test/__snapshots__/workers.e2e.spec.ts.snap @@ -0,0 +1,89 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer > should run tests in workers 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🎉 Betterer (0ms): 4 tests done! +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! (1 issue) 🎉 +✅ test 4: "test 4" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 4 tests done! +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! (1 issue) 🎉 +✅ test 4: "test 4" got checked for the first time! (1 issue) 🎉 + +4 tests got checked. 🤔 +4 tests got checked for the first time! 🎉 +", + "🌟 Betterer (0ms): +", + "💥 Betterer (0ms): 4 tests done! 1 test errored! +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" stayed the same. 😐 +✅ test 3: "test 3" met its goal! 🎉 +・ 1 fixed issue in "fixtures/workers/src/index.ts". +🔥 test 4: "test 4" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/workers/src/index.ts". +・ +・ 1 | // HACK +・ > 2 | // HACK +・ | ^^^^^^^ RegExp match +・ +", + "💥 Betterer (0ms): 4 tests done! 1 test errored! +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" stayed the same. 😐 +✅ test 3: "test 3" met its goal! 🎉 +・ 1 fixed issue in "fixtures/workers/src/index.ts". +🔥 test 4: "test 4" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/workers/src/index.ts". +・ +・ 1 | // HACK +・ > 2 | // HACK +・ | ^^^^^^^ RegExp match +・ + +4 tests got checked. 🤔 +1 test got better! 😍 +1 test met its goal! 🎉 +2 tests stayed the same. 😐 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 +", +] +`; + +exports[`betterer > should run tests in workers 2`] = ` +"// BETTERER RESULTS V2. +// +// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: +// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge +// +exports[\`test 1\`] = { + value: \`0 +\` +}; + +exports[\`test 2\`] = { + value: \`0 +\` +}; + +exports[\`test 3\`] = { + value: \`{}\` +}; + +exports[\`test 4\`] = { + value: \`{ + "src/index.ts:2760033717": [ + [0, 0, 7, "RegExp match", "645651780"] + ] + }\` +}; +" +`; diff --git a/test/__snapshots__/workers.spec.ts.snap b/test/__snapshots__/workers.spec.ts.snap deleted file mode 100644 index 89f5cfaa2..000000000 --- a/test/__snapshots__/workers.spec.ts.snap +++ /dev/null @@ -1,91 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer should run tests in workers 1`] = ` -Array [ - "🌟 Betterer (0ms): -", - "🎉 Betterer (0ms): 4 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! (1 issue) 🎉 -✅ test 4: \\"test 4\\" got checked for the first time! (1 issue) 🎉 -", - "🎉 Betterer (0ms): 4 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! (1 issue) 🎉 -✅ test 4: \\"test 4\\" got checked for the first time! (1 issue) 🎉 - -4 tests got checked. 🤔 -4 tests got checked for the first time! 🎉 -", - "🌟 Betterer (0ms): -", - "💥 Betterer (0ms): 4 tests done! 1 test errored! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" stayed the same. 😐 -✅ test 3: \\"test 3\\" met its goal! 🎉 -🔥 test 4: \\"test 4\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/workers/src/index.ts\\". -・ New issue in \\"/fixtures/workers/src/index.ts\\"! -・ -・ /fixtures/workers/src/index.ts -・ 1 | // HACK -・ > 2 | // HACK -・ | ^^^^^^^ RegExp match -・ - -Error: \\"test 4\\" got worse. (1 new issue, 2 total) 😔 -", - "💥 Betterer (0ms): 4 tests done! 1 test errored! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" stayed the same. 😐 -✅ test 3: \\"test 3\\" met its goal! 🎉 -🔥 test 4: \\"test 4\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/workers/src/index.ts\\". -・ New issue in \\"/fixtures/workers/src/index.ts\\"! -・ -・ /fixtures/workers/src/index.ts -・ 1 | // HACK -・ > 2 | // HACK -・ | ^^^^^^^ RegExp match -・ - -Error: \\"test 4\\" got worse. (1 new issue, 2 total) 😔 - -4 tests got checked. 🤔 -1 test got better! 😍 -1 test met its goal! 🎉 -2 tests stayed the same. 😐 -1 test got worse. 😔 - -You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 -", -] -`; - -exports[`betterer should run tests in workers 2`] = ` -"// BETTERER RESULTS V2. -// -// If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: -// https://phenomnomnominal.github.io/betterer/docs/results-file/#merge -// -exports[\`test 1\`] = { - value: \`0 -\` -}; - -exports[\`test 2\`] = { - value: \`0 -\` -}; - -exports[\`test 4\`] = { - value: \`{ - \\"src/index.ts:2760033717\\": [ - [0, 0, 7, \\"RegExp match\\", \\"645651780\\"] - ] - }\` -}; -" -`; diff --git a/test/__snapshots__/worse-result.spec.ts.snap b/test/__snapshots__/worse-result.spec.ts.snap index 0d00ccd0f..71d280d5f 100644 --- a/test/__snapshots__/worse-result.spec.ts.snap +++ b/test/__snapshots__/worse-result.spec.ts.snap @@ -1,16 +1,16 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should work when a test gets worse 1`] = ` -Array [ +exports[`betterer > should work when a test gets worse 1`] = ` +[ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 2 tests done! -✅ should shrink: \\"should shrink\\" got checked for the first time! 🎉 -✅ should grow: \\"should grow\\" got checked for the first time! 🎉 +✅ should shrink: "should shrink" got checked for the first time! 🎉 +✅ should grow: "should grow" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 2 tests done! -✅ should shrink: \\"should shrink\\" got checked for the first time! 🎉 -✅ should grow: \\"should grow\\" got checked for the first time! 🎉 +✅ should shrink: "should shrink" got checked for the first time! 🎉 +✅ should grow: "should grow" got checked for the first time! 🎉 2 tests got checked. 🤔 2 tests got checked for the first time! 🎉 @@ -18,41 +18,33 @@ Array [ "🌟 Betterer (0ms): ", "💥 Betterer (0ms): 2 tests done! 2 tests errored! -🔥 should shrink: \\"should shrink\\" got worse. 😔 +🔥 should shrink: "should shrink" got worse. 😔 ・ - Expected ・ + Result ・ ・ - 3 ・ + 4 - -Error: \\"should shrink\\" got worse. 😔 -🔥 should grow: \\"should grow\\" got worse. 😔 +🔥 should grow: "should grow" got worse. 😔 ・ - Expected ・ + Result ・ ・ - -1 ・ + -2 - -Error: \\"should grow\\" got worse. 😔 ", "💥 Betterer (0ms): 2 tests done! 2 tests errored! -🔥 should shrink: \\"should shrink\\" got worse. 😔 +🔥 should shrink: "should shrink" got worse. 😔 ・ - Expected ・ + Result ・ ・ - 3 ・ + 4 - -Error: \\"should shrink\\" got worse. 😔 -🔥 should grow: \\"should grow\\" got worse. 😔 +🔥 should grow: "should grow" got worse. 😔 ・ - Expected ・ + Result ・ ・ - -1 ・ + -2 -Error: \\"should grow\\" got worse. 😔 - 2 tests got checked. 🤔 2 tests got worse. 😔 @@ -61,7 +53,7 @@ You should try to fix the new issues! As a last resort, you can run \`betterer - ] `; -exports[`betterer should work when a test gets worse 2`] = ` +exports[`betterer > should work when a test gets worse 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: diff --git a/test/__snapshots__/worse-strict.spec.ts.snap b/test/__snapshots__/worse-strict.spec.ts.snap index bc7935ee3..c3d73b496 100644 --- a/test/__snapshots__/worse-strict.spec.ts.snap +++ b/test/__snapshots__/worse-strict.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should stay worse if an update is not allowed 1`] = ` +exports[`betterer > should stay worse if an update is not allowed 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,29 +8,26 @@ exports[`betterer should stay worse if an update is not allowed 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:4087252068\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:4087252068": [ + [0, 0, 11, "TSQuery match", "3870399096"] ] }\` }; " `; -exports[`betterer should stay worse if an update is not allowed 2`] = ` -Array [ +exports[`betterer > should stay worse if an update is not allowed 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -38,42 +35,26 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 +🤔 test: running "test"! ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/worse-strict/src/index.ts\\". -・ New issue in \\"/fixtures/worse-strict/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/worse-strict/src/index.ts". ・ -・ /fixtures/worse-strict/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match ・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 ", "💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/worse-strict/src/index.ts\\". -・ New issue in \\"/fixtures/worse-strict/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/worse-strict/src/index.ts". ・ -・ /fixtures/worse-strict/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match ・ -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 diff --git a/test/__snapshots__/worse-update.spec.ts.snap b/test/__snapshots__/worse-update.spec.ts.snap index 99ed02018..463904b26 100644 --- a/test/__snapshots__/worse-update.spec.ts.snap +++ b/test/__snapshots__/worse-update.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer should not stay worse if an update is forced 1`] = ` +exports[`betterer > should not stay worse if an update is forced 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,30 +8,27 @@ exports[`betterer should not stay worse if an update is forced 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:315583663\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"], - [1, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:315583663": [ + [0, 0, 11, "TSQuery match", "3870399096"], + [1, 0, 11, "TSQuery match", "3870399096"] ] }\` }; " `; -exports[`betterer should not stay worse if an update is forced 2`] = ` -Array [ +exports[`betterer > should not stay worse if an update is forced 2`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -39,28 +36,21 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got force updated. (1 new issue, 2 total) 🆙 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 2 total) 🆙 -・ 1 existing issue in \\"/fixtures/worse-update/src/index.ts\\". -・ New issue in \\"/fixtures/worse-update/src/index.ts\\"! +✅ test: "test" got force updated. (1 new issue, 1 existing, 2 total) 🆙 +・ 1 existing, 1 new issues in "fixtures/worse-update/src/index.ts". ・ -・ /fixtures/worse-update/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match ・ ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got force updated. (1 new issue, 2 total) 🆙 -・ 1 existing issue in \\"/fixtures/worse-update/src/index.ts\\". -・ New issue in \\"/fixtures/worse-update/src/index.ts\\"! +✅ test: "test" got force updated. (1 new issue, 1 existing, 2 total) 🆙 +・ 1 existing, 1 new issues in "fixtures/worse-update/src/index.ts". ・ -・ /fixtures/worse-update/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match @@ -72,16 +62,13 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/angular-cache.spec.ts b/test/angular-cache.spec.ts new file mode 100644 index 000000000..5f3079e8d --- /dev/null +++ b/test/angular-cache.spec.ts @@ -0,0 +1,167 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should still reports errors if another file effects a cached Angular file', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, readFile, resolve, cleanup, testNames, writeFile } = await createFixture('angular-cache', { + '.betterer.js': ` +import { angular } from '@betterer/angular'; + +export default { + angular: () => angular('./tsconfig.json', { + strictTemplates: true + }).include('./src/**/*.ts', './src/**/*.html') +}; + `, + 'angular.json': ` +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "demo": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "index": "src/index.html", + "main": "src/main.ts", + "tsConfig": "tsconfig.json" + }, + "configurations": {} + } + } + } + }, + "defaultProject": "demo" +} + `, + 'tsconfig.json': ` +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "module": "esnext", + "moduleResolution": "node", + "importHelpers": true, + "strict": true, + "target": "es2015", + "typeRoots": [], + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "disableTypeScriptVersionCheck": true + } +}`, + './src/app/hero.ts': ` +export interface Hero { + id: number; + name: string; +} + `, + './src/app/app.component.ts': ` +import { Component } from '@angular/core'; +import { Hero } from './hero'; + +@Component({ + selector: 'my-app', + template: \` +
{{ title }}
+
    +
  • +
    {{ hero.Id }} {{ hero.name }}
    +
  • +
+ \`, +}) +export class AppComponent { + public heroes: Array = [ + { id: 10, name: "Landon" }, + { id: 20, name: "Ella" }, + { id: 30, name: "Madelyn" }, + { id: 40, name: "Haley" } + ]; + public trackByHero(hero: Hero) { + return hero.id; + } +} +`, + './src/app/app.module.ts': ` +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; + +import { AppComponent } from './app.component'; + +@NgModule({ + imports: [BrowserModule, CommonModule], + declarations: [AppComponent], + bootstrap: [AppComponent] +}) +export class AppModule {} +`, + './src/index.html': ` + +`, + './src/main.ts': ` +import 'zone.js/dist/zone'; + +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; + +platformBrowserDynamic().bootstrapModule(AppModule); +` + }); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + const heroPath = resolve('./src/app/hero.ts'); + + const newTestRun = await betterer({ cachePath, configPaths, resultsPath, workers: false, cache: true }); + + expect(testNames(newTestRun.new)).toEqual(['angular']); + + const sameTestRun = await betterer({ cachePath, configPaths, resultsPath, workers: false, cache: true }); + + expect(testNames(sameTestRun.same)).toEqual(['angular']); + + await writeFile(heroPath, `\nexport interface Hero {\n id: number;\n name: string;\n power: string;\n}`); + + const worseTestRun = await betterer({ + cachePath, + configPaths, + resultsPath, + workers: false, + cache: true, + includes: [resolve('./src/app/app.component.ts')] + }); + + expect(testNames(worseTestRun.worse)).toEqual(['angular']); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/angular-include.spec.ts b/test/angular-include.spec.ts new file mode 100644 index 000000000..0ad51a206 --- /dev/null +++ b/test/angular-include.spec.ts @@ -0,0 +1,196 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should report the status of the Angular compiler on specific files', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, readFile, cleanup, testNames } = await createFixture('angular-include', { + '.betterer.js': ` +import { angular } from '@betterer/angular'; + +export default { + angular: () => angular('./tsconfig.json', { + strictTemplates: true + }).include('./src/app/hero-list.component.ts') +}; + `, + 'angular.json': ` +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "first-app": { + "projectType": "application", + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "outputPath": "dist/first-app", + "index": "src/index.html", + "browser": "src/main.ts", + "polyfills": ["zone.js"], + "tsConfig": "tsconfig.app.json", + "inlineStyleLanguage": "scss", + "assets": [ + { + "glob": "**/*", + "input": "src/public" + } + ], + "styles": ["src/styles.css"], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kB", + "maximumError": "4kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + } + } + } + } +} + `, + 'tsconfig.json': ` +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "ES2022", + "module": "ES2022", + "useDefineForClassFields": false, + "lib": ["ES2022", "dom"] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true + } +} + `, + 'tsconfig.app.json': ` +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": ["src/main.ts"], + "include": ["src/**/*.d.ts"] +} + `, + './src/app/app.component.ts': ` +import { Component } from '@angular/core'; +import { HeroListComponent } from './hero-list.component'; + +@Component({ + selector: 'app-root', + standalone: true, + imports: [HeroListComponent], + template: \` +
{{ title }}
+ + \`, +}) +export class AppComponent {} +`, + './src/app/hero-list.component.ts': ` +import { Component } from '@angular/core'; + +interface Hero { + id: number; + name: string; +} + +@Component({ + selector: 'hero-list', + standalone: true, + template: \` +
    + @for (hero of heroes; track hero.id) { +
  • +
    {{ hero.Id }} {{ hero.name }}
    +
  • + } +
+ \`, +}) +export class HeroListComponent { + public heroes: Array = [ + { id: 10, name: "Landon" }, + { id: 20, name: "Ella" }, + { id: 30, name: "Madelyn" }, + { id: 40, name: "Haley" } + ]; +} + `, + './src/main.ts': ` +import {bootstrapApplication} from '@angular/platform-browser'; +import {AppComponent} from './app/app.component'; + +bootstrapApplication(AppComponent, { providers: [] }).catch((err) => console.error(err)); + `, + './src/index.html': ` + + ` + }); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + + const newTestRun = await betterer({ cachePath, configPaths, resultsPath, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['angular']); + + const [newRun] = newTestRun.new; + const appComponentPath = newRun.filePaths?.find((path) => path.endsWith('app.component.ts')); + + expect(appComponentPath).not.toBeDefined(); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/angular-no-compiler-options.spec.ts b/test/angular-no-compiler-options.spec.ts new file mode 100644 index 000000000..b95fe8dec --- /dev/null +++ b/test/angular-no-compiler-options.spec.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should throw when trying to run Angular with no compiler options', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup } = await createFixture('angular-no-compiler-options', { + '.betterer.js': ` +import { angular } from '@betterer/angular'; + +export default { + test: () => angular('./tsconfig.json').include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await expect(async () => await betterer({ configPaths, resultsPath, workers: false })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/angular-no-config-path.spec.ts b/test/angular-no-config-path.spec.ts new file mode 100644 index 000000000..ba5a7d672 --- /dev/null +++ b/test/angular-no-config-path.spec.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should throw when trying to run Angular with no config file path', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup } = await createFixture('angular-no-config-path', { + '.betterer.js': ` +import { angular } from '@betterer/angular'; + +export default { + test: () => angular().include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await expect(async () => await betterer({ configPaths, resultsPath, workers: false })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/angular-no-valid-files.spec.ts b/test/angular-no-valid-files.spec.ts new file mode 100644 index 000000000..127948f4b --- /dev/null +++ b/test/angular-no-valid-files.spec.ts @@ -0,0 +1,33 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it(`shouldn't actually run the compiler when there are no valid files`, async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup } = await createFixture('angular-no-valid-files', { + '.betterer.ts': ` +import { angular } from '@betterer/angular'; + +export default { + test: () => angular('./tsconfig.json', { + strictTemplates: true + }).include('./invalid-include') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + const [completed] = newTestRun.completed; + expect(completed.filePaths).toHaveLength(0); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/angular.spec.ts b/test/angular.spec.ts index 9d256df6a..ac4e3f8c9 100644 --- a/test/angular.spec.ts +++ b/test/angular.spec.ts @@ -1,12 +1,13 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the status of the Angular compiler in strict mode', async () => { const { betterer } = await import('@betterer/betterer'); const { paths, logs, readFile, cleanup, testNames } = await createFixture('angular-strict', { - '.betterer.ts': ` + '.betterer.js': ` import { angular } from '@betterer/angular'; export default { @@ -57,9 +58,7 @@ export default { "importHelpers": true, "strict": true, "target": "es2015", - "typeRoots": [ - "node_modules/@types" - ], + "typeRoots": [], "lib": [ "es2018", "dom" diff --git a/test/api/src/index.tsx b/test/api/src/index.tsx index fb6e91ada..d4926cf2d 100644 --- a/test/api/src/index.tsx +++ b/test/api/src/index.tsx @@ -2,11 +2,12 @@ import type { BettererLogger } from '@betterer/logger'; import type { FC } from '@betterer/render'; import type { BettererTasksState } from '@betterer/tasks'; -import { React, getRenderOptions, render, useCallback } from '@betterer/render'; -import { BettererTaskLogger, BettererTasksLogger } from '@betterer/tasks'; -import { exposeToWorker__, importWorker__ } from '@betterer/worker'; import type { TestPackageAPIWorker } from './types.js'; +import { React, getRenderOptionsΔ, render, useCallback } from '@betterer/render'; +import { BettererTaskLogger, BettererTasksLogger } from '@betterer/tasks'; +import { exposeToWorkerΔ, importWorkerΔ } from '@betterer/worker'; + interface APITestProps { packageNames: Array; } @@ -16,15 +17,15 @@ export const APITest: FC = function APITest({ packageNames }) { {packageNames.map((packageName) => { const task = useCallback( - async (logger: BettererLogger) => { - const worker: TestPackageAPIWorker = importWorker__('./test-package-api.worker.js'); + async (_: BettererLogger, status: BettererLogger) => { + const worker: TestPackageAPIWorker = await importWorkerΔ('./test-package-api.worker.js'); try { - return await worker.api.run(exposeToWorker__(logger), packageName); + return await worker.api.run(exposeToWorkerΔ(status), packageName); } finally { await worker.destroy(); } }, - [packageName, exposeToWorker__] + [packageName, exposeToWorkerΔ] ); return ; })} @@ -41,13 +42,13 @@ function update(state: BettererTasksState): string { } function tests(n: number): string { - return `${n} ${n === 1 ? 'test' : 'tests'}`; + return `${String(n)} ${n === 1 ? 'test' : 'tests'}`; } void (async () => { - const worker: TestPackageAPIWorker = importWorker__('./test-package-api.worker.js'); + const worker: TestPackageAPIWorker = await importWorkerΔ('./test-package-api.worker.js'); const packageNames = await worker.api.getPackages(); - const test = render(, getRenderOptions(process.env.NODE_ENV)); + const test = render(, getRenderOptionsΔ(process.env.NODE_ENV)); await worker.destroy(); await test.waitUntilExit(); })(); diff --git a/test/api/src/test-package-api.worker.ts b/test/api/src/test-package-api.worker.ts index 55a3f589b..4b4780a41 100644 --- a/test/api/src/test-package-api.worker.ts +++ b/test/api/src/test-package-api.worker.ts @@ -1,21 +1,24 @@ import type { BettererLogger } from '@betterer/logger'; import { BettererError } from '@betterer/errors'; -import { diffStrings__ } from '@betterer/logger'; -import { exposeToMain__ } from '@betterer/worker'; +import { diffStringsΔ } from '@betterer/logger'; +import { exposeToMainΔ } from '@betterer/worker'; import { Extractor, ExtractorConfig } from '@microsoft/api-extractor'; import { promises as fs } from 'node:fs'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; const EXCLUDED_PACKAGES = ['docgen', 'extension', 'fixture', 'render', 'time']; const EXTRACTION_EXTENSION = '.api.md'; const EXTRACTION_CONFIG_FILE = 'api-extractor.json'; + +const INTERNAL_TOKENS = ['Ω']; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const PACKAGES_DIR = path.resolve(__dirname, '../../../packages'); const GOLDENS_DIR = path.resolve(__dirname, '../../../goldens/api'); const TEMP_DIR = path.resolve(__dirname, '../../../goldens/temp'); -const INTERNAL_TOKENS = ['Ω']; - export async function getPackages(): Promise> { const items = await fs.readdir(PACKAGES_DIR); @@ -32,8 +35,8 @@ export async function getPackages(): Promise> { }); } -export async function run(logger: BettererLogger, packageName: string): Promise { - await logger.progress(`Validating API for "@betterer/${packageName}" ...`); +export async function run(status: BettererLogger, packageName: string): Promise { + await status.progress(`Validating API for "@betterer/${packageName}" ...`); const packageGoldenPath = path.join(GOLDENS_DIR, `${packageName}${EXTRACTION_EXTENSION}`); const packageGeneratedPath = path.join(TEMP_DIR, `${packageName}${EXTRACTION_EXTENSION}`); @@ -62,7 +65,7 @@ export async function run(logger: BettererLogger, packageName: string): Promise< return `No Breaking API changes found in "@betterer/${packageName}".`; } - const diff = diffStrings__(packageGolden, packageGenerated, { aAnnotation: 'Golden', bAnnotation: 'Current' }); + const diff = diffStringsΔ(packageGolden, packageGenerated, { aAnnotation: 'Golden', bAnnotation: 'Current' }); throw new BettererError(`API changes found in "@betterer/${packageName.toString()}"`, diff); } @@ -70,4 +73,4 @@ function checkForBannedTokens(types: string, token: string): boolean { return types.includes(token); } -exposeToMain__({ getPackages, run }); +exposeToMainΔ({ getPackages, run }); diff --git a/test/better-result.spec.ts b/test/better-result.spec.ts index e0f912343..4e7f43aab 100644 --- a/test/better-result.spec.ts +++ b/test/better-result.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work when a result gets better', async () => { @@ -9,14 +10,14 @@ describe('betterer', () => { 'better-result', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller, bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller, bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); -const shrinks = persist(__dirname, 'shrinks', 2); +const grows = persist(import.meta.url, 'grows', 0); +const shrinks = persist(import.meta.url, 'shrinks', 2); -module.exports = { +export default { 'should shrink': () => new BettererTest({ test: () => shrinks.decrement(), constraint: smaller diff --git a/test/better-test-change.spec.ts b/test/better-test-change.spec.ts index 714bac584..1b908fa07 100644 --- a/test/better-test-change.spec.ts +++ b/test/better-test-change.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work when a test changes and makes the result better', async () => { @@ -32,11 +33,11 @@ console.log('foo'); }); const resultsPath = paths.results; - const firstRun = await betterer({ configPaths: [resolve('.betterer.ts')], resultsPath, workers: false }); + const firstRun = await betterer({ configPaths: [resolve('.betterer.js')], resultsPath, workers: false }); expect(testNames(firstRun.new)).toEqual(['test']); - const secondRun = await betterer({ configPaths: [resolve('.betterer.changed.ts')], resultsPath, workers: false }); + const secondRun = await betterer({ configPaths: [resolve('.betterer.changed.js')], resultsPath, workers: false }); expect(testNames(secondRun.better)).toEqual(['test']); diff --git a/test/cache-ci-off.spec.ts b/test/cache-ci-off.spec.ts new file mode 100644 index 000000000..564171ead --- /dev/null +++ b/test/cache-ci-off.spec.ts @@ -0,0 +1,42 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should not update the cache file in CI mode when the cache is off', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('cache-ci-off', { + '.betterer.js': ` +import { regexp } from '@betterer/regexp'; + +export default { + test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') +}; + ` + }); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, `// HACK:\n// HACK:`); + + const newTestRun = await betterer({ configPaths, resultsPath, cache: false, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['test']); + + await expect(async () => await readFile(cachePath)).rejects.toThrow(); + + const ciTestRun = await betterer({ configPaths, resultsPath, cache: false, ci: true, workers: false }); + + expect(testNames(ciTestRun.same)).toEqual(['test']); + + await expect(async () => await readFile(cachePath)).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cache-ci.spec.ts b/test/cache-ci-on.spec.ts similarity index 58% rename from test/cache-ci.spec.ts rename to test/cache-ci-on.spec.ts index e71da36f4..f58b37402 100644 --- a/test/cache-ci.spec.ts +++ b/test/cache-ci-on.spec.ts @@ -1,15 +1,16 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { - it('should not update the cache file in CI mode', async () => { + it('should update the cache file in CI mode when the cache is on', async () => { const { betterer } = await import('@betterer/betterer'); - const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('cache-ci', { + const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('cache-ci-on', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') }; ` @@ -22,23 +23,19 @@ module.exports = { await writeFile(indexPath, `// HACK:\n// HACK:`); - const newTestRun = await betterer({ configPaths, resultsPath, cachePath, workers: false }); + const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); expect(testNames(newTestRun.new)).toEqual(['test']); - const newCache = await readFile(cachePath); - - expect(newCache).toMatchSnapshot(); - - await writeFile(indexPath, `// HACK:\n// HACK:\n// HACK:`); + await expect(async () => await readFile(cachePath)).rejects.toThrow(); const ciTestRun = await betterer({ configPaths, resultsPath, cachePath, ci: true, workers: false }); - expect(testNames(ciTestRun.worse)).toEqual(['test']); + expect(testNames(ciTestRun.same)).toEqual(['test']); const ciCache = await readFile(cachePath); - expect(ciCache).toEqual(newCache); + expect(ciCache).toMatchSnapshot(); expect(logs).toMatchSnapshot(); diff --git a/test/cache-deleted-file.spec.ts b/test/cache-deleted-file.spec.ts index 7de2bdb9d..4854033aa 100644 --- a/test/cache-deleted-file.spec.ts +++ b/test/cache-deleted-file.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should remove files from the cache when they are deleted', async () => { @@ -9,9 +10,9 @@ describe('betterer', () => { 'cache-deleted-file', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') }; ` diff --git a/test/cache-faster.spec.ts b/test/cache-faster.spec.ts index d90e8c5f8..b98744e5f 100644 --- a/test/cache-faster.spec.ts +++ b/test/cache-faster.spec.ts @@ -1,16 +1,17 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { - it(`actually makes shit faster`, async () => { + it(`actually goes faster with cache`, async () => { const { betterer } = await import('@betterer/betterer'); const { paths, cleanup, testNames } = await createFixture('cache-faster', { '.betterer.js': ` -const { BettererFileTest } = require('@betterer/betterer'); -const { promises: fs } = require('fs'); +import { BettererFileTest } from '@betterer/betterer'; +import { promises as fs } from 'node:fs'; -module.exports = { +export default { test: () => new BettererFileTest(async (filePaths, fileTestResult) => { await Promise.all( diff --git a/test/cache-obsolete.spec.ts b/test/cache-obsolete.spec.ts new file mode 100644 index 000000000..abe5bcd4d --- /dev/null +++ b/test/cache-obsolete.spec.ts @@ -0,0 +1,66 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should hold onto the cache for an obsolete test until it is removed', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('cache-obsolete', { + '.betterer.js': ` +import { regexp } from '@betterer/regexp'; + +export default { + test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') +}; + ` + }); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, `// HACK:\n// HACK:`); + + const newTestRun = await betterer({ configPaths, resultsPath, cachePath, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['test']); + + const newCache = await readFile(cachePath); + + expect(newCache).toMatchSnapshot(); + + await writeFile(indexPath, ``); + + const completedTestRun = await betterer({ configPaths, resultsPath, cachePath, workers: false }); + + expect(testNames(completedTestRun.completed)).toEqual(['test']); + + const completedCache = await readFile(cachePath); + + expect(completedCache).toMatchSnapshot(); + + await writeFile(paths.config, 'export default {}'); + + const obsoleteTestRun = await betterer({ configPaths, resultsPath, cachePath, workers: false }); + + expect(testNames(obsoleteTestRun.obsolete)).toEqual(['test']); + + const obsoleteCache = await readFile(cachePath); + + expect(obsoleteCache).toMatchSnapshot(); + + const removedTestRun = await betterer({ configPaths, resultsPath, cachePath, update: true, workers: false }); + + expect(testNames(removedTestRun.removed)).toEqual(['test']); + + const removedCache = await readFile(cachePath); + + expect(removedCache).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cache-path.spec.ts b/test/cache-path.spec.ts index e4fe9262c..a23c4387f 100644 --- a/test/cache-path.spec.ts +++ b/test/cache-path.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should write a cache file to a different path', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('cache-path', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') }; ` diff --git a/test/cache-precommit.spec.ts b/test/cache-precommit.spec.ts new file mode 100644 index 000000000..5112011cb --- /dev/null +++ b/test/cache-precommit.spec.ts @@ -0,0 +1,246 @@ +import { describe, expect, it } from 'vitest'; + +import { simpleGit } from 'simple-git'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should work with precommit', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, cleanup, resolve, writeFile } = await createFixture('cache-precommit', { + '.betterer.js': ` +import { regexp } from '@betterer/regexp'; +import { eslint } from '@betterer/eslint'; + +export default { + 'no enzyme tests': () => regexp(/from 'enzyme'/g).include('**/*.test.*'), + 'no explicit any': () => + eslint({ + rules: { + '@typescript-eslint/no-explicit-any': 'error', + } + }).include('**/*.{ts,tsx}'), + 'no type assertions': () => + eslint({ + rules: { + '@typescript-eslint/consistent-type-assertions': [ + 'error', + { + assertionStyle: 'never', + }, + ] + } + }).include('**/*.{ts,tsx}'), +}; + `, + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, + } +); + `, + 'tsconfig.json': ` +{ +"include": ["./src/**/*"] +} + `, + 'src/example.test.tsx': ` +import { mount, shallow } from 'enzyme'; +import React from 'react'; +import { act } from 'react-dom/test-utils'; + +import { QueryOperationRow } from './QueryOperationRow'; + +describe('QueryOperationRow', () => { + it('renders', () => { + expect(() => + shallow( + +
Test
+
+ ) + ).not.toThrow(); + }); + + describe('callbacks', () => { + it('should not call onOpen when component is shallowed', async () => { + const onOpenSpy = jest.fn(); + // @ts-ignore strict null error, you shouldn't use promise like approach with act but I don't know what the intention is here + await act(async () => { + shallow( + +
Test
+
+ ); + }); + expect(onOpenSpy).not.toBeCalled(); + }); + + it('should call onOpen when row is opened and onClose when row is collapsed', async () => { + const onOpenSpy = jest.fn(); + const onCloseSpy = jest.fn(); + const wrapper = mount( + +
Test
+
+ ); + const titleEl = wrapper.find({ 'aria-label': 'Query operation row title' }); + expect(titleEl).toHaveLength(1); + + // @ts-ignore strict null error, you shouldn't use promise like approach with act but I don't know what the intention is here + await act(async () => { + // open + titleEl.first().simulate('click'); + }); + + // @ts-ignore strict null error, you shouldn't use promise like approach with act but I don't know what the intention is here + await act(async () => { + // close + titleEl.first().simulate('click'); + }); + + expect(onOpenSpy).toBeCalledTimes(1); + expect(onCloseSpy).toBeCalledTimes(1); + }); + }); + + describe('headerElement rendering', () => { + it('should render headerElement provided as element', () => { + const title =
Test
; + const wrapper = mount( + +
Test
+
+ ); + + const titleEl = wrapper.find({ 'aria-label': 'test title' }); + expect(titleEl).toHaveLength(1); + }); + + it('should render headerElement provided as function', () => { + const title = () =>
Test
; + const wrapper = mount( + +
Test
+
+ ); + + const titleEl = wrapper.find({ 'aria-label': 'test title' }); + expect(titleEl).toHaveLength(1); + }); + + it('should expose api to headerElement rendered as function', () => { + const propsSpy = jest.fn(); + const title = (props: any) => { + propsSpy(props); + return
Test
; + }; + shallow( + +
Test
+
+ ); + + expect(Object.keys(propsSpy.mock.calls[0][0])).toContain('isOpen'); + }); + }); + + describe('actions rendering', () => { + it('should render actions provided as element', () => { + const actions =
Test
; + const wrapper = mount( + +
Test
+
+ ); + + const actionsEl = wrapper.find({ 'aria-label': 'test actions' }); + expect(actionsEl).toHaveLength(1); + }); + it('should render actions provided as function', () => { + const actions = () =>
Test
; + const wrapper = mount( + +
Test
+
+ ); + + const actionsEl = wrapper.find({ 'aria-label': 'test actions' }); + expect(actionsEl).toHaveLength(1); + }); + + it('should expose api to title rendered as function', () => { + const propsSpy = jest.fn(); + const actions = (props: any) => { + propsSpy(props); + return
Test
; + }; + shallow( + +
Test
+
+ ); + + expect(Object.keys(propsSpy.mock.calls[0][0])).toEqual(['isOpen', 'onOpen', 'onClose']); + }); + }); +}); +` + }); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + + const indexPath = resolve('./src/example.test.tsx'); + + await betterer({ configPaths, resultsPath, cachePath, workers: false }); + + const firstCache = await readFile(cachePath); + + expect(firstCache).toMatchSnapshot(); + + const firstResult = await readFile(resultsPath); + + expect(firstResult).toMatchSnapshot(); + + // Should bust the cache: + const indexContent = await readFile(indexPath); + await writeFile(indexPath, indexContent.replace(`import { mount, shallow } from 'enzyme';\n`, '')); + + await betterer({ configPaths, resultsPath, cachePath, workers: false, precommit: true, repoPath: './' }); + + const nextCache = await readFile(cachePath); + + expect(nextCache).toMatchSnapshot(); + + const nextResult = await readFile(resultsPath); + + expect(nextResult).toMatchSnapshot(); + + expect(firstCache).not.toEqual(nextCache); + + expect(logs).toMatchSnapshot(); + + const git = simpleGit(); + + await git.reset([resultsPath]); + + await cleanup(); + }); +}); diff --git a/test/cache-worse.spec.ts b/test/cache-worse.spec.ts index 8282f1ee7..e14116d21 100644 --- a/test/cache-worse.spec.ts +++ b/test/cache-worse.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it(`doesn't cache if a test gets worse`, async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('cache-worse', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') }; ` diff --git a/test/cache.spec.ts b/test/cache.spec.ts index 8dc6dc5ad..29f215421 100644 --- a/test/cache.spec.ts +++ b/test/cache.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should write a cache file', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('cache', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') }; ` diff --git a/test/cli/__snapshots__/ci-changes.spec.ts.snap b/test/cli/__snapshots__/ci-changes.spec.ts.snap new file mode 100644 index 000000000..c0060bcb2 --- /dev/null +++ b/test/cli/__snapshots__/ci-changes.spec.ts.snap @@ -0,0 +1,44 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer ci > should throw an error when a test changes 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (1 issue) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/ci-worse/src/index.ts". +・ +・ 2 | const one = 1; +・ 3 | console.log(one * a); +・ > 4 | console.log(a * one); +・ | ^ tsc: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + + +Unexpected changes detected in these tests while running in CI mode: + + "test" + +You should make sure the results file is up-to-date before committing! + +Check out some suggestions to improve your workflow in the docs: + + Workflow Documentation +", +] +`; diff --git a/test/cli/__snapshots__/ci-complete.spec.ts.snap b/test/cli/__snapshots__/ci-complete.spec.ts.snap index dc2c96898..5162e1b9e 100644 --- a/test/cli/__snapshots__/ci-complete.spec.ts.snap +++ b/test/cli/__snapshots__/ci-complete.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer ci should work when a test is already complete 1`] = ` +exports[`betterer ci > should work when a test is already complete 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,37 +8,38 @@ exports[`betterer ci should work when a test is already complete 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:1499252024\\": [ - [2, 12, 1, \\"The left-hand side of an arithmetic operation must be of type \\\\'any\\\\', \\\\'number\\\\', \\\\'bigint\\\\' or an enum type.\\", \\"177604\\"] + "src/index.ts:1499252024": [ + [2, 12, 1, "tsc: The left-hand side of an arithmetic operation must be of type \\'any\\', \\'number\\', \\'bigint\\' or an enum type.", "177604"] ] }\` }; " `; -exports[`betterer ci should work when a test is already complete 2`] = ` +exports[`betterer ci > should work when a test is already complete 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: // https://phenomnomnominal.github.io/betterer/docs/results-file/#merge -//" +// +exports[\`test\`] = { + value: \`{}\` +}; +" `; -exports[`betterer ci should work when a test is already complete 3`] = ` -Array [ +exports[`betterer ci > should work when a test is already complete 3`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -46,34 +47,22 @@ Array [ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" met its goal! 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/ci-complete/src/index.ts". ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" met its goal! 🎉 +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/ci-complete/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 1 test met its goal! 🎉 ", - "🌟 Betterer: -", - "🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer: 1 test running... -✅ test: \\"test\\" has already met its goal! ✨ -", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ -", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" has already met its goal! ✨ + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" has already met its goal! ✨ 1 test got checked. 🤔 1 test met its goal! 🎉 @@ -81,10 +70,14 @@ Array [ ] `; -exports[`betterer ci should work when a test is already complete 4`] = ` +exports[`betterer ci > should work when a test is already complete 4`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: // https://phenomnomnominal.github.io/betterer/docs/results-file/#merge -//" +// +exports[\`test\`] = { + value: \`{}\` +}; +" `; diff --git a/test/cli/__snapshots__/ci-diff.spec.ts.snap b/test/cli/__snapshots__/ci-diff.spec.ts.snap index 99912929c..39a7af51e 100644 --- a/test/cli/__snapshots__/ci-diff.spec.ts.snap +++ b/test/cli/__snapshots__/ci-diff.spec.ts.snap @@ -1,46 +1,33 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer ci should add a diff to the suiteSummary if there is any change to the results file 1`] = ` -Array [ +exports[`betterer ci > should add a diff to the suiteSummary if there is any change to the results file 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", - "🌟 Betterer: -", - "🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer: 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 -", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 -", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 -Unexpected changes detected in these tests while running in CI mode: +All test results stayed the same, but your code has changed in other ways! +You should make sure the results file is up-to-date before committing, and also after a rebase! 🔃 - \\"test\\" +Check out some suggestions to improve your workflow in the docs: -You should make sure the results file is up-to-date before committing! You might want to run \`betterer precommit\` in a commit hook. 💍 + Workflow Documentation ", ] `; diff --git a/test/cli/__snapshots__/ci-env-variable.spec.ts.snap b/test/cli/__snapshots__/ci-env-variable.spec.ts.snap index 9eec4048e..4506c0f4d 100644 --- a/test/cli/__snapshots__/ci-env-variable.spec.ts.snap +++ b/test/cli/__snapshots__/ci-env-variable.spec.ts.snap @@ -1,46 +1,33 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer ci should work with \`start\` and the CI env variable 1`] = ` -Array [ +exports[`betterer ci > should work with \`start\` and the CI env variable 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", - "🌟 Betterer: -", - "🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer: 1 test running... -✅ test: \\"test\\" stayed the same. (1 issue) 😐 -", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 -", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" stayed the same. (1 issue) 😐 + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (1 issue) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 -Unexpected changes detected in these tests while running in CI mode: +All test results stayed the same, but your code has changed in other ways! +You should make sure the results file is up-to-date before committing, and also after a rebase! 🔃 - \\"test\\" +Check out some suggestions to improve your workflow in the docs: -You should make sure the results file is up-to-date before committing! You might want to run \`betterer precommit\` in a commit hook. 💍 + Workflow Documentation ", ] `; diff --git a/test/cli/__snapshots__/ci-failure.spec.ts.snap b/test/cli/__snapshots__/ci-failure.spec.ts.snap new file mode 100644 index 000000000..c8ca10c96 --- /dev/null +++ b/test/cli/__snapshots__/ci-failure.spec.ts.snap @@ -0,0 +1,14 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer ci > should throw an error when a test fails 1`] = ` +[ + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 throws: + +Error: + +0 tests got checked. 🤔 +1 test failed to run. 🔥 +", +] +`; diff --git a/test/cli/__snapshots__/ci-worse.spec.ts.snap b/test/cli/__snapshots__/ci-worse.spec.ts.snap deleted file mode 100644 index fd136b5e5..000000000 --- a/test/cli/__snapshots__/ci-worse.spec.ts.snap +++ /dev/null @@ -1,74 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer ci should work when a test gets worse 1`] = ` -Array [ - "🌟 Betterer (0ms): -", - "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 -", - "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 - -1 test got checked. 🤔 -1 test got checked for the first time! 🎉 -", - "🌟 Betterer: -", - "🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer: 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "🌟 Betterer: 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "💥 Betterer: 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/ci-worse/src/index.ts\\". -・ New issue in \\"/fixtures/ci-worse/src/index.ts\\"! -・ -・ /fixtures/ci-worse/src/index.ts -・ 2 | const one = 1; -・ 3 | console.log(one * a); -・ > 4 | console.log(a * one); -・ | ^ The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. -・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 -", - "💥 Betterer: 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/ci-worse/src/index.ts\\". -・ New issue in \\"/fixtures/ci-worse/src/index.ts\\"! -・ -・ /fixtures/ci-worse/src/index.ts -・ 2 | const one = 1; -・ 3 | console.log(one * a); -・ > 4 | console.log(a * one); -・ | ^ The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. -・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -1 test got checked. 🤔 -1 test got worse. 😔 - - -Unexpected changes detected in these tests while running in CI mode: - - \\"test\\" - -You should make sure the results file is up-to-date before committing! You might want to run \`betterer precommit\` in a commit hook. 💍 -", -] -`; diff --git a/test/cli/__snapshots__/filter-negative.spec.ts.snap b/test/cli/__snapshots__/filter-negative.spec.ts.snap index ccb180015..9ba3a4b37 100644 --- a/test/cli/__snapshots__/filter-negative.spec.ts.snap +++ b/test/cli/__snapshots__/filter-negative.spec.ts.snap @@ -1,18 +1,18 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should filter tests by name with negation 1`] = ` -Array [ +exports[`betterer cli > should filter tests by name with negation 1`] = ` +[ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! 🎉 3 tests got checked. 🤔 3 tests got checked for the first time! 🎉 @@ -20,14 +20,14 @@ Array [ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" got skipped. 🚫 -✅ test 2: \\"test 2\\" stayed the same. 😐 -✅ test 3: \\"test 3\\" stayed the same. 😐 +✅ test 1: "test 1" got skipped. 🚫 +✅ test 2: "test 2" stayed the same. 😐 +✅ test 3: "test 3" stayed the same. 😐 ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" got skipped. 🚫 -✅ test 2: \\"test 2\\" stayed the same. 😐 -✅ test 3: \\"test 3\\" stayed the same. 😐 +✅ test 1: "test 1" got skipped. 🚫 +✅ test 2: "test 2" stayed the same. 😐 +✅ test 3: "test 3" stayed the same. 😐 2 tests got checked. 🤔 2 tests stayed the same. 😐 @@ -36,14 +36,14 @@ Array [ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" got skipped. 🚫 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" got skipped. 🚫 ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" got skipped. 🚫 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" got skipped. 🚫 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/cli/__snapshots__/filter.spec.ts.snap b/test/cli/__snapshots__/filter.spec.ts.snap index c73a50efa..172879fc3 100644 --- a/test/cli/__snapshots__/filter.spec.ts.snap +++ b/test/cli/__snapshots__/filter.spec.ts.snap @@ -1,18 +1,18 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should filter tests by name 1`] = ` -Array [ +exports[`betterer cli > should filter tests by name 1`] = ` +[ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 -✅ test 2: \\"test 2\\" got checked for the first time! 🎉 -✅ test 3: \\"test 3\\" got checked for the first time! 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 +✅ test 2: "test 2" got checked for the first time! 🎉 +✅ test 3: "test 3" got checked for the first time! 🎉 3 tests got checked. 🤔 3 tests got checked for the first time! 🎉 @@ -20,14 +20,14 @@ Array [ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" got skipped. 🚫 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" got skipped. 🚫 ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" got skipped. 🚫 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" got skipped. 🚫 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -36,14 +36,14 @@ Array [ "🌟 Betterer (0ms): ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" stayed the same. 😐 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" stayed the same. 😐 ", "🎉 Betterer (0ms): 3 tests done! -✅ test 1: \\"test 1\\" stayed the same. 😐 -✅ test 2: \\"test 2\\" got skipped. 🚫 -✅ test 3: \\"test 3\\" stayed the same. 😐 +✅ test 1: "test 1" stayed the same. 😐 +✅ test 2: "test 2" got skipped. 🚫 +✅ test 3: "test 3" stayed the same. 😐 2 tests got checked. 🤔 2 tests stayed the same. 😐 diff --git a/test/cli/__snapshots__/init-automerge-no-git.spec.ts.snap b/test/cli/__snapshots__/init-automerge-no-git.spec.ts.snap new file mode 100644 index 000000000..28b636c3f --- /dev/null +++ b/test/cli/__snapshots__/init-automerge-no-git.spec.ts.snap @@ -0,0 +1,23 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer cli > should enable automerge configuration without git 1`] = ` +[ + "💥 Initialising Betterer (0ms): 3 tasks done! 1 task errored! +✅ Create test file: done! +・ created "fixtures/init-automerge-no-git/.betterer.ts"! +✅ Update package.json: done! +🔥 Enable automerge: ".git" directory not found in "/". \`--automerge\` only works within a Git repository. + +Error: ".git" directory not found in "/". \`--automerge\` only works within a Git repository.", + "💥 Initialising Betterer (0ms): 3 tasks done! 1 task errored! +✅ Create test file: done! +・ created "fixtures/init-automerge-no-git/.betterer.ts"! +✅ Update package.json: done! +・ added "betterer" script to package.json file +・ added "@betterer/cli" dependency to package.json file +・ added "typescript" dependency to package.json file +🔥 Enable automerge: ".git" directory not found in "/". \`--automerge\` only works within a Git repository. + +Error: ".git" directory not found in "/". \`--automerge\` only works within a Git repository.", +] +`; diff --git a/test/cli/__snapshots__/init-automerge.spec.ts.snap b/test/cli/__snapshots__/init-automerge.spec.ts.snap new file mode 100644 index 000000000..364e8e9ad --- /dev/null +++ b/test/cli/__snapshots__/init-automerge.spec.ts.snap @@ -0,0 +1,26 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer cli > should enable automerge configuration 1`] = ` +"# Betterer merge +.betterer.results merge=betterer +" +`; + +exports[`betterer cli > should enable automerge configuration 2`] = ` +"[merge "betterer"] + driver = /packages/cli/bin/betterer.js merge %A %B +" +`; + +exports[`betterer cli > should enable automerge configuration 3`] = ` +"🎉 Initialising Betterer (0ms): 3 tasks done! +✅ Create test file: done! +・ created "fixtures/init-automerge/.betterer.ts"! +✅ Update package.json: done! +・ added "betterer" script to package.json file +・ added "@betterer/cli" dependency to package.json file +・ added "typescript" dependency to package.json file +✅ Enable automerge: done! +・ added Betterer merge config to "fixtures/init-automerge/.git/config"! +・ added Betterer merge attribute to "fixtures/init-automerge/.gitattributes"!" +`; diff --git a/test/cli/__snapshots__/init-js.spec.ts.snap b/test/cli/__snapshots__/init-js.spec.ts.snap index 5c6c623d9..94bb9d809 100644 --- a/test/cli/__snapshots__/init-js.spec.ts.snap +++ b/test/cli/__snapshots__/init-js.spec.ts.snap @@ -1,12 +1,16 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should initialise betterer in a repo with JS 1`] = ` -Array [ +exports[`betterer cli > should initialise betterer in a repo with JS 1`] = ` +[ "🎉 Initialising Betterer (0ms): 2 tasks done! ✅ Create test file: done! -・ created \\"/fixtures/init-js/.betterer.js\\"! +・ created "fixtures/init-js/.betterer.js"! +✅ Update package.json: done!", + "🎉 Initialising Betterer (0ms): 2 tasks done! +✅ Create test file: done! +・ created "fixtures/init-js/.betterer.js"! ✅ Update package.json: done! -・ added \\"betterer\\" script to package.json file. -・ added \\"@betterer/cli\\" dependency to package.json file", +・ added "betterer" script to package.json file +・ added "@betterer/cli" dependency to package.json file", ] `; diff --git a/test/cli/__snapshots__/init-mulitple.spec.ts.snap b/test/cli/__snapshots__/init-mulitple.spec.ts.snap deleted file mode 100644 index bac47ffc1..000000000 --- a/test/cli/__snapshots__/init-mulitple.spec.ts.snap +++ /dev/null @@ -1,20 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer cli should work multiple times 1`] = ` -Array [ - "🎉 Initialising Betterer (0ms): 2 tasks done! -✅ Create test file: done! -・ created \\"/fixtures/init-multiple/.betterer.ts\\"! -✅ Update package.json: done! -・ added \\"betterer\\" script to package.json file. -・ added \\"@betterer/cli\\" dependency to package.json file -・ added \\"typescript\\" dependency to package.json file", - "🎉 Initialising Betterer (0ms): 2 tasks done! -✅ Create test file: done! -・ \\"/fixtures/init-multiple/.betterer.ts\\" already exists, moving on... -✅ Update package.json: done! -・ \\"betterer\\" script already exists, moving on... -・ \\"@betterer/cli\\" dependency already exists, moving on... -・ \\"typescript\\" dependency already exists, moving on...", -] -`; diff --git a/test/cli/__snapshots__/init-multiple.spec.ts.snap b/test/cli/__snapshots__/init-multiple.spec.ts.snap new file mode 100644 index 000000000..6b94dea80 --- /dev/null +++ b/test/cli/__snapshots__/init-multiple.spec.ts.snap @@ -0,0 +1,28 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer cli > should work multiple times 1`] = ` +[ + "🎉 Initialising Betterer (0ms): 2 tasks done! +✅ Create test file: done! +・ created "fixtures/init-multiple/.betterer.ts"! +✅ Update package.json: done!", + "🎉 Initialising Betterer (0ms): 2 tasks done! +✅ Create test file: done! +・ created "fixtures/init-multiple/.betterer.ts"! +✅ Update package.json: done! +・ added "betterer" script to package.json file +・ added "@betterer/cli" dependency to package.json file +・ added "typescript" dependency to package.json file", + "🎉 Initialising Betterer (0ms): 2 tasks done! +✅ Create test file: done! +・ "fixtures/init-multiple/.betterer.ts" already exists, moving on... +✅ Update package.json: done!", + "🎉 Initialising Betterer (0ms): 2 tasks done! +✅ Create test file: done! +・ "fixtures/init-multiple/.betterer.ts" already exists, moving on... +✅ Update package.json: done! +・ "betterer" script already exists, moving on... +・ "@betterer/cli" dependency already exists, moving on... +・ "typescript" dependency already exists, moving on...", +] +`; diff --git a/test/cli/__snapshots__/init-ts.spec.ts.snap b/test/cli/__snapshots__/init-ts.spec.ts.snap index a970963a3..4fb2557e4 100644 --- a/test/cli/__snapshots__/init-ts.spec.ts.snap +++ b/test/cli/__snapshots__/init-ts.spec.ts.snap @@ -1,13 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should initialise betterer in a repo with TS 1`] = ` -Array [ +exports[`betterer cli > should initialise betterer in a repo with TS 1`] = ` +[ "🎉 Initialising Betterer (0ms): 2 tasks done! ✅ Create test file: done! -・ created \\"/fixtures/init-ts/.betterer.ts\\"! +・ created "fixtures/init-ts/.betterer.ts"! +✅ Update package.json: done!", + "🎉 Initialising Betterer (0ms): 2 tasks done! +✅ Create test file: done! +・ created "fixtures/init-ts/.betterer.ts"! ✅ Update package.json: done! -・ added \\"betterer\\" script to package.json file. -・ added \\"@betterer/cli\\" dependency to package.json file -・ added \\"typescript\\" dependency to package.json file", +・ added "betterer" script to package.json file +・ added "@betterer/cli" dependency to package.json file +・ added "typescript" dependency to package.json file", ] `; diff --git a/test/cli/__snapshots__/logo-show.spec.ts.snap b/test/cli/__snapshots__/logo-show.spec.ts.snap index a09db94ac..0745fc627 100644 --- a/test/cli/__snapshots__/logo-show.spec.ts.snap +++ b/test/cli/__snapshots__/logo-show.spec.ts.snap @@ -1,20 +1,17 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should show the logo 1`] = ` -Array [ +exports[`betterer cli > should show the logo 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test 1: running \\"test 1\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 +🤔 test 1: running "test 1"! ", "🎉 Betterer (0ms): 1 test done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test 1: \\"test 1\\" got checked for the first time! 🎉 +✅ test 1: "test 1" got checked for the first time! 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 @@ -43,17 +40,7 @@ Array [ / | / |_.__//___|/__|/__/___|_| /___|_| 🌟 Betterer (0ms): 1 test running... -🤔 test 1: running \\"test 1\\"! -", - " - / | / _ _ _ - '-.ooo.-' | |__ ___| |_| |_ ___ _ __ ___ _ __ ----ooooo--- | '_ // _ / __| __/ _ / '__/ _ / '__| - .-'ooo'-. | |_)| __/ |_| || __/ | | __/ | - / | / |_.__//___|/__|/__/___|_| /___|_| - -🌟 Betterer (0ms): 1 test running... -✅ test 1: \\"test 1\\" stayed the same. 😐 +🤔 test 1: running "test 1"! ", " / | / _ _ _ @@ -63,7 +50,7 @@ Array [ / | / |_.__//___|/__|/__/___|_| /___|_| 🎉 Betterer (0ms): 1 test done! -✅ test 1: \\"test 1\\" stayed the same. 😐 +✅ test 1: "test 1" stayed the same. 😐 ", " / | / _ _ _ @@ -73,7 +60,7 @@ Array [ / | / |_.__//___|/__|/__/___|_| /___|_| 🎉 Betterer (0ms): 1 test done! -✅ test 1: \\"test 1\\" stayed the same. 😐 +✅ test 1: "test 1" stayed the same. 😐 1 test got checked. 🤔 1 test stayed the same. 😐 diff --git a/test/cli/__snapshots__/merge-contents.spec.ts.snap b/test/cli/__snapshots__/merge-contents.spec.ts.snap index 9732d4c36..7435934bf 100644 --- a/test/cli/__snapshots__/merge-contents.spec.ts.snap +++ b/test/cli/__snapshots__/merge-contents.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should merge the given contents 1`] = ` +exports[`betterer cli > should merge the given contents 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,8 +8,8 @@ exports[`betterer cli should merge the given contents 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:913095150\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:913095150": [ + [0, 0, 11, "TSQuery match", "3870399096"] ] }\` }; diff --git a/test/cli/__snapshots__/merge-path.spec.ts.snap b/test/cli/__snapshots__/merge-path.spec.ts.snap index ded5dbd59..0dc7f50b4 100644 --- a/test/cli/__snapshots__/merge-path.spec.ts.snap +++ b/test/cli/__snapshots__/merge-path.spec.ts.snap @@ -1,6 +1,6 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should merge the results file 1`] = ` +exports[`betterer cli > should merge the results file 1`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -8,15 +8,15 @@ exports[`betterer cli should merge the results file 1`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:913095150\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:913095150": [ + [0, 0, 11, "TSQuery match", "3870399096"] ] }\` }; " `; -exports[`betterer cli should merge the results file 2`] = ` +exports[`betterer cli > should merge the results file 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -24,8 +24,8 @@ exports[`betterer cli should merge the results file 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/index.ts:913095150\\": [ - [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + "src/index.ts:913095150": [ + [0, 0, 11, "TSQuery match", "3870399096"] ] }\` }; diff --git a/test/cli/__snapshots__/precommit-add.spec.ts.snap b/test/cli/__snapshots__/precommit-add.spec.ts.snap index bcd1cbd21..ea0d1ae27 100644 --- a/test/cli/__snapshots__/precommit-add.spec.ts.snap +++ b/test/cli/__snapshots__/precommit-add.spec.ts.snap @@ -1,37 +1,33 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer precommit should add the results file to the changeset if there is any change to the results file 1`] = ` -Array [ +exports[`betterer precommit > should add the results file to the changeset if there is any change to the results file 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", - "🌟 Betterer: -", - "🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! + "🌟 Betterer (0ms): ", - "🌟 Betterer: 1 test running... -✅ test: \\"test\\" met its goal! 🎉 + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! ", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" met its goal! 🎉 + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/precommit-add/src/index.ts". ", - "🎉 Betterer: 1 test done! -✅ test: \\"test\\" met its goal! 🎉 + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 +・ 1 fixed issue in "fixtures/precommit-add/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 @@ -40,4 +36,4 @@ Array [ ] `; -exports[`betterer precommit should add the results file to the changeset if there is any change to the results file 2`] = `"fixtures/precommit-add/.betterer.results"`; +exports[`betterer precommit > should add the results file to the changeset if there is any change to the results file 2`] = `"fixtures/precommit-add/.betterer.results"`; diff --git a/test/cli/__snapshots__/precommit-failure.spec.ts.snap b/test/cli/__snapshots__/precommit-failure.spec.ts.snap new file mode 100644 index 000000000..39a8bbfb2 --- /dev/null +++ b/test/cli/__snapshots__/precommit-failure.spec.ts.snap @@ -0,0 +1,22 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer precommit > should not update the changeset when a test fails 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 throws: running "throws"! +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 throws: +", + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 throws: + +Error: + +0 tests got checked. 🤔 +1 test failed to run. 🔥 +", +] +`; diff --git a/test/cli/__snapshots__/precommit-specific-file.spec.ts.snap b/test/cli/__snapshots__/precommit-specific-file.spec.ts.snap index 6fd17c64b..efb26c458 100644 --- a/test/cli/__snapshots__/precommit-specific-file.spec.ts.snap +++ b/test/cli/__snapshots__/precommit-specific-file.spec.ts.snap @@ -1,57 +1,47 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer precommit should test just the specified files 1`] = ` -Array [ +exports[`betterer precommit > should test just the specified files 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", "Checking 1 file... 🤔 -・ /fixtures/precommit-specific-file/src/new-file.ts - -🌟 Betterer: -", - "Checking 1 file... 🤔 - -・ /fixtures/precommit-specific-file/src/new-file.ts +・ fixtures/precommit-specific-file/src/new-file.ts -🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! +🌟 Betterer (0ms): ", "Checking 1 file... 🤔 -・ /fixtures/precommit-specific-file/src/new-file.ts +・ fixtures/precommit-specific-file/src/new-file.ts -🌟 Betterer: 1 test running... -✅ test: \\"test\\" stayed the same. (3 issues) 😐 +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! ", "Checking 1 file... 🤔 -・ /fixtures/precommit-specific-file/src/new-file.ts +・ fixtures/precommit-specific-file/src/new-file.ts -🎉 Betterer: 1 test done! -✅ test: \\"test\\" stayed the same. (3 issues) 😐 +🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (3 issues) 😐 ", "Checked 1 file! 🔍 -・ /fixtures/precommit-specific-file/src/new-file.ts +・ fixtures/precommit-specific-file/src/new-file.ts -🎉 Betterer: 1 test done! -✅ test: \\"test\\" stayed the same. (3 issues) 😐 +🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (3 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 @@ -59,7 +49,7 @@ Array [ ] `; -exports[`betterer precommit should test just the specified files 2`] = ` +exports[`betterer precommit > should test just the specified files 2`] = ` "// BETTERER RESULTS V2. // // If this file contains merge conflicts, use \`betterer merge\` to automatically resolve them: @@ -67,18 +57,18 @@ exports[`betterer precommit should test just the specified files 2`] = ` // exports[\`test\`] = { value: \`{ - \\"src/existing-file-1.ts:3201740415\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/existing-file-1.ts:3201740415": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/existing-file-2.ts:3201740415\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/existing-file-2.ts:3201740415": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ], - \\"src/new-file.ts:3201740415\\": [ - [0, 0, 9, \\"Unexpected \\\\'debugger\\\\' statement.\\", \\"3201740415\\"] + "src/new-file.ts:3201740415": [ + [0, 0, 9, "eslint(no-debugger): Unexpected \\'debugger\\' statement.", "3201740415"] ] }\` }; " `; -exports[`betterer precommit should test just the specified files 3`] = `undefined`; +exports[`betterer precommit > should test just the specified files 3`] = `undefined`; diff --git a/test/cli/__snapshots__/precommit-worse.spec.ts.snap b/test/cli/__snapshots__/precommit-worse.spec.ts.snap index f18d83a5f..5b1485403 100644 --- a/test/cli/__snapshots__/precommit-worse.spec.ts.snap +++ b/test/cli/__snapshots__/precommit-worse.spec.ts.snap @@ -1,65 +1,46 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer precommit should not update the changeset when a test gets worse 1`] = ` -Array [ +exports[`betterer precommit > should not update the changeset when a test gets worse 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", - "🌟 Betterer: -", - "🌟 Betterer: 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer: 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 + "🌟 Betterer (0ms): ", - "🌟 Betterer: 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! ", - "💥 Betterer: 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/precommit-worse/src/index.ts\\". -・ New issue in \\"/fixtures/precommit-worse/src/index.ts\\"! + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/precommit-worse/src/index.ts". ・ -・ /fixtures/precommit-worse/src/index.ts ・ 2 | const one = 1; ・ 3 | console.log(one * a); ・ > 4 | console.log(a * one); -・ | ^ The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. +・ | ^ tsc: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. ・ - -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 ", - "💥 Betterer: 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 2 total) 😔 -・ 1 existing issue in \\"/fixtures/precommit-worse/src/index.ts\\". -・ New issue in \\"/fixtures/precommit-worse/src/index.ts\\"! + "💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 existing, 1 new issues in "fixtures/precommit-worse/src/index.ts". ・ -・ /fixtures/precommit-worse/src/index.ts ・ 2 | const one = 1; ・ 3 | console.log(one * a); ・ > 4 | console.log(a * one); -・ | ^ The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. +・ | ^ tsc: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type. ・ -Error: \\"test\\" got worse. (1 new issue, 2 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 diff --git a/test/cli/__snapshots__/results-file-test.spec.ts.snap b/test/cli/__snapshots__/results-file-test.spec.ts.snap index 2790aaf0a..c984ee5d0 100644 --- a/test/cli/__snapshots__/results-file-test.spec.ts.snap +++ b/test/cli/__snapshots__/results-file-test.spec.ts.snap @@ -1,11 +1,11 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should report the current results for a file test 1`] = ` -Array [ +exports[`betterer cli > should report the current results for a file test 1`] = ` +[ "test: - RegExp match - /fixtures/results-file-test/src/file-with-issue.ts:1:0 - RegExp match - /fixtures/results-file-test/src/file-with-issues.ts:1:0 - RegExp match - /fixtures/results-file-test/src/file-with-issues.ts:2:0", + RegExp match - fixtures/results-file-test/src/file-with-issue.ts:1:0 + RegExp match - fixtures/results-file-test/src/file-with-issues.ts:1:0 + RegExp match - fixtures/results-file-test/src/file-with-issues.ts:2:0", ] `; diff --git a/test/cli/__snapshots__/results-test.spec.ts.snap b/test/cli/__snapshots__/results-test.spec.ts.snap index d7f923f5d..7d97d1e82 100644 --- a/test/cli/__snapshots__/results-test.spec.ts.snap +++ b/test/cli/__snapshots__/results-test.spec.ts.snap @@ -1,7 +1,7 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer cli should report the current results for a test 1`] = ` -Array [ +exports[`betterer cli > should report the current results for a test 1`] = ` +[ "test: 1 ", ] diff --git a/test/cli/__snapshots__/upgrade-exported-constant-built-in-cjs.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-built-in-cjs.spec.ts.snap new file mode 100644 index 000000000..aff8a4eee --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-built-in-cjs.spec.ts.snap @@ -0,0 +1,26 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant built-in tests in a CommonJS module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - const { regexp } = require('@betterer/regexp'); +・ + const { regexp } = require("@betterer/regexp"); +・ +・ - module.exports.noHack = regexp(/HACK/i).include('**/*.ts'); +・ + module.exports.noHack = () => regexp(/HACK/i).include("**/*.ts"); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-built-in-esm.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-built-in-esm.spec.ts.snap new file mode 100644 index 000000000..2a1978d40 --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-built-in-esm.spec.ts.snap @@ -0,0 +1,26 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant built-in tests in an ES module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - import { regexp } from '@betterer/regexp'; +・ + import { regexp } from "@betterer/regexp"; +・ +・ - export const noHack = regexp(/HACK/i).include('**/*.ts'); +・ + export const noHack = () => regexp(/HACK/i).include("**/*.ts"); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-file-test-cjs.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-file-test-cjs.spec.ts.snap new file mode 100644 index 000000000..cedcba136 --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-file-test-cjs.spec.ts.snap @@ -0,0 +1,35 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant file tests in a CommonJS module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - const { BettererFileTest } = require('@betterer/betterer'); +・ + const { BettererFileTest } = require("@betterer/betterer"); +・ +・ - module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + module.exports.countFiles = () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }); +・ + }); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-file-test-esm.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-file-test-esm.spec.ts.snap new file mode 100644 index 000000000..aac3503f8 --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-file-test-esm.spec.ts.snap @@ -0,0 +1,35 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant file tests in an ES module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - import { BettererFileTest } from '@betterer/betterer'; +・ + import { BettererFileTest } from "@betterer/betterer"; +・ +・ - export const countFiles = new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + export const countFiles = () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }); +・ + }); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-file-test-include-cjs.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-file-test-include-cjs.spec.ts.snap new file mode 100644 index 000000000..175e5037f --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-file-test-include-cjs.spec.ts.snap @@ -0,0 +1,35 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant file tests with include in a CommonJS module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - const { BettererFileTest } = require('@betterer/betterer'); +・ + const { BettererFileTest } = require("@betterer/betterer"); +・ +・ - module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + module.exports.countFiles = () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }).include('./src/**/*.ts'); +・ + }).include("./src/**/*.ts"); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-file-test-include-esm.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-file-test-include-esm.spec.ts.snap new file mode 100644 index 000000000..5a872ed09 --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-file-test-include-esm.spec.ts.snap @@ -0,0 +1,35 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant file tests with include in an ES module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - import { BettererFileTest } from '@betterer/betterer'; +・ + import { BettererFileTest } from "@betterer/betterer"; +・ +・ - export const countFiles = new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + export const countFiles = () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }).include('./src/**/*.ts'); +・ + }).include("./src/**/*.ts"); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-object-cjs.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-object-cjs.spec.ts.snap new file mode 100644 index 000000000..f288e87ff --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-object-cjs.spec.ts.snap @@ -0,0 +1,36 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant objects in a CommonJS module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - const { bigger } = require('@betterer/constraints'); +・ + const { BettererTest } = require("@betterer/betterer"); +・ + const { bigger } = require("@betterer/constraints"); +・ +・ let start = 0; +・ +・ - module.exports.getsBetter = { +・ + module.exports.getsBetter = () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }; +・ + constraint: bigger, +・ + }); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-object-esm.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-object-esm.spec.ts.snap new file mode 100644 index 000000000..7d5970237 --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-object-esm.spec.ts.snap @@ -0,0 +1,36 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant objects in an ES module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - import { bigger } from '@betterer/constraints'; +・ + import { BettererTest } from "@betterer/betterer"; +・ + import { bigger } from "@betterer/constraints"; +・ +・ let start = 0; +・ +・ - export const getsBetter = { +・ + export const getsBetter = () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }; +・ + constraint: bigger, +・ + }); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-test-cjs.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-test-cjs.spec.ts.snap new file mode 100644 index 000000000..6e358ab50 --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-test-cjs.spec.ts.snap @@ -0,0 +1,37 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant tests in a CommonJS module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - const { BettererTest } = require('@betterer/betterer'); +・ + const { BettererTest } = require("@betterer/betterer"); +・ - const { bigger } = require('@betterer/constraints'); +・ + const { bigger } = require("@betterer/constraints"); +・ +・ let start = 0; +・ +・ - module.exports.getsBetter = new BettererTest({ +・ + module.exports.getsBetter = () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }); +・ + constraint: bigger, +・ + }); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-constant-test-esm.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-constant-test-esm.spec.ts.snap new file mode 100644 index 000000000..6c20a6ecb --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-constant-test-esm.spec.ts.snap @@ -0,0 +1,37 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported constant tests in an ES module 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - import { BettererTest } from '@betterer/betterer'; +・ + import { BettererTest } from "@betterer/betterer"; +・ - import { bigger } from '@betterer/constraints'; +・ + import { bigger } from "@betterer/constraints"; +・ +・ let start = 0; +・ +・ - export const getsBetter = new BettererTest({ +・ + export const getsBetter = () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }); +・ + constraint: bigger, +・ + }); +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-default-test-cjs.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-default-test-cjs.spec.ts.snap new file mode 100644 index 000000000..bba9d6f4c --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-default-test-cjs.spec.ts.snap @@ -0,0 +1,109 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported default test in a CJS module 1`] = ` +"const { BettererTest, BettererFileTest } = require("@betterer/betterer"); +const { bigger } = require("@betterer/constraints"); + +let start = 0; + +module.exports = { + getsBetter: () => + new BettererTest({ + test: () => start++, + constraint: bigger, + }), + "gets better": () => + new BettererTest({ + test: () => start++, + constraint: bigger, + }), + countFiles: () => + new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ""); + file.addIssue(0, 0, "\`$" + "{key}\`"); + }), + "count files": () => + new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ""); + file.addIssue(0, 0, "\`$" + "{key}\`"); + }).include("./src/**/*.ts"), +}; +" +`; + +exports[`betterer upgrade > should upgrade exported default test in a CJS module 2`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - const { BettererTest, BettererFileTest } = require('@betterer/betterer'); +・ + const { BettererTest, BettererFileTest } = require("@betterer/betterer"); +・ - const { bigger } = require('@betterer/constraints'); +・ + const { bigger } = require("@betterer/constraints"); +・ +・ let start = 0; +・ +・ module.exports = { +・ - getsBetter: { +・ + getsBetter: () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }, +・ + constraint: bigger, +・ + }), +・ - 'gets better': new BettererTest({ +・ + "gets better": () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }), +・ + constraint: bigger, +・ + }), +・ - countFiles: new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + countFiles: () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }), +・ + }), +・ - 'count files': new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + "count files": () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }).include('./src/**/*.ts') +・ - } +・ + }).include("./src/**/*.ts"), +・ + }; +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ Saved upgraded config to "fixtures/upgrade-exported-default-test-cjs/.betterer.ts"! ☀️", +] +`; diff --git a/test/cli/__snapshots__/upgrade-exported-default-test-esm.spec.ts.snap b/test/cli/__snapshots__/upgrade-exported-default-test-esm.spec.ts.snap new file mode 100644 index 000000000..2b5a4e2ef --- /dev/null +++ b/test/cli/__snapshots__/upgrade-exported-default-test-esm.spec.ts.snap @@ -0,0 +1,109 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should upgrade exported default test in an ES module 1`] = ` +"import { BettererTest, BettererFileTest } from "@betterer/betterer"; +import { bigger } from "@betterer/constraints"; + +let start = 0; + +export default { + getsBetter: () => + new BettererTest({ + test: () => start++, + constraint: bigger, + }), + "gets better": () => + new BettererTest({ + test: () => start++, + constraint: bigger, + }), + countFiles: () => + new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ""); + file.addIssue(0, 0, "\`$" + "{key}\`"); + }), + "count files": () => + new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ""); + file.addIssue(0, 0, "\`$" + "{key}\`"); + }).include("./src/**/*.ts"), +}; +" +`; + +exports[`betterer upgrade > should upgrade exported default test in an ES module 2`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ +・ Betterer can upgrade your test definition file automatically! ✨ +・ Here's what the changes will look like: +・ +・ - Before +・ + After +・ +・ - import { BettererTest, BettererFileTest } from '@betterer/betterer'; +・ + import { BettererTest, BettererFileTest } from "@betterer/betterer"; +・ - import { bigger } from '@betterer/constraints'; +・ + import { bigger } from "@betterer/constraints"; +・ +・ let start = 0; +・ +・ export default { +・ - getsBetter: { +・ + getsBetter: () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }, +・ + constraint: bigger, +・ + }), +・ - 'gets better': new BettererTest({ +・ + "gets better": () => +・ + new BettererTest({ +・ - test: () => start++, +・ + test: () => start++, +・ - constraint: bigger +・ - }), +・ + constraint: bigger, +・ + }), +・ - countFiles: new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + countFiles: () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }), +・ + }), +・ - 'count files': new BettererFileTest(async (files, fileTestResult) => { +・ - const [filePath] = files; +・ + "count files": () => +・ + new BettererFileTest(async (files, fileTestResult) => { +・ + const [filePath] = files; +・ - const file = fileTestResult.addFile(filePath, ''); +・ + const file = fileTestResult.addFile(filePath, ""); +・ - file.addIssue(0, 0, '\`$' + '{key}\`'); +・ + file.addIssue(0, 0, "\`$" + "{key}\`"); +・ - }).include('./src/**/*.ts') +・ - } +・ + }).include("./src/**/*.ts"), +・ + }; +・ + +・ +・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 +・", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ Saved upgraded config to "fixtures/upgrade-exported-default-test-esm/.betterer.ts"! ☀️", +] +`; diff --git a/test/cli/__snapshots__/upgrade-unknown.spec.ts.snap b/test/cli/__snapshots__/upgrade-unknown.spec.ts.snap new file mode 100644 index 000000000..ff77ec9e4 --- /dev/null +++ b/test/cli/__snapshots__/upgrade-unknown.spec.ts.snap @@ -0,0 +1,11 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer upgrade > should doesn't change things it doesn't need to change 1`] = ` +[ + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done!", + "🎉 Upgrading Betterer (0ms): 1 task done! +✅ Upgrading "./.betterer.ts": done! +・ Nothing to upgrade!", +] +`; diff --git a/test/cli/__snapshots__/upgrade.spec.ts.snap b/test/cli/__snapshots__/upgrade.spec.ts.snap deleted file mode 100644 index 05faf6e1a..000000000 --- a/test/cli/__snapshots__/upgrade.spec.ts.snap +++ /dev/null @@ -1,509 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer upgrade should doesn't change things it doesn't need to change 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ Nothing to upgrade!", -] -`; - -exports[`betterer upgrade should upgrade exported constant built-in tests in a CommonJS module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ const { regexp } = require('@betterer/regexp'); -・ -・ - module.exports.noHack = regexp(/HACK/i).include('**/*.ts'); -・ + module.exports.noHack = () => regexp(/HACK/i).include('**/*.ts'); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant built-in tests in an ES module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ import { regexp } from '@betterer/regexp'; -・ -・ - export const noHack = regexp(/HACK/i).include('**/*.ts'); -・ + export const noHack = () => regexp(/HACK/i).include('**/*.ts'); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant file tests in a CommonJS module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ const { BettererFileTest } = require('@betterer/betterer'); -・ -・ - module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + module.exports.countFiles = () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }); -・ + }); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant file tests in an ES module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ import { BettererFileTest } from '@betterer/betterer'; -・ -・ - export const countFiles = new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + export const countFiles = () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }); -・ + }); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant file tests with include in a CommonJS module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ const { BettererFileTest } = require('@betterer/betterer'); -・ -・ - module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + module.exports.countFiles = () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }).include('./src/**/*.ts'); -・ + }).include('./src/**/*.ts'); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant file tests with include in an ES module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ import { BettererFileTest } from '@betterer/betterer'; -・ -・ - export const countFiles = new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + export const countFiles = () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }).include('./src/**/*.ts'); -・ + }).include('./src/**/*.ts'); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant objects in a CommonJS module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ + const { BettererTest } = require('@betterer/betterer'); -・ const { bigger } = require('@betterer/constraints'); -・ -・ let start = 0; -・ -・ - module.exports.getsBetter = { -・ + module.exports.getsBetter = () => -・ + new BettererTest({ -・ - test: () => start++, -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }; -・ + }); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant objects in an ES module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ + import { BettererTest } from '@betterer/betterer'; -・ import { bigger } from '@betterer/constraints'; -・ -・ let start = 0; -・ -・ - export const getsBetter = { -・ - test: () => start++, -・ + export const getsBetter = () => -・ + new BettererTest({ -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }; -・ + }); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant tests in a CommonJS module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ const { BettererTest } = require('@betterer/betterer'); -・ const { bigger } = require('@betterer/constraints'); -・ -・ let start = 0; -・ -・ - module.exports.getsBetter = new BettererTest({ -・ + module.exports.getsBetter = () => -・ + new BettererTest({ -・ - test: () => start++, -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }); -・ + }); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported constant tests in an ES module 1`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ import { BettererTest } from '@betterer/betterer'; -・ import { bigger } from '@betterer/constraints'; -・ -・ let start = 0; -・ -・ - export const getsBetter = new BettererTest({ -・ + export const getsBetter = () => -・ + new BettererTest({ -・ - test: () => start++, -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }); -・ + }); -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", -] -`; - -exports[`betterer upgrade should upgrade exported default test in a CJS module 1`] = ` -"const { BettererTest, BettererFileTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); - -let start = 0; - -module.exports = { - getsBetter: () => - new BettererTest({ - test: () => start++, - constraint: bigger - }), - 'gets better': () => - new BettererTest({ - test: () => start++, - constraint: bigger - }), - countFiles: () => - new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }), - 'count files': () => - new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }).include('./src/**/*.ts') -}; -" -`; - -exports[`betterer upgrade should upgrade exported default test in a CJS module 2`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ const { BettererTest, BettererFileTest } = require('@betterer/betterer'); -・ const { bigger } = require('@betterer/constraints'); -・ -・ let start = 0; -・ -・ module.exports = { -・ - getsBetter: { -・ - test: () => start++, -・ + getsBetter: () => -・ + new BettererTest({ -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }, -・ + }), -・ - 'gets better': new BettererTest({ -・ + 'gets better': () => -・ + new BettererTest({ -・ - test: () => start++, -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }), -・ + }), -・ - countFiles: new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + countFiles: () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }), -・ + }), -・ - 'count files': new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + 'count files': () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }).include('./src/**/*.ts') -・ + }).include('./src/**/*.ts') -・ - } -・ + }; -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ Saved upgraded config to \\"/fixtures/upgrade-exported-default-test-cjs/.betterer.ts\\"! ☀️", -] -`; - -exports[`betterer upgrade should upgrade exported default test in an ES module 1`] = ` -"import { BettererTest, BettererFileTest } from '@betterer/betterer'; -import { bigger } from '@betterer/constraints'; - -let start = 0; - -export default { - getsBetter: () => - new BettererTest({ - test: () => start++, - constraint: bigger - }), - 'gets better': () => - new BettererTest({ - test: () => start++, - constraint: bigger - }), - countFiles: () => - new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }), - 'count files': () => - new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }).include('./src/**/*.ts') -}; -" -`; - -exports[`betterer upgrade should upgrade exported default test in an ES module 2`] = ` -Array [ - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ -・ Betterer can upgrade your test definition file automatically! ✨ -・ Here's what the changes will look like: -・ -・ - Before -・ + After -・ -・ import { BettererTest, BettererFileTest } from '@betterer/betterer'; -・ import { bigger } from '@betterer/constraints'; -・ -・ let start = 0; -・ -・ export default { -・ - getsBetter: { -・ - test: () => start++, -・ + getsBetter: () => -・ + new BettererTest({ -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }, -・ + }), -・ - 'gets better': new BettererTest({ -・ + 'gets better': () => -・ + new BettererTest({ -・ - test: () => start++, -・ + test: () => start++, -・ - constraint: bigger -・ + constraint: bigger -・ - }), -・ + }), -・ - countFiles: new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + countFiles: () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }), -・ + }), -・ - 'count files': new BettererFileTest(async (files, fileTestResult) => { -・ - const [filePath] = files; -・ + 'count files': () => -・ + new BettererFileTest(async (files, fileTestResult) => { -・ + const [filePath] = files; -・ - const file = fileTestResult.addFile(filePath, ''); -・ + const file = fileTestResult.addFile(filePath, ''); -・ - file.addIssue(0, 0, '\`$' + '{key}\`'); -・ + file.addIssue(0, 0, '\`$' + '{key}\`'); -・ - }).include('./src/**/*.ts') -・ + }).include('./src/**/*.ts') -・ - } -・ + }; -・ + -・ -・ If that looks okay, run \`betterer upgrade --save\` to write the changes to disk. 💾 -・", - "🎉 Upgrading Betterer (0ms): 1 task done! -✅ Upgrading \\"./.betterer.ts\\": done! -・ Saved upgraded config to \\"/fixtures/upgrade-exported-default-test-esm/.betterer.ts\\"! ☀️", -] -`; diff --git a/test/cli/ci-worse.spec.ts b/test/cli/ci-changes.spec.ts similarity index 62% rename from test/cli/ci-worse.spec.ts rename to test/cli/ci-changes.spec.ts index 38b25a1a2..5a221e001 100644 --- a/test/cli/ci-worse.spec.ts +++ b/test/cli/ci-changes.spec.ts @@ -1,10 +1,11 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; describe('betterer ci', () => { - it('should work when a test gets worse', async () => { + it('should throw an error when a test changes', async () => { const { paths, logs, cleanup, resolve, writeFile } = await createFixture('ci-worse', { 'src/index.ts': ` const a = 'a'; @@ -24,13 +25,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); @@ -38,13 +39,15 @@ export default { const fixturePath = paths.cwd; const indexPath = resolve('./src/index.ts'); - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); await writeFile(indexPath, `const a = 'a';\nconst one = 1;\nconsole.log(one * a);\nconsole.log(a * one);`); - await cli__(fixturePath, [...ARGV, 'ci']); + await expect(async () => { + await cliΔ(fixturePath, [...ARGV, 'ci', '--workers=false']); + }).rejects.toThrow('Unexpected changes detected while running in CI mode. ❌'); expect(logs).toMatchSnapshot(); diff --git a/test/cli/ci-complete.spec.ts b/test/cli/ci-complete.spec.ts index 5735cd158..c22c59fe2 100644 --- a/test/cli/ci-complete.spec.ts +++ b/test/cli/ci-complete.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -24,13 +25,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); @@ -39,9 +40,9 @@ export default { const resultsPath = paths.results; const indexPath = resolve('./src/index.ts'); - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); const result = await readFile(resultsPath); @@ -49,13 +50,13 @@ export default { await writeFile(indexPath, ``); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); const completeResult = await readFile(resultsPath); expect(completeResult).toMatchSnapshot(); - await cli__(fixturePath, [...ARGV, 'ci']); + await cliΔ(fixturePath, [...ARGV, 'ci', '--workers=false']); expect(logs).toMatchSnapshot(); diff --git a/test/cli/ci-diff.spec.ts b/test/cli/ci-diff.spec.ts index 22b33abfa..6924007d9 100644 --- a/test/cli/ci-diff.spec.ts +++ b/test/cli/ci-diff.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -24,13 +25,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); @@ -38,13 +39,15 @@ export default { const fixturePath = paths.cwd; const indexPath = resolve('./src/index.ts'); - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); await writeFile(indexPath, `const a = 'a';\nconst one = 1;\nconsole.log(one + one);\nconsole.log(a * one);`); - await cli__(fixturePath, [...ARGV, 'ci']); + await expect(async () => { + await cliΔ(fixturePath, [...ARGV, 'ci', '--workers=false']); + }).rejects.toThrow('Unexpected changes detected while running in CI mode. ❌'); expect(logs).toMatchSnapshot(); diff --git a/test/cli/ci-env-variable.spec.ts b/test/cli/ci-env-variable.spec.ts index 311a933c7..a7b91eb46 100644 --- a/test/cli/ci-env-variable.spec.ts +++ b/test/cli/ci-env-variable.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -24,13 +25,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); @@ -38,15 +39,17 @@ export default { const fixturePath = paths.cwd; const indexPath = resolve('./src/index.ts'); - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); await writeFile(indexPath, `const a = 'a';\nconst one = 1;\nconsole.log(one + one);\nconsole.log(a * one);`); process.env.CI = 'true'; - await cli__(fixturePath, [...ARGV, 'start']); + await expect(async () => { + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false']); + }).rejects.toThrow('Unexpected changes detected while running in CI mode. ❌'); expect(logs).toMatchSnapshot(); diff --git a/test/cli/ci-failure.spec.ts b/test/cli/ci-failure.spec.ts new file mode 100644 index 000000000..e72e279b4 --- /dev/null +++ b/test/cli/ci-failure.spec.ts @@ -0,0 +1,37 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer']; + +describe('betterer ci', () => { + it('should throw an error when a test fails', async () => { + const { paths, logs, cleanup } = await createFixture('ci-failure', { + '.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; + +export default { + throws: () => { + return new BettererTest({ + test: () => { throw new Error(); }, + constraint: smaller + }); + } +}; + ` + }); + + const fixturePath = paths.cwd; + + const { cliΔ } = await import('@betterer/cli'); + + await expect(async () => { + await cliΔ(fixturePath, [...ARGV, 'ci', '--workers=false']); + }).rejects.toThrow('Tests failed while running in CI mode. ❌'); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/filter-negative.spec.ts b/test/cli/filter-negative.spec.ts index 0e182bcb6..d22f9dd1f 100644 --- a/test/cli/filter-negative.spec.ts +++ b/test/cli/filter-negative.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -9,10 +10,10 @@ describe('betterer cli', () => { 'filter-negative', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; -module.exports = { +export default { 'test 1': () => new BettererTest({ test: () => 0, constraint: bigger @@ -35,13 +36,13 @@ module.exports = { const fixturePath = paths.cwd; - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); - await cli__(fixturePath, [...ARGV, 'start', '--filter', '!1'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false', '--filter', '!1'], false); - await cli__(fixturePath, [...ARGV, 'start', '--filter', 'test', '--filter', '![2|3]'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false', '--filter', 'test', '--filter', '![2|3]'], false); expect(logs).toMatchSnapshot(); diff --git a/test/cli/filter.spec.ts b/test/cli/filter.spec.ts index 60dfd1827..a721e85df 100644 --- a/test/cli/filter.spec.ts +++ b/test/cli/filter.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -9,10 +10,10 @@ describe('betterer cli', () => { 'filter', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger, smaller } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger, smaller } from '@betterer/constraints'; -module.exports = { +export default { 'test 1': () => new BettererTest({ test: () => 0, constraint: bigger @@ -35,13 +36,13 @@ module.exports = { const fixturePath = paths.cwd; - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); - await cli__(fixturePath, [...ARGV, 'start', '--filter', '1'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false', '--filter', '1'], false); - await cli__(fixturePath, [...ARGV, 'start', '--filter', '1', '--filter', '3'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false', '--filter', '1', '--filter', '3'], false); expect(logs).toMatchSnapshot(); diff --git a/test/cli/init-automerge-no-git.spec.ts b/test/cli/init-automerge-no-git.spec.ts new file mode 100644 index 000000000..14f21b140 --- /dev/null +++ b/test/cli/init-automerge-no-git.spec.ts @@ -0,0 +1,37 @@ +import { describe, it, expect } from 'vitest'; +import path from 'node:path'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer']; + +describe('betterer cli', () => { + it('should enable automerge configuration without git', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'init-automerge-no-git', + { + './package.json': ` + { + "name": "init-automerge", + "version": "0.0.1" + } + ` + }, + { + logFilters: [/🌟 Initialising Betterer/, /: running /, /running.../] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, [...ARGV, 'init', '--automerge', `--repoPath=${path.sep}`]); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/init-automerge.spec.ts b/test/cli/init-automerge.spec.ts new file mode 100644 index 000000000..41fbd6ad6 --- /dev/null +++ b/test/cli/init-automerge.spec.ts @@ -0,0 +1,52 @@ +import { describe, it, expect } from 'vitest'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer']; + +describe('betterer cli', () => { + it('should enable automerge configuration', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths, resolve, readFile } = await createFixture( + 'init-automerge', + { + './package.json': ` + { + "name": "init-automerge", + "version": "0.0.1" + } + `, + './.git/file.txt': 'HOLD' + }, + { + logFilters: [/🌟 Initialising Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, [...ARGV, 'init', '--automerge']); + + const attributesFile = await readFile(resolve('.gitattributes')); + + expect(attributesFile).toMatchSnapshot(); + + const __dirname = path.dirname(fileURLToPath(import.meta.url)); + const rootDir = path.resolve(__dirname, '../../'); + const gitconfigFile = await readFile(resolve('./.git/config')); + const fixPaths = gitconfigFile.replace(rootDir, '').split(path.win32.sep).join(path.posix.sep); + + expect(fixPaths).toMatchSnapshot(); + + const last = logs.at(-1); + expect(last).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/init-js.spec.ts b/test/cli/init-js.spec.ts index 36563d477..a7eaa2bbf 100644 --- a/test/cli/init-js.spec.ts +++ b/test/cli/init-js.spec.ts @@ -1,7 +1,10 @@ +import { describe, it, expect } from 'vitest'; + import type { BettererPackageJSON } from '@betterer/cli'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import path from 'node:path'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -9,7 +12,7 @@ import { version } from '../../packages/cli/package.json'; describe('betterer cli', () => { it('should initialise betterer in a repo with JS', async () => { - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); const { cleanup, logs, paths, readFile, resolve } = await createFixture( 'init-js', @@ -26,21 +29,26 @@ describe('betterer cli', () => { } ); - const configPath = `${paths.config}.js`; + const { dir, name } = path.parse(paths.config); + const configPath = `${path.join(dir, name)}.js`; const fixturePath = paths.cwd; const packageJSONPath = resolve('./package.json'); - await cli__(fixturePath, [...ARGV, 'init', '--config', configPath]); + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, [...ARGV, 'init', '--config', configPath]); const packageJSON = JSON.parse(await readFile(packageJSONPath)) as BettererPackageJSON; - expect(packageJSON.scripts.betterer).toEqual('betterer'); - expect(packageJSON.devDependencies['@betterer/cli']).toEqual(`^${version}`); - expect(packageJSON.devDependencies['typescript']).not.toBeDefined(); + /* eslint-disable @typescript-eslint/dot-notation -- prefer computed key */ + expect(packageJSON.scripts?.['betterer']).toEqual('betterer'); + expect(packageJSON.devDependencies?.['@betterer/cli']).toEqual(`^${version}`); + expect(packageJSON.devDependencies?.['typescript']).not.toBeDefined(); + /* eslint-enable @typescript-eslint/dot-notation */ const config = await readFile(configPath); - expect(config).toEqual('module.exports = {\n // Add tests here ☀️\n};\n'); + expect(config).toEqual('export default {\n // Add tests here ☀️\n};\n'); expect(logs).toMatchSnapshot(); diff --git a/test/cli/init-mulitple.spec.ts b/test/cli/init-multiple.spec.ts similarity index 67% rename from test/cli/init-mulitple.spec.ts rename to test/cli/init-multiple.spec.ts index ee92d0c88..e12e791b8 100644 --- a/test/cli/init-mulitple.spec.ts +++ b/test/cli/init-multiple.spec.ts @@ -1,10 +1,13 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; describe('betterer cli', () => { it('should work multiple times', async () => { + const { cliΔ } = await import('@betterer/cli'); + const { cleanup, logs, paths } = await createFixture( 'init-multiple', { @@ -22,12 +25,12 @@ describe('betterer cli', () => { const fixturePath = paths.cwd; - const { cli__ } = await import('@betterer/cli'); + process.env.BETTERER_WORKER = 'false'; let throws = false; try { - await cli__(fixturePath, [...ARGV, 'init']); - await cli__(fixturePath, [...ARGV, 'init']); + await cliΔ(fixturePath, [...ARGV, 'init']); + await cliΔ(fixturePath, [...ARGV, 'init']); await cleanup(); } catch { throws = true; diff --git a/test/cli/init-ts.spec.ts b/test/cli/init-ts.spec.ts index a4313713f..a5191e53e 100644 --- a/test/cli/init-ts.spec.ts +++ b/test/cli/init-ts.spec.ts @@ -1,15 +1,16 @@ import type { BettererPackageJSON } from '@betterer/cli'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; -import { version } from '../../packages/cli/package.json'; +import { version } from '@betterer/cli/package.json'; describe('betterer cli', () => { it('should initialise betterer in a repo with TS', async () => { - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); const { cleanup, logs, paths, readFile, resolve } = await createFixture( 'init-ts', @@ -26,19 +27,22 @@ describe('betterer cli', () => { } ); - const configPath = `${paths.config}.ts`; const fixturePath = paths.cwd; const packageJSONPath = resolve('./package.json'); - await cli__(fixturePath, [...ARGV, 'init']); + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, [...ARGV, 'init', '--config', paths.config]); const packageJSON = JSON.parse(await readFile(packageJSONPath)) as BettererPackageJSON; - expect(packageJSON.scripts.betterer).toEqual('betterer'); - expect(packageJSON.devDependencies['@betterer/cli']).toEqual(`^${version}`); - expect(packageJSON.devDependencies['typescript']).toBeDefined(); + /* eslint-disable @typescript-eslint/dot-notation -- prefer computed key */ + expect(packageJSON.scripts?.['betterer']).toEqual('betterer'); + expect(packageJSON.devDependencies?.['@betterer/cli']).toEqual(`^${version}`); + expect(packageJSON.devDependencies?.['typescript']).toBeDefined(); + /* eslint-enable @typescript-eslint/dot-notation */ - const config = await readFile(configPath); + const config = await readFile(paths.config); expect(config).toEqual('export default {\n // Add tests here ☀️\n};\n'); diff --git a/test/cli/logo-show.spec.ts b/test/cli/logo-show.spec.ts index 72561f65a..c3c9722ad 100644 --- a/test/cli/logo-show.spec.ts +++ b/test/cli/logo-show.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -7,10 +8,10 @@ describe('betterer cli', () => { it('should show the logo', async () => { const { logs, paths, cleanup } = await createFixture('logo-show', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; -module.exports = { +export default { 'test 1': () => new BettererTest({ test: () => 0, constraint: bigger @@ -21,11 +22,11 @@ module.exports = { const fixturePath = paths.cwd; - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); - await cli__(fixturePath, [...ARGV, 'start', '--logo'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false', '--logo'], false); expect(logs).toMatchSnapshot(); diff --git a/test/cli/merge-contents.spec.ts b/test/cli/merge-contents.spec.ts index c83bb1058..4ac8a4e74 100644 --- a/test/cli/merge-contents.spec.ts +++ b/test/cli/merge-contents.spec.ts @@ -1,10 +1,13 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; describe('betterer cli', () => { it('should merge the given contents', async () => { + const { cliΔ } = await import('@betterer/cli'); + const { paths, cleanup, readFile } = await createFixture('merge-contents', { '.betterer.results': '' }); @@ -32,9 +35,9 @@ exports[\`test\`] = { const resultsPath = paths.results; const fixturePath = paths.cwd; - const { cli__ } = await import('@betterer/cli'); + process.env.BETTERER_WORKER = 'false'; - await cli__(fixturePath, [...ARGV, 'merge', ours, theirs]); + await cliΔ(fixturePath, [...ARGV, 'merge', ours, theirs]); const merged = await readFile(resultsPath); diff --git a/test/cli/merge-path.spec.ts b/test/cli/merge-path.spec.ts index 54adee464..afc0ee7c0 100644 --- a/test/cli/merge-path.spec.ts +++ b/test/cli/merge-path.spec.ts @@ -1,10 +1,13 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; describe('betterer cli', () => { it('should merge the results file', async () => { + const { cliΔ } = await import('@betterer/cli'); + const { paths, cleanup, readFile } = await createFixture('merge-path', { '.betterer.results': ` // BETTERER RESULTS V2. @@ -28,15 +31,15 @@ exports[\`test\`] = { const resultsPath = paths.results; const fixturePath = paths.cwd; - const { cli__ } = await import('@betterer/cli'); + process.env.BETTERER_WORKER = 'false'; - await cli__(fixturePath, [...ARGV, 'merge']); + await cliΔ(fixturePath, [...ARGV, 'merge']); const merged = await readFile(resultsPath); expect(merged).toMatchSnapshot(); - await cli__(fixturePath, [...ARGV, 'merge', '--results', resultsPath]); + await cliΔ(fixturePath, [...ARGV, 'merge', '--results', resultsPath]); const unchanged = await readFile(resultsPath); diff --git a/test/cli/precommit-add.spec.ts b/test/cli/precommit-add.spec.ts index 2808bcd40..ed9cc03e1 100644 --- a/test/cli/precommit-add.spec.ts +++ b/test/cli/precommit-add.spec.ts @@ -1,12 +1,15 @@ +import { describe, it, expect } from 'vitest'; + import { simpleGit } from 'simple-git'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; describe('betterer precommit', () => { it('should add the results file to the changeset if there is any change to the results file', async () => { + const { cliΔ } = await import('@betterer/cli'); + const { paths, logs, cleanup, resolve, writeFile } = await createFixture('precommit-add', { 'src/index.ts': ` const a = 'a'; @@ -26,13 +29,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); @@ -41,22 +44,19 @@ export default { const fixturePath = paths.cwd; const indexPath = resolve('./src/index.ts'); - await writeFile(indexPath, `const a = 'a';\nconst one = 1;\nconsole.log(one + one);\nconsole.log(a * one);`); + process.env.BETTERER_WORKER = 'false'; - const { cli__ } = await import('@betterer/cli'); + await writeFile(indexPath, `const a = 'a';\nconst one = 1;\nconsole.log(one + one);\nconsole.log(a * one);`); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); await writeFile(indexPath, `const a = 'a';\nconst one = 1;\nconsole.log(one + one);`); - await cli__(fixturePath, [...ARGV, 'precommit']); - - expect(process.exitCode).toBeUndefined(); + await cliΔ(fixturePath, [...ARGV, 'precommit', '--workers=false', '--repoPath=../../']); expect(logs).toMatchSnapshot(); const git = simpleGit(); - await git.init(); const status = await git.status([paths.results]); const [stagedResultsPath] = status.staged; expect(stagedResultsPath).toMatchSnapshot(); diff --git a/test/cli/precommit-failure.spec.ts b/test/cli/precommit-failure.spec.ts new file mode 100644 index 000000000..784a394bb --- /dev/null +++ b/test/cli/precommit-failure.spec.ts @@ -0,0 +1,43 @@ +import { describe, it, expect } from 'vitest'; + +import { simpleGit } from 'simple-git'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer']; + +describe('betterer precommit', () => { + it('should not update the changeset when a test fails', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { paths, logs, cleanup } = await createFixture('precommit-failure', { + '.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; + +export default { + throws: () => { + return new BettererTest({ + test: () => { throw new Error(); }, + constraint: smaller + }); + } +}; + ` + }); + + const fixturePath = paths.cwd; + + await expect(async () => { + await cliΔ(fixturePath, [...ARGV, 'precommit', '--workers=false', '--repoPath=../../']); + }).rejects.toThrow('Tests failed while running in precommit mode. ❌'); + + expect(logs).toMatchSnapshot(); + + const git = simpleGit(); + const status = await git.status([paths.results]); + expect(status.staged).toEqual([]); + + await cleanup(); + }); +}); diff --git a/test/cli/precommit-specific-file.spec.ts b/test/cli/precommit-specific-file.spec.ts index 7d52f7e57..fc8444edb 100644 --- a/test/cli/precommit-specific-file.spec.ts +++ b/test/cli/precommit-specific-file.spec.ts @@ -1,46 +1,52 @@ +import { describe, it, expect } from 'vitest'; + import { simpleGit } from 'simple-git'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; describe('betterer precommit', () => { it('should test just the specified files', async () => { + const { cliΔ } = await import('@betterer/cli'); + const { paths, logs, cleanup, resolve, readFile, writeFile } = await createFixture('precommit-specific-file', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); - -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') +import { eslint } from '@betterer/eslint'; + +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; + { rules: { 'no-debugger': 'off' } } +); `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } `, './src/existing-file-1.ts': ` @@ -56,13 +62,13 @@ debugger; const newFilePath = resolve('./src/new-file.ts'); - await writeFile(newFilePath, 'debugger;'); + process.env.BETTERER_WORKER = 'false'; - const { cli__ } = await import('@betterer/cli'); + await writeFile(newFilePath, 'debugger;'); - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); - await cli__(fixturePath, [...ARGV, 'precommit', newFilePath], false); + await cliΔ(fixturePath, [...ARGV, 'precommit', '--workers=false', '--repoPath=../../', newFilePath], false); expect(logs).toMatchSnapshot(); @@ -71,7 +77,6 @@ debugger; expect(result).toMatchSnapshot(); const git = simpleGit(); - await git.init(); const status = await git.status([paths.results]); const [stagedResultsPath] = status.staged; expect(stagedResultsPath).toMatchSnapshot(); diff --git a/test/cli/precommit-worse.spec.ts b/test/cli/precommit-worse.spec.ts index aa10b56b9..7dd9d5c01 100644 --- a/test/cli/precommit-worse.spec.ts +++ b/test/cli/precommit-worse.spec.ts @@ -1,12 +1,15 @@ +import { describe, it, expect } from 'vitest'; + import { simpleGit } from 'simple-git'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; describe('betterer precommit', () => { it('should not update the changeset when a test gets worse', async () => { + const { cliΔ } = await import('@betterer/cli'); + const { paths, logs, cleanup, resolve, writeFile } = await createFixture('precommit-worse', { 'src/index.ts': ` const a = 'a'; @@ -26,13 +29,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); @@ -40,20 +43,19 @@ export default { const fixturePath = paths.cwd; const indexPath = resolve('./src/index.ts'); - const { cli__ } = await import('@betterer/cli'); + process.env.BETTERER_WORKER = 'false'; - await cli__(fixturePath, [...ARGV, 'start'], false); + await cliΔ(fixturePath, [...ARGV, 'start', '--workers=false'], false); await writeFile(indexPath, `const a = 'a';\nconst one = 1;\nconsole.log(one * a);\nconsole.log(a * one);`); - await cli__(fixturePath, [...ARGV, 'precommit']); - - expect(process.exitCode).toEqual(1); + await expect(async () => { + await cliΔ(fixturePath, [...ARGV, 'precommit', '--workers=false', '--repoPath=../../']); + }).rejects.toThrow('Tests got worse while running in precommit mode. ❌'); expect(logs).toMatchSnapshot(); const git = simpleGit(); - await git.init(); const status = await git.status([paths.results]); expect(status.staged).toEqual([]); diff --git a/test/cli/results-file-test.spec.ts b/test/cli/results-file-test.spec.ts index 3bcb97ee6..0fff06387 100644 --- a/test/cli/results-file-test.spec.ts +++ b/test/cli/results-file-test.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -7,9 +8,9 @@ describe('betterer cli', () => { it('should report the current results for a file test', async () => { const { logs, paths, cleanup } = await createFixture('results-file-test', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') }; `, @@ -31,9 +32,9 @@ module.exports = { await betterer({ configPaths, resultsPath, workers: false, silent: true }); - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'results']); + await cliΔ(fixturePath, [...ARGV, 'results']); expect(logs).toMatchSnapshot(); diff --git a/test/cli/results-test.spec.ts b/test/cli/results-test.spec.ts index 0fed955ae..1cf854038 100644 --- a/test/cli/results-test.spec.ts +++ b/test/cli/results-test.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; const ARGV = ['node', './bin/betterer']; @@ -7,13 +8,13 @@ describe('betterer cli', () => { it('should report the current results for a test', async () => { const { logs, paths, cleanup } = await createFixture('results-test', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller, bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller, bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); -module.exports = { +export default { test: () => new BettererTest({ test: () => grows.increment(), constraint: bigger @@ -30,9 +31,9 @@ module.exports = { await betterer({ configPaths, resultsPath, workers: false, silent: true }); - const { cli__ } = await import('@betterer/cli'); + const { cliΔ } = await import('@betterer/cli'); - await cli__(fixturePath, [...ARGV, 'results']); + await cliΔ(fixturePath, [...ARGV, 'results']); expect(logs).toMatchSnapshot(); diff --git a/test/cli/upgrade-exported-constant-built-in-cjs.spec.ts b/test/cli/upgrade-exported-constant-built-in-cjs.spec.ts new file mode 100644 index 000000000..eb0e395b8 --- /dev/null +++ b/test/cli/upgrade-exported-constant-built-in-cjs.spec.ts @@ -0,0 +1,35 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant built-in tests in a CommonJS module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-built-in-cjs', + { + './.betterer.ts': ` +const { regexp } = require('@betterer/regexp'); + +module.exports.noHack = regexp(/HACK/i).include('**/*.ts'); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-built-in-esm.spec.ts b/test/cli/upgrade-exported-constant-built-in-esm.spec.ts new file mode 100644 index 000000000..df06bd74f --- /dev/null +++ b/test/cli/upgrade-exported-constant-built-in-esm.spec.ts @@ -0,0 +1,35 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant built-in tests in an ES module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-built-in-esm', + { + './.betterer.ts': ` +import { regexp } from '@betterer/regexp'; + +export const noHack = regexp(/HACK/i).include('**/*.ts'); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-file-test-cjs.spec.ts b/test/cli/upgrade-exported-constant-file-test-cjs.spec.ts new file mode 100644 index 000000000..87b6beade --- /dev/null +++ b/test/cli/upgrade-exported-constant-file-test-cjs.spec.ts @@ -0,0 +1,39 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant file tests in a CommonJS module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-file-test-cjs', + { + './.betterer.ts': ` +const { BettererFileTest } = require('@betterer/betterer'); + +module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); +}); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-file-test-esm.spec.ts b/test/cli/upgrade-exported-constant-file-test-esm.spec.ts new file mode 100644 index 000000000..cc78e02e0 --- /dev/null +++ b/test/cli/upgrade-exported-constant-file-test-esm.spec.ts @@ -0,0 +1,39 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant file tests in an ES module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-file-test-esm', + { + './.betterer.ts': ` +import { BettererFileTest } from '@betterer/betterer'; + +export const countFiles = new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); +}); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-file-test-include-cjs.spec.ts b/test/cli/upgrade-exported-constant-file-test-include-cjs.spec.ts new file mode 100644 index 000000000..3f2ab9e1d --- /dev/null +++ b/test/cli/upgrade-exported-constant-file-test-include-cjs.spec.ts @@ -0,0 +1,39 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant file tests with include in a CommonJS module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-file-test-include-cjs', + { + './.betterer.ts': ` +const { BettererFileTest } = require('@betterer/betterer'); + +module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); +}).include('./src/**/*.ts'); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-file-test-include-esm.spec.ts b/test/cli/upgrade-exported-constant-file-test-include-esm.spec.ts new file mode 100644 index 000000000..1309530a3 --- /dev/null +++ b/test/cli/upgrade-exported-constant-file-test-include-esm.spec.ts @@ -0,0 +1,39 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant file tests with include in an ES module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-file-test-include-esm', + { + './.betterer.ts': ` +import { BettererFileTest } from '@betterer/betterer'; + +export const countFiles = new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); +}).include('./src/**/*.ts'); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-object-cjs.spec.ts b/test/cli/upgrade-exported-constant-object-cjs.spec.ts new file mode 100644 index 000000000..663bab47f --- /dev/null +++ b/test/cli/upgrade-exported-constant-object-cjs.spec.ts @@ -0,0 +1,40 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant objects in a CommonJS module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-object-cjs', + { + './.betterer.ts': ` +const { bigger } = require('@betterer/constraints'); + +let start = 0; + +module.exports.getsBetter = { + test: () => start++, + constraint: bigger +}; + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-object-esm.spec.ts b/test/cli/upgrade-exported-constant-object-esm.spec.ts new file mode 100644 index 000000000..d015e80d2 --- /dev/null +++ b/test/cli/upgrade-exported-constant-object-esm.spec.ts @@ -0,0 +1,40 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant objects in an ES module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-object-esm', + { + './.betterer.ts': ` +import { bigger } from '@betterer/constraints'; + +let start = 0; + +export const getsBetter = { + test: () => start++, + constraint: bigger +}; + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-test-cjs.spec.ts b/test/cli/upgrade-exported-constant-test-cjs.spec.ts new file mode 100644 index 000000000..80e564b91 --- /dev/null +++ b/test/cli/upgrade-exported-constant-test-cjs.spec.ts @@ -0,0 +1,41 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant tests in a CommonJS module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-test-cjs', + { + './.betterer.ts': ` +const { BettererTest } = require('@betterer/betterer'); +const { bigger } = require('@betterer/constraints'); + +let start = 0; + +module.exports.getsBetter = new BettererTest({ + test: () => start++, + constraint: bigger +}); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-constant-test-esm.spec.ts b/test/cli/upgrade-exported-constant-test-esm.spec.ts new file mode 100644 index 000000000..58dc28b7c --- /dev/null +++ b/test/cli/upgrade-exported-constant-test-esm.spec.ts @@ -0,0 +1,41 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported constant tests in an ES module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-exported-constant-test-esm', + { + './.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; + +let start = 0; + +export const getsBetter = new BettererTest({ + test: () => start++, + constraint: bigger +}); + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-default-test-cjs.spec.ts b/test/cli/upgrade-exported-default-test-cjs.spec.ts new file mode 100644 index 000000000..eaafa91c5 --- /dev/null +++ b/test/cli/upgrade-exported-default-test-cjs.spec.ts @@ -0,0 +1,63 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported default test in a CJS module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths, readFile } = await createFixture( + 'upgrade-exported-default-test-cjs', + { + './.betterer.ts': ` +const { BettererTest, BettererFileTest } = require('@betterer/betterer'); +const { bigger } = require('@betterer/constraints'); + +let start = 0; + +module.exports = { + getsBetter: { + test: () => start++, + constraint: bigger + }, + 'gets better': new BettererTest({ + test: () => start++, + constraint: bigger + }), + countFiles: new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); + }), + 'count files': new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); + }).include('./src/**/*.ts') +} + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + await cliΔ(fixturePath, [...ARGV, '--save']); + + const upgradedConfig = await readFile(paths.config); + + expect(upgradedConfig).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-exported-default-test-esm.spec.ts b/test/cli/upgrade-exported-default-test-esm.spec.ts new file mode 100644 index 000000000..42c0c3ae0 --- /dev/null +++ b/test/cli/upgrade-exported-default-test-esm.spec.ts @@ -0,0 +1,63 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it('should upgrade exported default test in an ES module', async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths, readFile } = await createFixture( + 'upgrade-exported-default-test-esm', + { + './.betterer.ts': ` +import { BettererTest, BettererFileTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; + +let start = 0; + +export default { + getsBetter: { + test: () => start++, + constraint: bigger + }, + 'gets better': new BettererTest({ + test: () => start++, + constraint: bigger + }), + countFiles: new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); + }), + 'count files': new BettererFileTest(async (files, fileTestResult) => { + const [filePath] = files; + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, '\`$' + '{key}\`'); + }).include('./src/**/*.ts') +} + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + await cliΔ(fixturePath, [...ARGV, '--save']); + + const upgradedConfig = await readFile(paths.config); + + expect(upgradedConfig).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade-unknown.spec.ts b/test/cli/upgrade-unknown.spec.ts new file mode 100644 index 000000000..0d1231ecc --- /dev/null +++ b/test/cli/upgrade-unknown.spec.ts @@ -0,0 +1,64 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer', 'upgrade']; + +describe('betterer upgrade', () => { + it(`should doesn't change things it doesn't need to change`, async () => { + const { cliΔ } = await import('@betterer/cli'); + + const { cleanup, logs, paths } = await createFixture( + 'upgrade-unknown', + { + './.betterer.ts': ` +const { BettererTest } = require('@betterer/betterer'); +const { bigger } = require('@betterer/constraints'); + +let start = 0; + +// Don't remove this important comment! +console.log('some stuff here!'); + +// This stuff shouldn't be in here but let's not break things: +module.exports = { + num: 9, + str: 'some string', + array: [], + set: new Set(), + regexp: /regexp/, + object: { + notTest: () => 3 + } +} + +module.exports.getsBetter = () => new BettererTest({ + test: () => start++, + constraint: bigger +}); + +export function foo () { + console.log('something'); +} + +function bar () { + console.log('something'); +} + ` + }, + { + logFilters: [/🌟 Upgrading Betterer/] + } + ); + + const fixturePath = paths.cwd; + + process.env.BETTERER_WORKER = 'false'; + + await cliΔ(fixturePath, ARGV); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/cli/upgrade.spec.ts b/test/cli/upgrade.spec.ts deleted file mode 100644 index 1bf1e52a2..000000000 --- a/test/cli/upgrade.spec.ts +++ /dev/null @@ -1,467 +0,0 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; - -const ARGV = ['node', './bin/betterer', 'upgrade']; - -describe('betterer upgrade', () => { - it('should upgrade exported constant objects in an ES module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-object-esm', - { - './.betterer.ts': ` -import { bigger } from '@betterer/constraints'; - -let start = 0; - -export const getsBetter = { - test: () => start++, - constraint: bigger -}; - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant objects in a CommonJS module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-object-cjs', - { - './.betterer.ts': ` -const { bigger } = require('@betterer/constraints'); - -let start = 0; - -module.exports.getsBetter = { - test: () => start++, - constraint: bigger -}; - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant tests in an ES module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-test-esm', - { - './.betterer.ts': ` -import { BettererTest } from '@betterer/betterer'; -import { bigger } from '@betterer/constraints'; - -let start = 0; - -export const getsBetter = new BettererTest({ - test: () => start++, - constraint: bigger -}); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant tests in a CommonJS module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-test-cjs', - { - './.betterer.ts': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); - -let start = 0; - -module.exports.getsBetter = new BettererTest({ - test: () => start++, - constraint: bigger -}); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant file tests in an ES module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-file-test-esm', - { - './.betterer.ts': ` -import { BettererFileTest } from '@betterer/betterer'; - -export const countFiles = new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); -}); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant file tests in a CommonJS module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-file-test-cjs', - { - './.betterer.ts': ` -const { BettererFileTest } = require('@betterer/betterer'); - -module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); -}); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant file tests with include in an ES module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-file-test-include-esm', - { - './.betterer.ts': ` -import { BettererFileTest } from '@betterer/betterer'; - -export const countFiles = new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); -}).include('./src/**/*.ts'); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant file tests with include in a CommonJS module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-file-test-include-cjs', - { - './.betterer.ts': ` -const { BettererFileTest } = require('@betterer/betterer'); - -module.exports.countFiles = new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); -}).include('./src/**/*.ts'); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant built-in tests in an ES module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-built-in-esm', - { - './.betterer.ts': ` -import { regexp } from '@betterer/regexp'; - -export const noHack = regexp(/HACK/i).include('**/*.ts'); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported constant built-in tests in a CommonJS module', async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-exported-constant-built-in-cjs', - { - './.betterer.ts': ` -const { regexp } = require('@betterer/regexp'); - -module.exports.noHack = regexp(/HACK/i).include('**/*.ts'); - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported default test in an ES module', async () => { - const { cleanup, logs, paths, readFile } = await createFixture( - 'upgrade-exported-default-test-esm', - { - './.betterer.ts': ` -import { BettererTest, BettererFileTest } from '@betterer/betterer'; -import { bigger } from '@betterer/constraints'; - -let start = 0; - -export default { - getsBetter: { - test: () => start++, - constraint: bigger - }, - 'gets better': new BettererTest({ - test: () => start++, - constraint: bigger - }), - countFiles: new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }), - 'count files': new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }).include('./src/**/*.ts') -} - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - await cli__(fixturePath, [...ARGV, '--save']); - - const upgradedConfig = await readFile(`${paths.config}.ts`); - - expect(upgradedConfig).toMatchSnapshot(); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it('should upgrade exported default test in a CJS module', async () => { - const { cleanup, logs, paths, readFile } = await createFixture( - 'upgrade-exported-default-test-cjs', - { - './.betterer.ts': ` -const { BettererTest, BettererFileTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); - -let start = 0; - -module.exports = { - getsBetter: { - test: () => start++, - constraint: bigger - }, - 'gets better': new BettererTest({ - test: () => start++, - constraint: bigger - }), - countFiles: new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }), - 'count files': new BettererFileTest(async (files, fileTestResult) => { - const [filePath] = files; - const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, '\`$' + '{key}\`'); - }).include('./src/**/*.ts') -} - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - await cli__(fixturePath, [...ARGV, '--save']); - - const upgradedConfig = await readFile(`${paths.config}.ts`); - - expect(upgradedConfig).toMatchSnapshot(); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); - - it(`should doesn't change things it doesn't need to change`, async () => { - const { cleanup, logs, paths } = await createFixture( - 'upgrade-unknown', - { - './.betterer.ts': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); - -let start = 0; - -// Don't remove this important comment! -console.log('some stuff here!'); - -// This stuff shouldn't be in here but let's not break things: -module.exports = { - num: 9, - str: 'some string', - array: [], - set: new Set(), - regexp: /regexp/, - object: { - notTest: () => 3 - } -} - -module.exports.getsBetter = () => new BettererTest({ - test: () => start++, - constraint: bigger -}); - -export function foo () { - console.log('boop'); -} - -function bar () { - console.log('boop'); -} - ` - }, - { - logFilters: [/🌟 Upgrading Betterer/] - } - ); - - const fixturePath = paths.cwd; - - const { cli__ } = await import('@betterer/cli'); - - await cli__(fixturePath, ARGV); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); -}); diff --git a/test/cli/version.spec.ts b/test/cli/version.e2e.spec.ts similarity index 51% rename from test/cli/version.spec.ts rename to test/cli/version.e2e.spec.ts index 8aa66e766..3a2d1bb89 100644 --- a/test/cli/version.spec.ts +++ b/test/cli/version.e2e.spec.ts @@ -1,12 +1,11 @@ -import type { BettererPackageJSON } from '@betterer/cli'; +import { describe, expect, it } from 'vitest'; import { execSync } from 'node:child_process'; import path from 'node:path'; describe('betterer cli', () => { - it('should print the version', () => { - // eslint-disable-next-line @typescript-eslint/no-var-requires -- migrating away from CJS requires - const { version } = require('../../packages/cli/package.json') as BettererPackageJSON; + it('should print the version', async () => { + const { version } = await import('../../packages/cli/package.json'); const binPath = path.resolve(__dirname, '../../packages/cli/bin/betterer'); const result = execSync(`node "${binPath}" -V`); diff --git a/test/complete.spec.ts b/test/complete.spec.ts index b29401864..86d0620a8 100644 --- a/test/complete.spec.ts +++ b/test/complete.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it(`should mark a test as complete when it reaches its goal`, async () => { @@ -9,15 +10,16 @@ describe('betterer', () => { 'complete', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const shouldComplete = persist(import.meta.url, 'should-complete', 0); +const shouldCompleteTheGetWorse = persist(import.meta.url, 'should complete then get worse', 0); -module.exports = { +export default { 'should complete': () => new BettererTest({ - test: () => grows.increment(), + test: () => shouldComplete.increment(), constraint: bigger, goal: (result) => result >= 2 }), @@ -25,6 +27,17 @@ module.exports = { test: () => 0, constraint: bigger, goal: 0 + }), + 'should complete then get worse': () => new BettererTest({ + test: async () => { + const result = await shouldCompleteTheGetWorse.increment(); + if (result > 2) { + await shouldCompleteTheGetWorse.reset(); + } + return result; + }, + constraint: bigger, + goal: (result) => result >= 2 }) }; ` @@ -39,22 +52,39 @@ module.exports = { const firstRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(testNames(firstRun.new)).toEqual(['should complete']); + expect(testNames(firstRun.new)).toEqual(['should complete', 'should complete then get worse']); expect(testNames(firstRun.completed)).toEqual(['complete']); + const firstResult = await readFile(resultsPath); + + expect(firstResult).toMatchSnapshot(); + const secondRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(testNames(secondRun.better)).toEqual(['should complete']); + expect(testNames(secondRun.better)).toEqual(['should complete', 'should complete then get worse']); + + const secondResult = await readFile(resultsPath); + + expect(secondResult).toMatchSnapshot(); const thirdRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(testNames(thirdRun.completed)).toEqual(['should complete', 'complete']); + expect(testNames(thirdRun.completed)).toEqual(['should complete', 'complete', 'should complete then get worse']); + + const thirdResult = await readFile(resultsPath); + + expect(thirdResult).toMatchSnapshot(); + + const fourthRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(fourthRun.completed)).toEqual(['should complete', 'complete']); + expect(testNames(fourthRun.worse)).toEqual(['should complete then get worse']); expect(logs).toMatchSnapshot(); - const result = await readFile(resultsPath); + const fourthResult = await readFile(resultsPath); - expect(result).toMatchSnapshot(); + expect(fourthResult).toMatchSnapshot(); await cleanup(); }); diff --git a/test/config-duplicate-names.spec.ts b/test/config-duplicate-names.spec.ts new file mode 100644 index 000000000..308e32287 --- /dev/null +++ b/test/config-duplicate-names.spec.ts @@ -0,0 +1,51 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should work with multiple .betterer.ts files', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, resolve, cleanup } = await createFixture('config-multiple', { + 'grows.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const grows = persist(import.meta.url, 'grows', 0); + +export default { + test: () => new BettererTest({ + test: () => grows.increment(), + constraint: bigger + }) +}; + `, + 'shrinks.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const shrinks = persist(import.meta.url, 'shrinks', 0); + +export default { + test: () => new BettererTest({ + test: () => shrinks.decrement(), + constraint: smaller + }) +}; + ` + }); + + const configPaths = [resolve('grows.betterer.ts'), resolve('shrinks.betterer.ts')]; + const resultsPath = paths.results; + + await expect( + async () => await betterer({ configPaths, logo: true, resultsPath, workers: false }) + ).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/config-invalid.spec.ts b/test/config-invalid.spec.ts index d4022201c..12cb674bc 100644 --- a/test/config-invalid.spec.ts +++ b/test/config-invalid.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw when there is an invalid config file', async () => { diff --git a/test/config-ts.spec.ts b/test/config-js-esm.spec.ts similarity index 59% rename from test/config-ts.spec.ts rename to test/config-js-esm.spec.ts index bf5f051b1..296c6c7e1 100644 --- a/test/config-ts.spec.ts +++ b/test/config-js-esm.spec.ts @@ -1,24 +1,32 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { - it('should work with a .betterer.ts file', async () => { + it('should work with a .betterer.js file that uses ES modules', async () => { const { betterer } = await import('@betterer/betterer'); - const { logs, paths, readFile, cleanup, testNames } = await createFixture('config-ts', { - '.betterer.ts': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); + const { logs, paths, readFile, cleanup, testNames } = await createFixture('config-js-esm', { + '.betterer.js': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); -module.exports = { +export default { test: () => new BettererTest({ test: () => grows.increment(), constraint: bigger }) }; + `, + 'tsconfig.json': ` +{ + "compilerOptions": { + "module": "ESNext", + }, +} ` }); diff --git a/test/config-missing.spec.ts b/test/config-missing.spec.ts index 5d4dc3c35..b722d0228 100644 --- a/test/config-missing.spec.ts +++ b/test/config-missing.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw when there is not a config file', async () => { diff --git a/test/config-modes.spec.ts b/test/config-modes.spec.ts index 2d575fdb8..03ce8b149 100644 --- a/test/config-modes.spec.ts +++ b/test/config-modes.spec.ts @@ -1,87 +1,72 @@ -import type { BettererOptionsStart, BettererOptionsRunner, BettererOptionsWatch } from '@betterer/betterer'; +import type { BettererOptions, BettererOptionsRunner, BettererOptionsWatch } from '@betterer/betterer'; + +import { describe, it } from 'vitest'; function noop(options: unknown): unknown { return options; } describe('betterer modes', () => { - // eslint-disable-next-line jest/expect-expect -- no need to assert, just testing the types it('handles options for running Betterer', () => { - const ci: BettererOptionsStart = { ci: true, precommit: false, strict: true, update: false, watch: false }; + const start: BettererOptions = { ci: false, precommit: false, strict: false, update: false }; + noop(start); + + const ci: BettererOptions = { ci: true, precommit: false, strict: true, update: false }; noop(ci); - const precommit: BettererOptionsStart = { ci: false, precommit: true, strict: true, update: false, watch: false }; + const precommit: BettererOptions = { ci: false, precommit: true, strict: true, update: false }; noop(precommit); - const start: BettererOptionsStart = { ci: false, precommit: false, strict: false, update: false, watch: false }; - noop(start); - - const update: BettererOptionsStart = { ci: false, precommit: false, strict: false, update: true, watch: false }; + const update: BettererOptions = { ci: false, precommit: false, strict: false, update: true }; noop(update); - const strict: BettererOptionsStart = { ci: false, precommit: false, strict: true, update: false, watch: false }; + const strict: BettererOptions = { ci: false, precommit: false, strict: true, update: false }; noop(strict); // @ts-expect-error `update` cannot be `true` is `strict` is `true`: - const updateStrictStartError: BettererOptionsStart = { ci: false, strict: true, update: true }; + const updateStrictStartError: BettererOptions = { ci: false, strict: true, update: true }; noop(updateStrictStartError); // @ts-expect-error `precommit` cannot be `true` is `ci` is `true`: - const precommitCIStartError: BettererOptionsStart = { ci: true, precommit: true }; + const precommitCIStartError: BettererOptions = { ci: true, precommit: true }; noop(precommitCIStartError); // @ts-expect-error `strict` cannot be `false` is `ci` is `true`: - const strictCIStartError: BettererOptionsStart = { ci: true, strict: false }; + const strictCIStartError: BettererOptions = { ci: true, strict: false }; noop(strictCIStartError); // @ts-expect-error `update` cannot be `true` is `ci` is `true`: - const updateCIStartError: BettererOptionsStart = { ci: true, update: true }; + const updateCIStartError: BettererOptions = { ci: true, update: true }; noop(updateCIStartError); // @ts-expect-error `ci` cannot be `true` is `precommit` is `true`: - const ciPrecommitStartError: BettererOptionsStart = { ci: true, precommit: true }; + const ciPrecommitStartError: BettererOptions = { ci: true, precommit: true }; noop(ciPrecommitStartError); // @ts-expect-error `watch` cannot be `true` is `ci` is `true`: - const watchCIStartError: BettererOptionsStart = { ci: true, watch: true }; + const watchCIStartError: BettererOptions = { ci: true, watch: true }; noop(watchCIStartError); // @ts-expect-error `update` cannot be `true` is `precommit` is `true`: - const updatePrecommitStartError: BettererOptionsStart = { precommit: true, update: true }; + const updatePrecommitStartError: BettererOptions = { precommit: true, update: true }; noop(updatePrecommitStartError); // @ts-expect-error `watch` cannot be `true` is `precommit` is `true`: - const watchPrecommitStartError: BettererOptionsStart = { precommit: true, watch: true }; + const watchPrecommitStartError: BettererOptions = { precommit: true, watch: true }; noop(watchPrecommitStartError); // @ts-expect-error `watch` cannot be assigned to `BettererOptionsStart`: - const watchStartError: BettererOptionsStart = { watch: true }; + const watchStartError: BettererOptions = { watch: true }; noop(watchStartError); // @ts-expect-error `ignores` cannot be assigned to `BettererOptionsStart`: - const ignoresStartError: BettererOptionsStart = { ignores: [] }; + const ignoresStartError: BettererOptions = { ignores: [] }; noop(ignoresStartError); // @ts-expect-error `ignores` cannot be assigned to `BettererOptionsRunner`: const runner: BettererOptionsRunner = { ignores: [] }; noop(runner); - // @ts-expect-error `ci` cannot be assigned to `BettererOptionsRunner`: - const ciRunnerError: BettererOptionsRunner = { ci: true }; - noop(ciRunnerError); - - // @ts-expect-error `precommit` cannot be assigned to `BettererOptionsRunner`: - const precommitRunnerError: BettererOptionsRunner = { precommit: true }; - noop(precommitRunnerError); - - // @ts-expect-error `strict` cannot be assigned to `BettererOptionsRunner`: - const strictRunnerError: BettererOptionsRunner = { strict: true }; - noop(strictRunnerError); - - // @ts-expect-error `update` cannot be assigned to `BettererOptionsRunner`: - const updateRunnerError: BettererOptionsRunner = { update: true }; - noop(updateRunnerError); - // @ts-expect-error `watch` cannot be assigned to `BettererOptionsRunner`: const watchRunnerError: BettererOptionsRunner = { watch: true }; noop(watchRunnerError); diff --git a/test/config-multiple.spec.ts b/test/config-multiple.spec.ts new file mode 100644 index 000000000..8288f091a --- /dev/null +++ b/test/config-multiple.spec.ts @@ -0,0 +1,55 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should work with multiple .betterer.ts files', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, resolve, cleanup, testNames } = await createFixture('config-multiple', { + 'grows.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const grows = persist(import.meta.url, 'grows', 0); + +export default { + grows: () => new BettererTest({ + test: () => grows.increment(), + constraint: bigger + }) +}; + `, + 'shrinks.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const shrinks = persist(import.meta.url, 'shrinks', 0); + +export default { + shrinks: () => new BettererTest({ + test: () => shrinks.decrement(), + constraint: smaller + }) +}; + ` + }); + + const configPaths = [resolve('grows.betterer.ts'), resolve('shrinks.betterer.ts')]; + const resultsPath = paths.results; + + const firstRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(firstRun.new)).toEqual(['grows', 'shrinks']); + + expect(logs).toMatchSnapshot(); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/config-named-exports.spec.ts b/test/config-named-exports.spec.ts index 5215c2025..992e94a44 100644 --- a/test/config-named-exports.spec.ts +++ b/test/config-named-exports.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work with named exports in the config file', async () => { @@ -11,7 +12,7 @@ import { BettererTest } from '@betterer/betterer'; import { bigger } from '@betterer/constraints'; import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); export const test = () => new BettererTest({ test: () => grows.increment(), diff --git a/test/config-no-esbuild.spec.ts b/test/config-no-esbuild.spec.ts new file mode 100644 index 000000000..c3affa6ba --- /dev/null +++ b/test/config-no-esbuild.spec.ts @@ -0,0 +1,40 @@ +import { describe, expect, it, vitest } from 'vitest'; + +import { createFixture } from './fixture.js'; + +vitest.mock('esbuild', (): null => { + return null; +}); + +const isNode16 = process.version.startsWith('v16'); + +describe('betterer', () => { + it.skipIf(isNode16)('should throw with a .betterer.ts file when esbuild is not available', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, cleanup, resolve } = await createFixture('config-no-esbuild', { + '.betterer.tsx': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; + +<{ FANCY NEW SYNTAX }> + +export default { + test: () => new BettererTest({ + test: () => , + constraint: bigger + }) +}; + ` + }); + + const configPaths = [resolve('.betterer.tsx')]; + const resultsPath = paths.results; + + await expect(async () => await betterer({ configPaths, resultsPath, workers: false })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/config-no-extension.spec.ts b/test/config-no-extension.spec.ts new file mode 100644 index 000000000..052ee2ab7 --- /dev/null +++ b/test/config-no-extension.spec.ts @@ -0,0 +1,37 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should work with a TS config file that has no extension', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, resolve, cleanup, testNames } = await createFixture('config-no-extension', { + '.betterer.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const grows = persist(import.meta.url, 'grows', 0); + +export default { + test: () => new BettererTest({ + test: () => grows.increment(), + constraint: bigger + }) +}; + ` + }); + + const configPaths = [resolve('.betterer')]; + const resultsPath = paths.results; + + const run = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(run.new)).toEqual(['test']); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/config-ts-esm.spec.ts b/test/config-ts-esm.spec.ts index a537576b0..ce337a523 100644 --- a/test/config-ts-esm.spec.ts +++ b/test/config-ts-esm.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work with a .betterer.ts file that uses ES modules', async () => { @@ -11,7 +12,7 @@ import { BettererTest } from '@betterer/betterer'; import { bigger } from '@betterer/constraints'; import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); export default { test: () => new BettererTest({ @@ -19,13 +20,6 @@ export default { constraint: bigger }) }; - `, - 'tsconfig.json': ` -{ - "compilerOptions": { - "module": "ESNext", - }, -} ` }); diff --git a/test/config-tsconfig.spec.ts b/test/config-tsconfig.spec.ts deleted file mode 100644 index 6d794403a..000000000 --- a/test/config-tsconfig.spec.ts +++ /dev/null @@ -1,51 +0,0 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; - -describe('betterer', () => { - it('should load a custom tsconfigPath', async () => { - const { betterer } = await import('@betterer/betterer'); - - const { logs, paths, resolve, cleanup } = await createFixture('config-tsconfig', { - '.betterer.ts': ` -import { BettererTest } from '@betterer/betterer'; -import { bigger } from '@betterer/constraints'; -import { test } from './test'; - -export default { - test: () => new BettererTest({ - test, - constraint: bigger - }) -}; - `, - 'test.ts': ` -import { persist } from '@betterer/fixture'; - -const grows = persist(__dirname, 'grows', 0); - -export function test (): number { - return grows.increment(); -} - `, - 'typescript.json': ` -{ - "compilerOptions": { - "target": "foo", - } -} - ` - }); - - const configPaths = [paths.config]; - const resultsPath = paths.results; - - // Test throws on purpose with the invalid "target" type: - await expect( - async () => await betterer({ configPaths, resultsPath, tsconfigPath: resolve('./typescript.json') }) - ).rejects.toThrow(); - - expect(logs).toMatchSnapshot(); - - await cleanup(); - }); -}); diff --git a/test/config-validation.spec.ts b/test/config-validation.spec.ts index fbcb145de..ca17b4efa 100644 --- a/test/config-validation.spec.ts +++ b/test/config-validation.spec.ts @@ -1,12 +1,13 @@ -import { jest } from '@jest/globals'; +import { describe, expect, it, vitest } from 'vitest'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { invariantΔ } from '@betterer/errors'; -jest.mock('node:os', (): typeof import('node:os') => { - const os = jest.requireActual('node:os') as typeof import('node:os'); +import { createFixture } from './fixture.js'; +vitest.mock('node:os', async (importOriginal): Promise => { + const os: typeof import('node:os') = await importOriginal(); const [cpu] = os.cpus(); + invariantΔ(cpu, 'There will always be at least one CPU or something is very wrong!'); return { ...os, cpus: () => [cpu] @@ -14,69 +15,61 @@ jest.mock('node:os', (): typeof import('node:os') => { }); describe('betterer', () => { - it('should throw when there is invalid config', async () => { + it.each([ + { cache: 1234 }, + { cache: 'betterer' }, + { cache: {} }, + { cachePath: 1234 }, + { cachePath: {} }, + { cachePath: true }, + { ci: 1234 }, + { ci: 'betterer' }, + { ci: {} }, + { configPaths: 1234 }, + { configPaths: true }, + { configPaths: {} }, + { configPaths: [1234] }, + { cwd: 1234 }, + { cwd: {} }, + { filters: 1234 }, + { filters: true }, + { filters: {} }, + { filters: [1234] }, + { logo: 1234 }, + { logo: {} }, + { logo: [1234] }, + { precommit: 1234 }, + { precommit: 'betterer' }, + { precommit: {} }, + { resultsPath: 1234 }, + { resultsPath: true }, + { resultsPath: {} }, + { silent: 1234 }, + { silent: 'betterer' }, + { silent: {} }, + { strict: 1234 }, + { strict: 'betterer' }, + { strict: {} }, + { update: 1234 }, + { update: 'betterer' }, + { update: {} }, + { workers: 'betterer' }, + { workers: NaN }, + { workers: {} }, + { workers: -1 }, + { workers: 1000 } + ])(`should throw when there is invalid config: %s`, async (config) => { const { betterer } = await import('@betterer/betterer'); const { cleanup, logs, paths } = await createFixture('config-validation', { '.betterer.js': '' }); + const configPaths = [paths.config]; const resultsPath = paths.results; - const tests = [ - { cache: 1234 }, - { cache: 'betterer' }, - { cache: {} }, - { cachePath: 1234 }, - { cachePath: {} }, - { cachePath: true }, - { ci: 1234 }, - { ci: 'betterer' }, - { ci: {} }, - { configPaths: 1234 }, - { configPaths: true }, - { configPaths: {} }, - { configPaths: [1234] }, - { cwd: 1234 }, - { cwd: {} }, - { filters: 1234 }, - { filters: true }, - { filters: {} }, - { filters: [1234] }, - { ignores: 1234 }, - { ignores: true }, - { ignores: {} }, - { ignores: [1234] }, - { logo: 1234 }, - { logo: {} }, - { logo: [1234] }, - { precommit: 1234 }, - { precommit: 'betterer' }, - { precommit: {} }, - { resultsPath: 1234 }, - { resultsPath: true }, - { resultsPath: {} }, - { silent: 1234 }, - { silent: 'betterer' }, - { silent: {} }, - { strict: 1234 }, - { strict: 'betterer' }, - { strict: {} }, - { update: 1234 }, - { update: 'betterer' }, - { update: {} }, - { workers: 'betterer' }, - { workers: NaN }, - { workers: {} }, - { workers: -1 }, - { workers: 1000 } - ]; - - await tests.reduce(async (p, config) => { - await p; - // @ts-expect-error testing config errors: - await expect(async () => await betterer({ configPaths, resultsPath, ...config })).rejects.toThrow(); - }, Promise.resolve()); + // @ts-expect-error testing invalid config + await expect(async () => await betterer({ configPaths, resultsPath, ...config })).rejects.toThrow(); expect(logs).toMatchSnapshot(); diff --git a/test/conflict.spec.ts b/test/conflict.spec.ts index 7ac6de7c9..05b87ed6a 100644 --- a/test/conflict.spec.ts +++ b/test/conflict.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work when there is a merge conflict in the results file', async () => { diff --git a/test/coverage-files-better.spec.ts b/test/coverage-files-better.spec.ts index 9995bfb53..4bb7224bb 100644 --- a/test/coverage-files-better.spec.ts +++ b/test/coverage-files-better.spec.ts @@ -1,15 +1,16 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report an improved file coverage result', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-files-better', { + const { paths, logs, cleanup, resolve, testNames, writeFile } = await createFixture('coverage-files-better', { '.betterer.js': ` -const { coverage } = require('@betterer/coverage'); +import { coverage } from '@betterer/coverage'; -module.exports = { +export default { test: () => coverage() }; `, @@ -21,10 +22,11 @@ module.exports = { ` }); - const file1Path = fixture.resolve('./src/file-1.ts'); - const file2Path = fixture.resolve('./src/file-2.ts'); + const file1Path = resolve('./src/file-1.ts'); + const file2Path = resolve('./src/file-2.ts'); - const coverage = `{ + const coverage = ` +{ "total": { "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -43,18 +45,20 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; - const coveragePath = fixture.resolve('./coverage/coverage-summary.json'); + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./coverage/coverage-summary.json'); - await fixture.writeFile(coveragePath, coverage); + await writeFile(coveragePath, coverage); await betterer({ configPaths, resultsPath, workers: false }); // file-1 is better - const betterCoverage = `{ + const betterCoverage = ` +{ "total": { "lines": { "total": 220, "covered": 120, "skipped": 0, "pct": 54.54 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -73,16 +77,18 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - await fixture.writeFile(coveragePath, betterCoverage); + await writeFile(coveragePath, betterCoverage); const betterTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(betterTestRun.better)).toEqual(['test']); + expect(testNames(betterTestRun.better)).toEqual(['test']); // file-1 is gone - const evenBetterCoverage = `{ + const evenBetterCoverage = ` +{ "total": { "lines": { "total": 120, "covered": 60, "skipped": 0, "pct": 50 }, "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, @@ -95,13 +101,14 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - await fixture.writeFile(coveragePath, evenBetterCoverage); + await writeFile(coveragePath, evenBetterCoverage); const evenBetterTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(evenBetterTestRun.better)).toEqual(['test']); + expect(testNames(evenBetterTestRun.better)).toEqual(['test']); // file-2 is fully covered const completedCoverage = `{ @@ -119,14 +126,14 @@ module.exports = { } }`; - await fixture.writeFile(coveragePath, completedCoverage); + await writeFile(coveragePath, completedCoverage); const completedTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(completedTestRun.completed)).toEqual(['test']); + expect(testNames(completedTestRun.completed)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/coverage-files-exclude.spec.ts b/test/coverage-files-exclude.spec.ts index eda6eb019..2b9ce8c82 100644 --- a/test/coverage-files-exclude.spec.ts +++ b/test/coverage-files-exclude.spec.ts @@ -1,15 +1,16 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work when excluding specific files', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-files-exclude', { + const { paths, logs, cleanup, resolve, testNames, writeFile } = await createFixture('coverage-files-exclude', { '.betterer.js': ` -const { coverage } = require('@betterer/coverage'); +import { coverage } from '@betterer/coverage'; -module.exports = { +export default { test: () => coverage().exclude(/file-2\\.ts/) }; `, @@ -18,13 +19,16 @@ module.exports = { "extends": "../../tsconfig.json", "include": ["./src/**/*", "./.betterer.js"] } - ` + `, + 'src/file-1.ts': '', // Empty on purpose, coverage data below is fake + 'src/file-2.ts': '' // Empty on purpose, coverage data below is fake }); - const file1Path = fixture.resolve('./src/file-1.ts'); - const file2Path = fixture.resolve('./src/file-2.ts'); + const file1Path = resolve('./src/file-1.ts'); + const file2Path = resolve('./src/file-2.ts'); - const coverage = `{ + const coverage = ` +{ "total": { "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -43,18 +47,20 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; - const coveragePath = fixture.resolve('./coverage/coverage-summary.json'); + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./coverage/coverage-summary.json'); - await fixture.writeFile(coveragePath, coverage); + await writeFile(coveragePath, coverage); await betterer({ configPaths, resultsPath, workers: false }); // file-1 is better - const betterCoverage = `{ + const betterCoverage = ` +{ "total": { "lines": { "total": 220, "covered": 120, "skipped": 0, "pct": 54.54 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -73,16 +79,18 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - await fixture.writeFile(coveragePath, betterCoverage); + await writeFile(coveragePath, betterCoverage); const betterTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(betterTestRun.better)).toEqual(['test']); + expect(testNames(betterTestRun.better)).toEqual(['test']); // file-2 is worse (but result is the same because it's excluded) - const sameCoverage = `{ + const sameCoverage = ` +{ "total": { "lines": { "total": 220, "covered": 100, "skipped": 0, "pct": 45.4 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -101,16 +109,17 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - await fixture.writeFile(coveragePath, sameCoverage); + await writeFile(coveragePath, sameCoverage); const sameTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(sameTestRun.same)).toEqual(['test']); + expect(testNames(sameTestRun.same)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/coverage-files-include.spec.ts b/test/coverage-files-include.spec.ts index 5c12156bf..6d9d46c47 100644 --- a/test/coverage-files-include.spec.ts +++ b/test/coverage-files-include.spec.ts @@ -1,11 +1,12 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work when including specific files', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-files-include', { + const { paths, logs, cleanup, resolve, testNames, writeFile } = await createFixture('coverage-files-include', { '.betterer.ts': ` import { coverage } from '@betterer/coverage'; @@ -18,13 +19,16 @@ export default { "extends": "../../tsconfig.json", "include": ["./src/**/*", "./.betterer.js"] } - ` + `, + 'src/file-1.ts': '', // Empty on purpose, coverage data below is fake + 'src/file-2.ts': '' // Empty on purpose, coverage data below is fake }); - const file1Path = fixture.resolve('./src/file-1.ts'); - const file2Path = fixture.resolve('./src/file-2.ts'); + const file1Path = resolve('./src/file-1.ts'); + const file2Path = resolve('./src/file-2.ts'); - const coverage = `{ + const coverage = ` +{ "total": { "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -43,18 +47,20 @@ export default { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; - const coveragePath = fixture.resolve('./coverage/coverage-summary.json'); + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./coverage/coverage-summary.json'); - await fixture.writeFile(coveragePath, coverage); + await writeFile(coveragePath, coverage); await betterer({ configPaths, resultsPath, workers: false }); // file-1 is better - const betterCoverage = `{ + const betterCoverage = ` +{ "total": { "lines": { "total": 220, "covered": 120, "skipped": 0, "pct": 54.54 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -73,16 +79,18 @@ export default { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - await fixture.writeFile(coveragePath, betterCoverage); + await writeFile(coveragePath, betterCoverage); const betterTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(betterTestRun.better)).toEqual(['test']); + expect(testNames(betterTestRun.better)).toEqual(['test']); // file-2 is worse (but result is the same because it's ignored) - const sameCoverage = `{ + const sameCoverage = ` +{ "total": { "lines": { "total": 220, "covered": 100, "skipped": 0, "pct": 45.4 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -101,16 +109,17 @@ export default { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - await fixture.writeFile(coveragePath, sameCoverage); + await writeFile(coveragePath, sameCoverage); const sameTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(sameTestRun.same)).toEqual(['test']); + expect(testNames(sameTestRun.same)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/coverage-files-same.spec.ts b/test/coverage-files-same.spec.ts index 8b8281757..850c84139 100644 --- a/test/coverage-files-same.spec.ts +++ b/test/coverage-files-same.spec.ts @@ -1,31 +1,36 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report a stable per-file coverage result', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-files-same', { - '.betterer.js': ` -const { coverage } = require('@betterer/coverage'); + const { paths, logs, cleanup, resolve, testNames, readFile, writeFile } = await createFixture( + 'coverage-files-same', + { + '.betterer.js': ` +import { coverage } from '@betterer/coverage'; -module.exports = { +export default { test: () => coverage() }; `, - 'tsconfig.json': ` + 'tsconfig.json': ` { "extends": "../../tsconfig.json", "include": ["./src/**/*", "./.betterer.js"] } - ` - }); + ` + } + ); - const file1Path = fixture.resolve('./src/file-1.ts'); - const file2Path = fixture.resolve('./src/file-2.ts'); - const file3Path = fixture.resolve('./src/file-3.ts'); + const file1Path = resolve('./src/file-1.ts'); + const file2Path = resolve('./src/file-2.ts'); + const file3Path = resolve('./src/file-3.ts'); - const coverage = `{ + const coverage = ` +{ "total": { "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -44,62 +49,66 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; - const coveragePath = fixture.resolve('./coverage/coverage-summary.json'); + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./coverage/coverage-summary.json'); - await fixture.writeFile(coveragePath, coverage); + await writeFile(coveragePath, coverage); const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(newTestRun.new)).toEqual(['test']); + expect(testNames(newTestRun.new)).toEqual(['test']); await betterer({ configPaths, resultsPath, workers: false }); const sameTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(sameTestRun.same)).toEqual(['test']); + expect(testNames(sameTestRun.same)).toEqual(['test']); + + const result = await readFile(resultsPath); - const result = await fixture.readFile(resultsPath); expect(result).toMatchSnapshot(); // file-3 is added but it is 100% covered - const stillSameCoverage = `{ - "total": { - "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, - "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, - "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, - "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } - }, - "${file1Path}": { - "lines": { "total": 100, "covered": 50, "skipped": 0, "pct": 50 }, - "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, - "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - }, - "${file2Path}": { - "lines": { "total": 120, "covered": 60, "skipped": 0, "pct": 50 }, - "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, - "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - }, - "${file3Path}": { - "lines": { "total": 120, "covered": 120, "skipped": 0, "pct": 100 }, - "statements": { "total": 210, "covered": 210, "skipped": 0, "pct": 100 }, - "functions": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, - "branches": { "total": 150, "covered": 150, "skipped": 0, "pct": 100 } - } - }`; + const stillSameCoverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 50, "skipped": 0, "pct": 50 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 60, "skipped": 0, "pct": 50 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file3Path}": { + "lines": { "total": 120, "covered": 120, "skipped": 0, "pct": 100 }, + "statements": { "total": 210, "covered": 210, "skipped": 0, "pct": 100 }, + "functions": { "total": 10, "covered": 10, "skipped": 0, "pct": 100 }, + "branches": { "total": 150, "covered": 150, "skipped": 0, "pct": 100 } + } +} + `; - await fixture.writeFile(coveragePath, stillSameCoverage); + await writeFile(coveragePath, stillSameCoverage); const stillSameTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(stillSameTestRun.same)).toEqual(['test']); + expect(testNames(stillSameTestRun.same)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/coverage-files-worse.spec.ts b/test/coverage-files-worse.spec.ts index 6cdaf6cfb..234a1b012 100644 --- a/test/coverage-files-worse.spec.ts +++ b/test/coverage-files-worse.spec.ts @@ -1,15 +1,16 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report a worse file coverage result', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-files-worse', { + const { paths, logs, cleanup, resolve, testNames, writeFile } = await createFixture('coverage-files-worse', { '.betterer.js': ` -const { coverage } = require('@betterer/coverage'); +import { coverage } from '@betterer/coverage'; -module.exports = { +export default { test: () => coverage() }; `, @@ -21,11 +22,12 @@ module.exports = { ` }); - const file1Path = fixture.resolve('./src/file-1.ts'); - const file2Path = fixture.resolve('./src/file-2.ts'); - const file3Path = fixture.resolve('./src/file-3.ts'); + const file1Path = resolve('./src/file-1.ts'); + const file2Path = resolve('./src/file-2.ts'); + const file3Path = resolve('./src/file-3.ts'); - const coverage = `{ + const coverage = ` +{ "total": { "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, @@ -44,108 +46,115 @@ module.exports = { "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; - const coveragePath = fixture.resolve('./coverage/coverage-summary.json'); + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./coverage/coverage-summary.json'); - await fixture.writeFile(coveragePath, coverage); + await writeFile(coveragePath, coverage); await betterer({ configPaths, resultsPath, workers: false }); // file-1 is worse - const worseCoverage = `{ - "total": { - "lines": { "total": 220, "covered": 100, "skipped": 0, "pct": 45.4 }, - "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, - "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, - "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } - }, - "${file1Path}": { - "lines": { "total": 100, "covered": 40, "skipped": 0, "pct": 40 }, - "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, - "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - }, - "${file2Path}": { - "lines": { "total": 120, "covered": 60, "skipped": 0, "pct": 50 }, - "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, - "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - } - }`; - - await fixture.writeFile(coveragePath, worseCoverage); + const worseCoverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 100, "skipped": 0, "pct": 45.4 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 40, "skipped": 0, "pct": 40 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 60, "skipped": 0, "pct": 50 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; + + await writeFile(coveragePath, worseCoverage); const worseTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(worseTestRun.worse)).toEqual(['test']); + expect(testNames(worseTestRun.worse)).toEqual(['test']); // file-1 is better, but file-2 is worse - const stillWorseCoverage = `{ - "total": { - "lines": { "total": 220, "covered": 90, "skipped": 0, "pct": 40.9 }, - "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, - "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, - "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } - }, - "${file1Path}": { - "lines": { "total": 100, "covered": 60, "skipped": 0, "pct": 60 }, - "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, - "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - }, - "${file2Path}": { - "lines": { "total": 120, "covered": 30, "skipped": 0, "pct": 25 }, - "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, - "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - } - }`; - - await fixture.writeFile(coveragePath, stillWorseCoverage); + const stillWorseCoverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 90, "skipped": 0, "pct": 40.9 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 60, "skipped": 0, "pct": 60 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 30, "skipped": 0, "pct": 25 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; + + await writeFile(coveragePath, stillWorseCoverage); const stillWorseTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(stillWorseTestRun.worse)).toEqual(['test']); + expect(testNames(stillWorseTestRun.worse)).toEqual(['test']); // file-3 is added but it is not 100% covered - const evenWorseCoverage = `{ - "total": { - "lines": { "total": 320, "covered": 150, "skipped": 0, "pct": 46.8 }, - "statements": { "total": 610, "covered": 210, "skipped": 0, "pct": 34.4 }, - "functions": { "total": 50, "covered": 16, "skipped": 0, "pct": 32 }, - "branches": { "total": 450, "covered": 150, "skipped": 0, "pct": 33.3 } - }, - "${file1Path}": { - "lines": { "total": 100, "covered": 60, "skipped": 0, "pct": 60 }, - "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, - "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - }, - "${file2Path}": { - "lines": { "total": 120, "covered": 30, "skipped": 0, "pct": 25 }, - "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, - "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - }, - "${file3Path}": { - "lines": { "total": 100, "covered": 60, "skipped": 0, "pct": 60 }, - "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, - "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, - "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } - } - }`; - - await fixture.writeFile(coveragePath, evenWorseCoverage); + const evenWorseCoverage = ` +{ + "total": { + "lines": { "total": 320, "covered": 150, "skipped": 0, "pct": 46.8 }, + "statements": { "total": 610, "covered": 210, "skipped": 0, "pct": 34.4 }, + "functions": { "total": 50, "covered": 16, "skipped": 0, "pct": 32 }, + "branches": { "total": 450, "covered": 150, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 60, "skipped": 0, "pct": 60 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 30, "skipped": 0, "pct": 25 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file3Path}": { + "lines": { "total": 100, "covered": 60, "skipped": 0, "pct": 60 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; + + await writeFile(coveragePath, evenWorseCoverage); const evenWorseTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(evenWorseTestRun.worse)).toEqual(['test']); + expect(testNames(evenWorseTestRun.worse)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/coverage-report-invalid.spec.ts b/test/coverage-report-invalid.spec.ts index 8de7e9e86..92559e3d6 100644 --- a/test/coverage-report-invalid.spec.ts +++ b/test/coverage-report-invalid.spec.ts @@ -1,15 +1,16 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should fail when the coverage report is invalid', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-report-invalid', { + const { paths, logs, cleanup, resolve, testNames, writeFile } = await createFixture('coverage-report-invalid', { '.betterer.js': ` -const { coverageTotal } = require('@betterer/coverage'); +import { coverageTotal } from '@betterer/coverage'; -module.exports = { +export default { test: () => coverageTotal() }; `, @@ -29,18 +30,18 @@ module.exports = { } }`; - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; - const coveragePath = fixture.resolve('./coverage/coverage-summary.json'); + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./coverage/coverage-summary.json'); - await fixture.writeFile(coveragePath, coverage); + await writeFile(coveragePath, coverage); const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(newTestRun.failed)).toEqual(['test']); + expect(testNames(newTestRun.failed)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/coverage-report-missing.spec.ts b/test/coverage-report-missing.spec.ts index 8af0bf47b..837ad6f22 100644 --- a/test/coverage-report-missing.spec.ts +++ b/test/coverage-report-missing.spec.ts @@ -1,15 +1,16 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should fail when the coverage report is missing', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-report-missing', { + const { paths, logs, cleanup, testNames } = await createFixture('coverage-report-missing', { '.betterer.js': ` -const { coverageTotal } = require('@betterer/coverage'); +import { coverageTotal } from '@betterer/coverage'; -module.exports = { +export default { test: () => coverageTotal() }; `, @@ -21,15 +22,15 @@ module.exports = { ` }); - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; + const configPaths = [paths.config]; + const resultsPath = paths.results; const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(newTestRun.failed)).toEqual(['test']); + expect(testNames(newTestRun.failed)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/coverage-total-include.spec.ts b/test/coverage-total-include.spec.ts new file mode 100644 index 000000000..e3255a873 --- /dev/null +++ b/test/coverage-total-include.spec.ts @@ -0,0 +1,146 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should report the total coverage for included files', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup, resolve, readFile, testNames, writeFile } = await createFixture( + 'coverage-total-include', + { + '.betterer.js': ` +import { coverageTotal } from '@betterer/coverage'; + +export default { + test: () => coverageTotal('./my-report/coverage.json').include('**/file-1.ts') +}; + `, + 'tsconfig.json': ` +{ + "extends": "../../tsconfig.json", + "include": ["./src/**/*", "./.betterer.js"] +} + `, + 'src/file-1.ts': '', // Empty on purpose, coverage data below is fake + 'src/file-2.ts': '' // Empty on purpose, coverage data below is fake + } + ); + + const file1Path = resolve('./src/file-1.ts'); + const file2Path = resolve('./src/file-2.ts'); + + const coverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 50, "skipped": 0, "pct": 50 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 60, "skipped": 0, "pct": 50 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./my-report/coverage.json'); + + await writeFile(coveragePath, coverage); + + const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['test']); + + const newResult = await readFile(resultsPath); + + expect(newResult).toMatchSnapshot(); + + const sameTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(sameTestRun.same)).toEqual(['test']); + + // Included file gets better, ignored file gets worse: + const betterCoverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 61.9 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 70, "skipped": 0, "pct": 50 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 40, "skipped": 0, "pct": 33.3 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; + + await writeFile(coveragePath, betterCoverage); + + const betterTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(betterTestRun.better)).toEqual(['test']); + + const betterResult = await readFile(resultsPath); + + expect(betterResult).toMatchSnapshot(); + + // Included file gets worse, included file gets better: + const worseCoverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 61.9 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 40, "skipped": 0, "pct": 40 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 80, "skipped": 0, "pct": 66.6 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; + + await writeFile(coveragePath, worseCoverage); + + const worseTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(worseTestRun.worse)).toEqual(['test']); + + const worseResult = await readFile(resultsPath); + + expect(worseResult).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/coverage-total.spec.ts b/test/coverage-total.spec.ts index c6089fdcd..fc942a973 100644 --- a/test/coverage-total.spec.ts +++ b/test/coverage-total.spec.ts @@ -1,18 +1,17 @@ -import type { BettererCoverageIssues } from '@betterer/coverage'; +import { describe, expect, it } from 'vitest'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the total coverage', async () => { const { betterer } = await import('@betterer/betterer'); - const fixture = await createFixture('coverage-total', { + const { paths, logs, cleanup, resolve, readFile, testNames, writeFile } = await createFixture('coverage-total', { '.betterer.js': ` -const { coverageTotal } = require('@betterer/coverage'); +import { coverageTotal } from '@betterer/coverage'; -module.exports = { - test: () => coverageTotal() +export default { + test: () => coverageTotal('./my-report/coverage.json') }; `, 'tsconfig.json': ` @@ -23,75 +22,110 @@ module.exports = { ` }); - const coverage = `{ + const file1Path = resolve('./src/file-1.ts'); + const file2Path = resolve('./src/file-2.ts'); + + const coverage = ` +{ "total": { "lines": { "total": 220, "covered": 110, "skipped": 0, "pct": 50 }, "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 50, "skipped": 0, "pct": 50 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 60, "skipped": 0, "pct": 50 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } } -}`; +} + `; - const configPaths = [fixture.paths.config]; - const resultsPath = fixture.paths.results; - const coveragePath = fixture.resolve('./coverage/coverage-summary.json'); + const configPaths = [paths.config]; + const resultsPath = paths.results; + const coveragePath = resolve('./my-report/coverage.json'); - await fixture.writeFile(coveragePath, coverage); + await writeFile(coveragePath, coverage); const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(newTestRun.new)).toEqual(['test']); + expect(testNames(newTestRun.new)).toEqual(['test']); - const result = await fixture.readFile(resultsPath); + const result = await readFile(resultsPath); expect(result).toMatchSnapshot(); const sameTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(sameTestRun.same)).toEqual(['test']); - - const [sameSummary] = sameTestRun.same; - const testResult = sameSummary.result?.value as BettererCoverageIssues; - - expect(testResult.total).toEqual({ - lines: 220 - 110, - statements: 410 - 140, - functions: 30 - 11, - branches: 300 - 100 - }); + expect(testNames(sameTestRun.same)).toEqual(['test']); - const betterCoverage = `{ - "total": { - "lines": { "total": 220, "covered": 210, "skipped": 0, "pct": 95.4 }, - "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, - "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, - "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } - } - }`; + const betterCoverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 210, "skipped": 0, "pct": 95.4 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 100, "skipped": 0, "pct": 33.3 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 100, "skipped": 0, "pct": 100 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 110, "skipped": 0, "pct": 91.6 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; - await fixture.writeFile(coveragePath, betterCoverage); + await writeFile(coveragePath, betterCoverage); const betterTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(betterTestRun.better)).toEqual(['test']); + expect(testNames(betterTestRun.better)).toEqual(['test']); - const worseCoverage = `{ - "total": { - "lines": { "total": 220, "covered": 210, "skipped": 0, "pct": 95.4 }, - "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, - "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, - "branches": { "total": 300, "covered":90, "skipped": 0, "pct": 30 } - } - }`; + const worseCoverage = ` +{ + "total": { + "lines": { "total": 220, "covered": 210, "skipped": 0, "pct": 95.4 }, + "statements": { "total": 410, "covered": 140, "skipped": 0, "pct": 34.1 }, + "functions": { "total": 30, "covered": 11, "skipped": 0, "pct": 36.6 }, + "branches": { "total": 300, "covered": 90, "skipped": 0, "pct": 30 } + }, + "${file1Path}": { + "lines": { "total": 100, "covered": 100, "skipped": 0, "pct": 100 }, + "statements": { "total": 200, "covered": 70, "skipped": 0, "pct": 35 }, + "functions": { "total": 20, "covered": 5, "skipped": 0, "pct": 25 }, + "branches": { "total": 150, "covered": 40, "skipped": 0, "pct": 26.6 } + }, + "${file2Path}": { + "lines": { "total": 120, "covered": 110, "skipped": 0, "pct": 91.6 }, + "statements": { "total": 210, "covered": 70, "skipped": 0, "pct": 33.3 }, + "functions": { "total": 10, "covered": 6, "skipped": 0, "pct": 60 }, + "branches": { "total": 150, "covered": 50, "skipped": 0, "pct": 33.3 } + } +} + `; - await fixture.writeFile(coveragePath, worseCoverage); + await writeFile(coveragePath, worseCoverage); const worseTestRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(fixture.testNames(worseTestRun.worse)).toEqual(['test']); + expect(testNames(worseTestRun.worse)).toEqual(['test']); - expect(fixture.logs).toMatchSnapshot(); + expect(logs).toMatchSnapshot(); - await fixture.cleanup(); + await cleanup(); }); }); diff --git a/test/deadline-file-test-expired.spec.ts b/test/deadline-file-test-expired.spec.ts index e8b8245a6..b09b9b881 100644 --- a/test/deadline-file-test-expired.spec.ts +++ b/test/deadline-file-test-expired.spec.ts @@ -1,16 +1,14 @@ -import { jest } from '@jest/globals'; +import { describe, expect, it, vitest } from 'vitest'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; - -jest.resetModules(); -jest.mock('@betterer/time', (): typeof import('@betterer/time') => { - const time = jest.requireActual('@betterer/time') as typeof import('@betterer/time'); +import { createFixture } from './fixture.js'; +vitest.resetModules(); +vitest.mock('@betterer/time', async (importOriginal): Promise => { + const time: typeof import('@betterer/time') = await importOriginal(); return { ...time, - getPreciseTime__: () => 0, - getTime__: () => Date.now() + getPreciseTimeΔ: () => 0, + getTimeΔ: () => Date.now() }; }); diff --git a/test/deadline-future.spec.ts b/test/deadline-future.spec.ts index 90defebe2..94bbbe301 100644 --- a/test/deadline-future.spec.ts +++ b/test/deadline-future.spec.ts @@ -1,16 +1,14 @@ -import { jest } from '@jest/globals'; +import { describe, expect, it, vitest } from 'vitest'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; - -jest.resetModules(); -jest.mock('@betterer/time', (): typeof import('@betterer/time') => { - const time = jest.requireActual('@betterer/time') as typeof import('@betterer/time'); +import { createFixture } from './fixture.js'; +vitest.resetModules(); +vitest.mock('@betterer/time', async (importOriginal): Promise => { + const time: typeof import('@betterer/time') = await importOriginal(); return { ...time, - getPreciseTime__: () => 0, - getTime__: () => 1589714460851 + getPreciseTimeΔ: () => 0, + getTimeΔ: () => 1589714460851 }; }); @@ -20,13 +18,13 @@ describe('betterer', () => { const { logs, paths, readFile, cleanup, testNames } = await createFixture('deadline-future', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); -module.exports = { +export default { test: () => new BettererTest({ test: () => grows.increment(), constraint: bigger, diff --git a/test/deadline-invalid.spec.ts b/test/deadline-invalid.spec.ts new file mode 100644 index 000000000..70514f82a --- /dev/null +++ b/test/deadline-invalid.spec.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should do throw when the deadline is not a valid date', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, cleanup } = await createFixture('deadline-invalid', { + '.betterer.js': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const grows = persist(import.meta.url, 'grows', 0); + +export default { + test: () => new BettererTest({ + test: () => grows.increment(), + constraint: bigger, + deadline: 'Oi oi oi' + }) +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await expect(async () => await betterer({ configPaths, resultsPath, workers: false })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/deadline-test-expired.spec.ts b/test/deadline-test-expired.spec.ts index 5c341e8dc..5b2307e30 100644 --- a/test/deadline-test-expired.spec.ts +++ b/test/deadline-test-expired.spec.ts @@ -1,7 +1,8 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it, vitest } from 'vitest'; -jest.resetModules(); +import { createFixture } from './fixture.js'; + +vitest.resetModules(); describe('betterer', () => { it('should mark a test as expired when it is past its deadline', async () => { @@ -9,13 +10,13 @@ describe('betterer', () => { const { logs, paths, readFile, cleanup, testNames } = await createFixture('deadline-test-expired', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); -module.exports = { +export default { test: () => new BettererTest({ test: () => grows.increment(), constraint: bigger, diff --git a/test/dependencies/src/index.tsx b/test/dependencies/src/index.tsx index 20a930656..ca1e6fda2 100644 --- a/test/dependencies/src/index.tsx +++ b/test/dependencies/src/index.tsx @@ -2,9 +2,9 @@ import type { BettererLogger } from '@betterer/logger'; import type { FC } from '@betterer/render'; import type { BettererTasksState } from '@betterer/tasks'; -import { React, getRenderOptions, render, useCallback } from '@betterer/render'; +import { React, getRenderOptionsΔ, render, useCallback } from '@betterer/render'; import { BettererTaskLogger, BettererTasksLogger } from '@betterer/tasks'; -import { exposeToWorker__, importWorker__ } from '@betterer/worker'; +import { exposeToWorkerΔ, importWorkerΔ } from '@betterer/worker'; import type { TestPackageDependenciesWorker } from './types.js'; @@ -17,15 +17,15 @@ export const DependenciesTest: FC = function Dependencies {packageNames.map((packageName) => { const task = useCallback( - async (logger: BettererLogger) => { - const worker: TestPackageDependenciesWorker = importWorker__('./test-package-dependencies.worker.js'); + async (logger: BettererLogger, status: BettererLogger) => { + const worker: TestPackageDependenciesWorker = await importWorkerΔ('./test-package-dependencies.worker.js'); try { - await worker.api.run(exposeToWorker__(logger), packageName); + await worker.api.run(exposeToWorkerΔ(logger), exposeToWorkerΔ(status), packageName); } finally { await worker.destroy(); } }, - [packageName, exposeToWorker__] + [packageName, exposeToWorkerΔ] ); return ; })} @@ -42,14 +42,14 @@ function update(state: BettererTasksState): string { } function tests(n: number): string { - return `${n} ${n === 1 ? 'test' : 'tests'}`; + return `${String(n)} ${n === 1 ? 'test' : 'tests'}`; } void (async () => { - const worker: TestPackageDependenciesWorker = importWorker__('./test-package-dependencies.worker.js'); + const worker: TestPackageDependenciesWorker = await importWorkerΔ('./test-package-dependencies.worker.js'); const test = render( , - getRenderOptions(process.env.NODE_ENV) + getRenderOptionsΔ(process.env.NODE_ENV) ); await worker.destroy(); await test.waitUntilExit(); diff --git a/test/dependencies/src/test-package-dependencies.worker.ts b/test/dependencies/src/test-package-dependencies.worker.ts index 370c11578..b86fd55d3 100644 --- a/test/dependencies/src/test-package-dependencies.worker.ts +++ b/test/dependencies/src/test-package-dependencies.worker.ts @@ -1,17 +1,23 @@ import type { BettererLogger } from '@betterer/logger'; +import type { KnipIssue, KnipIssues, KnipIssuesByType, KnipIssueType, KnipReport } from './types.js'; -import { BettererError } from '@betterer/errors'; -import { exposeToMain__ } from '@betterer/worker'; +import { BettererError, invariantΔ } from '@betterer/errors'; +import { exposeToMainΔ } from '@betterer/worker'; import { promises as fs } from 'node:fs'; import path from 'node:path'; -import dependencyCheck from 'dependency-check'; +import { fileURLToPath } from 'node:url'; +import { exec } from 'node:child_process'; +import { promisify } from 'node:util'; + +const asyncExec = promisify(exec); const EXCLUDED_PACKAGES = ['docgen', 'extension', 'fixture']; -const PACKAGES_DIR = path.resolve(__dirname, '../../../packages'); -const IGNORED: Record> = { - render: ['bufferutil', 'utf-8-validate'] -}; +// This is probably a bit fragile 😅 +import { ISSUE_TYPE_TITLE } from 'knip/dist/constants.js'; + +const __dirname = path.dirname(fileURLToPath(import.meta.url)); +const PACKAGES_DIR = path.resolve(__dirname, '../../../packages'); export async function getPackages(): Promise> { const items = await fs.readdir(PACKAGES_DIR); @@ -29,27 +35,74 @@ export async function getPackages(): Promise> { }); } -export async function run(logger: BettererLogger, packageName: string): Promise { +export async function run(logger: BettererLogger, status: BettererLogger, packageName: string): Promise { const packageNameFull = `@betterer/${packageName}`; - await logger.progress(`Validating dependencies for "${packageNameFull}" ...`); + await status.progress(`Validating dependencies for "${packageNameFull}" ...`); - const parsed = await dependencyCheck({ - path: path.resolve(PACKAGES_DIR, packageName), - entries: ['package.json'] - }); + const { stdout } = await asyncExec( + `npm run knip -- --no-exit-code --reporter=json --workspace=packages/${packageName}` + ); + + const lines = stdout.split('\n').filter(Boolean); + const lastLine = lines.at(-1); + invariantΔ(lastLine, `\`lastLine\` should be the JSON output from knip!`); + + let report: KnipReport; + try { + report = JSON.parse(lastLine) as KnipReport; + } catch (error) { + throw new BettererError(`Couldn't parse JSON output from knip. ❌`, error as Error); + } + + const issuesByType: KnipIssuesByType = {}; + report.issues.map((filesIssues) => { + const filePath = filesIssues.file; - const missing = await dependencyCheck.missing(parsed.package, parsed.used); - const removeBuiltIns = missing.filter((dependency) => !dependency.startsWith('node:')); - const errors = removeBuiltIns.filter((dependency) => !IGNORED[packageName]?.includes(dependency)); + const entries = Object.entries(filesIssues).filter((entry): entry is [KnipIssueType, KnipIssues] => { + const [key, issues] = entry; + return isIssueType(key) && Array.isArray(issues) && issues.length !== 0; + }); + + if (!entries.length) { + return; + } + + entries.forEach(([issueType, issues]) => { + issuesByType[issueType] ??= {}; + const issuesForIssueType = issuesByType[issueType]; + issuesForIssueType[filePath] = [...(issuesForIssueType[filePath] ?? []), ...issues]; + }); + }); // Fight with race condition in Comlink 😡 await new Promise((resolve) => setTimeout(resolve, 50)); - if (!errors.length) { - return `No missing dependencies found in "${packageNameFull}".`; + const errors: Array = []; + Object.entries(issuesByType).forEach(([issueType, issues]) => { + const title = ISSUE_TYPE_TITLE[issueType as KnipIssueType]; + errors.push(`\n${title.toUpperCase()}:`); + Object.entries(issues).forEach(([filePath, issues]) => { + errors.push(...issues.map((issue) => `${issue.name} - ${getFilePath(filePath, issue)}`)); + }); + }); + + if (errors.length) { + await Promise.all(errors.map((error) => logger.error(error))); + throw new BettererError(`Dependency issues found in "${packageNameFull}"`); } - throw new BettererError(`Missing dependencies found in "${packageNameFull}": ${errors.join(', ')}`); + return `No dependency issues found in "${packageNameFull}".`; +} + +function isIssueType(key: unknown): key is KnipIssueType { + return !!ISSUE_TYPE_TITLE[key as KnipIssueType]; +} + +function getFilePath(filePath: string, issue: KnipIssue): string { + if (!(issue.line && issue.col)) { + return filePath; + } + return `${filePath}:${String(issue.line)}:${String(issue.col)}`; } -exposeToMain__({ getPackages, run }); +exposeToMainΔ({ getPackages, run }); diff --git a/test/dependencies/src/types.ts b/test/dependencies/src/types.ts index eccafbefd..8d37ac770 100644 --- a/test/dependencies/src/types.ts +++ b/test/dependencies/src/types.ts @@ -1,3 +1,34 @@ import type { BettererWorkerAPI } from '@betterer/worker'; +import type { ISSUE_TYPE_TITLE } from 'knip/dist/constants.js'; export type TestPackageDependenciesWorker = BettererWorkerAPI; + +/** + * @remarks + */ + +export type KnipIssueType = keyof typeof ISSUE_TYPE_TITLE; + +export interface KnipIssue { + line: number; + col: number; + name: string; +} + +export type KnipIssues = ReadonlyArray; + +export type KnipFileIssues = { + file: string; +} & { + [IssueType in KnipIssueType]: KnipIssues; +}; + +export type KnipFilesIssues = ReadonlyArray; + +export type KnipIssuesForFile = Record; +export type KnipIssuesByType = Partial>; + +export interface KnipReport { + files: Array; + issues: KnipFilesIssues; +} diff --git a/test/eslint-complex-project.spec.ts b/test/eslint-complex-project.spec.ts index 252a0fbcd..ebac990a2 100644 --- a/test/eslint-complex-project.spec.ts +++ b/test/eslint-complex-project.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the status of a new eslint rule with a complex set up', async () => { @@ -12,49 +13,52 @@ describe('betterer', () => { import { eslint } from '@betterer/eslint'; export default { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.base.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], + { rules: { 'no-debugger': 'off' } } +); + `, + 'eslint.config.js': ` +import config from './eslint.base.config.js'; + +export default [...config, { rules: { - 'no-debugger': 1 + '@typescript-eslint/prefer-string-starts-ends-with': 'error' } -}; - `, +}]; + `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", ".betterer.ts", "./.eslintrc.js"] + "include": ["./src/**/*"] } `, - 'src/index.ts': ` -debugger; - `, - 'src/directory/.eslintrc.js': ` -module.exports = { - rules: { - '@typescript-eslint/prefer-string-starts-ends-with': 'error' - } -}; - `, + 'src/directory/index.ts': ` -'hello'[0] === 'h'; +export const result = 'hello'[0] === 'h'; export enum Numbers { one, @@ -69,6 +73,7 @@ export enum Numbers { const configPaths = [paths.config]; const resultsPath = paths.results; const indexPath = resolve('./src/index.ts'); + const deepIndexPath = resolve('./src/directory/index.ts'); await writeFile(indexPath, `debugger;`); @@ -91,6 +96,10 @@ export enum Numbers { expect(result).toMatchSnapshot(); await writeFile(indexPath, ``); + await writeFile( + deepIndexPath, + `export const result = 'hello'.startsWith('h');\n\nexport enum Numbers {\n one,\n two,\n three,\n four\n}` + ); const betterTestRun = await betterer({ configPaths, resultsPath, workers: false }); diff --git a/test/eslint-complex-rule.spec.ts b/test/eslint-complex-rule.spec.ts index b295e9af3..4b29374e6 100644 --- a/test/eslint-complex-rule.spec.ts +++ b/test/eslint-complex-rule.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should handle complex eslint rule options', async () => { @@ -10,43 +11,44 @@ describe('betterer', () => { import { eslint } from '@betterer/eslint'; export default { - test: () => eslint({ - 'no-restricted-syntax': [ - 'error', - { - selector: 'ExportDefaultDeclaration', - message: 'Prefer named exports' - } - ] - }).include('./src/**/*.ts') + test: () => eslint({ + rules: { + 'no-restricted-syntax': [ + 'error', + { + selector: 'ExportDefaultDeclaration', + message: 'Prefer named exports' + } + ] + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; + { rules: { 'no-debugger': 'off' } } +); `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", ".betterer.ts", "./.eslintrc.js"] + "include": ["./src/**/*"] } ` }); diff --git a/test/eslint-files-config.spec.ts b/test/eslint-files-config.spec.ts new file mode 100644 index 000000000..6027aabff --- /dev/null +++ b/test/eslint-files-config.spec.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should throw if there are files options included in the config', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup } = await createFixture('eslint-files-config', { + '.betterer.js': ` +import { eslint } from '@betterer/eslint'; + +export default { + test: () => eslint({ files: [] }).include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await expect(async () => await betterer({ configPaths, resultsPath, workers: false })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/eslint-ignores-config.spec.ts b/test/eslint-ignores-config.spec.ts new file mode 100644 index 000000000..c3b88aa34 --- /dev/null +++ b/test/eslint-ignores-config.spec.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should throw if there are ignores options included in the config', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup } = await createFixture('eslint-ignores-config', { + '.betterer.js': ` +import { eslint } from '@betterer/eslint'; + +export default { + test: () => eslint({ ignores: [] }).include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await expect(async () => await betterer({ configPaths, resultsPath, workers: false })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/eslint-no-column-rule.spec.ts b/test/eslint-no-column-rule.spec.ts new file mode 100644 index 000000000..96902ca7d --- /dev/null +++ b/test/eslint-no-column-rule.spec.ts @@ -0,0 +1,69 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + // See: https://github.com/phenomnomnominal/betterer/issues/1202 + it('should handle eslint rules that mark the entire line of code', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, cleanup, resolve, writeFile } = await createFixture('eslint-no-column-rule', { + '.betterer.ts': ` +import { eslint } from '@betterer/eslint'; + +export default { + test: () => eslint({ + rules: { + '@eslint-community/eslint-comments/require-description': 'error' + } + }) + .include('./src/**/*.ts') +}; + `, + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; +import comments from '@eslint-community/eslint-plugin-eslint-comments/configs'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + comments.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, + }, + { rules: { '@eslint-community/eslint-comments/require-description': 'off' } } +); + `, + 'tsconfig.json': ` +{ + "include": ["./src/**/*"] +} + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, `// eslint-disable-next-line\ndebugger;`); + + await betterer({ configPaths, resultsPath, workers: false }); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/eslint-no-config.spec.ts b/test/eslint-no-config.spec.ts index 51791833f..7eeef13d3 100644 --- a/test/eslint-no-config.spec.ts +++ b/test/eslint-no-config.spec.ts @@ -1,17 +1,18 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { - it('should throw if there are no config', async () => { + it('should throw when trying to run ESLint with no config', async () => { const { betterer } = await import('@betterer/betterer'); const { paths, logs, cleanup } = await createFixture('eslint-no-config', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); +import { eslint } from '@betterer/eslint'; -module.exports = { +export default { test: () => eslint().include('./src/**/*.ts') -}; +}; ` }); diff --git a/test/eslint-plugin-rules.spec.ts b/test/eslint-plugin-rules.spec.ts new file mode 100644 index 000000000..3371e1b5e --- /dev/null +++ b/test/eslint-plugin-rules.spec.ts @@ -0,0 +1,68 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should handle eslint rule from other plugins', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, cleanup, resolve, writeFile } = await createFixture('eslint-plugin-rules', { + '.betterer.ts': ` +import { eslint } from '@betterer/eslint'; + +export default { + test: () => eslint({ + rules: { + '@eslint-community/eslint-comments/no-unlimited-disable': 'error' + } + }) + .include('./src/**/*.ts') +}; + `, + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; +import comments from '@eslint-community/eslint-plugin-eslint-comments/configs'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + comments.recommended, + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, + }, + { rules: { 'no-debugger': 'off' } } +); + `, + 'tsconfig.json': ` +{ + "include": ["./src/**/*"] +} + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, `/* eslint-disable */`); + + await betterer({ configPaths, resultsPath, workers: false }); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/eslint.spec.ts b/test/eslint.spec.ts index 2b7913985..f93f9e4b2 100644 --- a/test/eslint.spec.ts +++ b/test/eslint.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the status of a new eslint rule', async () => { @@ -7,38 +8,41 @@ describe('betterer', () => { const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('eslint', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); - -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') +import { eslint } from '@betterer/eslint'; + +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; + { rules: { 'no-debugger': 'off' } } +); `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } ` }); diff --git a/test/exclude-files.spec.ts b/test/exclude-files.spec.ts index 773528485..4fe347a49 100644 --- a/test/exclude-files.spec.ts +++ b/test/exclude-files.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should exclude specific files from results', async () => { @@ -17,7 +18,7 @@ export default { import { regexp } from '@betterer/regexp'; export default { - test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts').exclude(/exclude.ts/) + test: () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts').exclude(/exclude.ts/).exclude('**/exclude-glob.ts') }; ` }); @@ -27,6 +28,7 @@ export default { await writeFile(resolve('./src/index.ts'), '// Hack'); await writeFile(resolve('./src/exclude.ts'), '// Hack'); + await writeFile(resolve('./src/exclude-glob.ts'), '// Hack'); await betterer({ configPaths, resultsPath, workers: false }); diff --git a/test/exclude-global.spec.ts b/test/exclude-global.spec.ts index 3dcb77cf0..2177a95ec 100644 --- a/test/exclude-global.spec.ts +++ b/test/exclude-global.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should handle a global exclude', async () => { diff --git a/test/failed-test-error.spec.ts b/test/failed-test-error.spec.ts index 9364daadf..3cd8645d9 100644 --- a/test/failed-test-error.spec.ts +++ b/test/failed-test-error.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it(`should work when a test fails`, async () => { @@ -7,10 +8,10 @@ describe('betterer', () => { const { logs, paths, cleanup, testNames } = await createFixture('failed-test-error', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; -module.exports = { +export default { test: () => new BettererTest({ test: () => { throw new Error('OH NO!'); diff --git a/test/file-test-constraint.spec.ts b/test/file-test-constraint.spec.ts index f7e6ddbde..e29074b1c 100644 --- a/test/file-test-constraint.spec.ts +++ b/test/file-test-constraint.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should let you override the constraint of a file test', async () => { @@ -9,41 +10,45 @@ describe('betterer', () => { 'file-test-constraint', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); -const { BettererConstraintResult } = require('@betterer/constraints'); +import { eslint } from '@betterer/eslint'; +import { BettererConstraintResult } from '@betterer/constraints'; -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts').constraint(() => BettererConstraintResult.same) +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') + .constraint(() => BettererConstraintResult.same) }; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; - `, + { rules: { 'no-debugger': 'off' } } +); + `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } - ` + ` } ); diff --git a/test/file-test-goal.spec.ts b/test/file-test-goal.spec.ts index e692c5f89..9f4d95dd7 100644 --- a/test/file-test-goal.spec.ts +++ b/test/file-test-goal.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should let you override the goal of a file test', async () => { @@ -7,40 +8,44 @@ describe('betterer', () => { const { paths, logs, cleanup, resolve, testNames, readFile, writeFile } = await createFixture('file-test-goal', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); - -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts').goal((result) => result.getIssues().length === 1) +import { eslint } from '@betterer/eslint'; + +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') + .goal((result) => result.getIssues().length === 1) }; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; - `, + { rules: { 'no-debugger': 'off' } } +); + `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } - ` + ` }); const configPaths = [paths.config]; diff --git a/test/file-test-line-endings.spec.ts b/test/file-test-line-endings.spec.ts index ae9bd81f7..27bc0de61 100644 --- a/test/file-test-line-endings.spec.ts +++ b/test/file-test-line-endings.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should normalise line endings within issues', async () => { @@ -7,11 +8,11 @@ describe('betterer', () => { const { paths, cleanup, testNames, resolve, readFile, writeFile } = await createFixture('file-test-line-endings', { '.betterer.js': ` -const { BettererFileTest } = require('@betterer/betterer'); -const { eslint } = require('@betterer/eslint'); -const { promises: fs } = require('fs'); +import { BettererFileTest } from '@betterer/betterer'; +import { eslint } from '@betterer/eslint'; +import { promises as fs } from 'node:fs'; -module.exports = { +export default { test: () => { return new BettererFileTest(async (filePaths, fileTestResult) => { await Promise.all( diff --git a/test/file-test-sort-absolute.spec.ts b/test/file-test-sort-absolute.spec.ts index 6aad263c6..458eda4f4 100644 --- a/test/file-test-sort-absolute.spec.ts +++ b/test/file-test-sort-absolute.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should sort files by their file path correctly with absolute paths', async () => { @@ -9,40 +10,43 @@ describe('betterer', () => { 'file-test-sort-absolute', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); +import { eslint } from '@betterer/eslint'; -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; - `, + { rules: { 'no-debugger': 'off' } } +); + `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } - ` + ` } ); diff --git a/test/file-test-sort-all.spec.ts b/test/file-test-sort-all.spec.ts index 5a8f125dc..824830641 100644 --- a/test/file-test-sort-all.spec.ts +++ b/test/file-test-sort-all.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should sort files by their file path', async () => { @@ -9,40 +10,43 @@ describe('betterer', () => { 'file-test-sort-all', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); +import { eslint } from '@betterer/eslint'; -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; - `, + { rules: { 'no-debugger': 'off' } } +); + `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } - ` + ` } ); diff --git a/test/file-test-sort-subset.spec.ts b/test/file-test-sort-subset.spec.ts index 492b4409c..2ed03850c 100644 --- a/test/file-test-sort-subset.spec.ts +++ b/test/file-test-sort-subset.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should sort files by their file path even when only running on a single file', async () => { @@ -9,40 +10,43 @@ describe('betterer', () => { 'file-test-sort-subset', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); +import { eslint } from '@betterer/eslint'; -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; - `, + { rules: { 'no-debugger': 'off' } } +); + `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } - ` + ` } ); diff --git a/test/filter-only.spec.ts b/test/filter-only.spec.ts index 2b78e5e47..364573bf5 100644 --- a/test/filter-only.spec.ts +++ b/test/filter-only.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should run only specific tests called with only()', async () => { diff --git a/test/filter-skip.spec.ts b/test/filter-skip.spec.ts index 88baf2289..08b600bc3 100644 --- a/test/filter-skip.spec.ts +++ b/test/filter-skip.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should not run a specific test called with skip()', async () => { @@ -14,7 +15,7 @@ import { bigger } from '@betterer/constraints'; import { regexp } from '@betterer/regexp'; import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); export default { 'test 1': () => new BettererTest({ @@ -24,13 +25,13 @@ export default { 'test 2': () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts').skip() }; `, - '.betterer.ts': ` + '.betterer.js': ` import { BettererTest } from '@betterer/betterer'; import { bigger } from '@betterer/constraints'; import { regexp } from '@betterer/regexp'; import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); export default { 'test 1': () => new BettererTest({ diff --git a/test/fixture.ts b/test/fixture.ts index 2919b9b3d..848125cec 100644 --- a/test/fixture.ts +++ b/test/fixture.ts @@ -1,7 +1,10 @@ import type { Fixture, FixtureFileSystemFiles, FixtureOptions } from '@betterer/fixture'; + import { createFixtureDirectoryΔ } from '@betterer/fixture'; import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +const __dirname = path.dirname(fileURLToPath(import.meta.url)); const fixtureFactory = createFixtureDirectoryΔ(path.resolve(__dirname, '../fixtures')); export async function createFixture( diff --git a/test/include-global.spec.ts b/test/include-global.spec.ts index f1c4d1185..72881f23b 100644 --- a/test/include-global.spec.ts +++ b/test/include-global.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should handle a global include', async () => { diff --git a/test/invariant.spec.ts b/test/invariant.spec.ts new file mode 100644 index 000000000..db9cbb501 --- /dev/null +++ b/test/invariant.spec.ts @@ -0,0 +1,11 @@ +import { describe, expect, it } from 'vitest'; + +import { invariantΔ } from '@betterer/errors'; + +describe('betterer', () => { + it('should throw when an invariant fails', () => { + expect(() => { + invariantΔ(false, 'invariant failed!', { some: 'context' }); + }).toThrow(); + }); +}); diff --git a/test/knip-no-config.spec.ts b/test/knip-no-config.spec.ts new file mode 100644 index 000000000..9dccba8fc --- /dev/null +++ b/test/knip-no-config.spec.ts @@ -0,0 +1,28 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should throw if there is no config file path', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup } = await createFixture('knip-no-config', { + '.betterer.js': ` +import { knip } from '@betterer/knip'; + +export default { + test: () => knip().include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await expect(async () => await betterer({ configPaths, resultsPath, workers: false })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/knip.spec.ts b/test/knip.spec.ts new file mode 100644 index 000000000..b891beeab --- /dev/null +++ b/test/knip.spec.ts @@ -0,0 +1,73 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it.skip('should report the status of a new knip config', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, resolve, readFile, cleanup, writeFile, testNames } = await createFixture('knip', { + '.betterer.ts': ` +import { knip } from '@betterer/knip'; + +export default { + knip: () => knip('./knip.json').include(['./src/**/*.ts']) +}; + `, + 'knip.json': ` +{ + "entry": [".betterer.ts", "src/index.ts"], + "project": ["**/*.ts"] +} + `, + 'package.json': ` +{ + "name": "knip-test", + "version": "0.0.1", + "dependencies": { + "fuck-shit-up": "^2.0.0" + } +} + `, + 'src/index.ts': ` +import 'thanos-glove'; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['knip']); + + const sameTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(sameTestRun.same)).toEqual(['knip']); + + await writeFile(indexPath, `import 'thanos-glove'; import 'console.fuck';`); + + const worseTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(worseTestRun.worse)).toEqual(['knip']); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + await writeFile(indexPath, `import 'fuck-shit-up';`); + + const betterTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(betterTestRun.better)).toEqual(['knip']); + + const completedTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(completedTestRun.completed)).toEqual(['knip']); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/merge.spec.ts b/test/merge.spec.ts new file mode 100644 index 000000000..441fbd011 --- /dev/null +++ b/test/merge.spec.ts @@ -0,0 +1,47 @@ +import { describe, it, expect } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should merge the results file', async () => { + const { merge } = await import('@betterer/betterer'); + + const { paths, cleanup, readFile } = await createFixture('merge', { + '.betterer.results': ` +// BETTERER RESULTS V2. +exports[\`test\`] = { + value: \`{ +|||<<<<<<< our-change + \\"src/index.ts:315583663\\": [ + [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"], + [1, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + ] +|||======= + \\"src/index.ts:913095150\\": [ + [0, 0, 11, \\"TSQuery match\\", \\"3870399096\\"] + ] +|||>>>>>>> their-change + }\` +}; + `.replace(/\|||/g, '') + }); + + const resultsPath = paths.results; + + process.env.BETTERER_WORKER = 'false'; + + await merge({ resultsPath }); + + const merged = await readFile(resultsPath); + + expect(merged).toMatchSnapshot(); + + await merge({ resultsPath }); + + const unchanged = await readFile(resultsPath); + + expect(unchanged).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/mixed-results.spec.ts b/test/mixed-results.spec.ts new file mode 100644 index 000000000..ec242f7ee --- /dev/null +++ b/test/mixed-results.spec.ts @@ -0,0 +1,68 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should work when some tests gets worse and others get better', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, resolve, readFile, cleanup, testNames } = await createFixture( + 'mixed-results', + { + '.betterer.js': ` +import { BettererTest } from '@betterer/betterer'; +import { smaller, bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const shrinks = persist(import.meta.url, 'shrinks', 2); +const grows = persist(import.meta.url, 'grows', 0); + +export default { + 'should shrink': () => new BettererTest({ + test: () => shrinks.decrement(), + constraint: smaller + }), + 'should grow': () => new BettererTest({ + test: () => grows.decrement(), + constraint: bigger + }), + 'should stay the same': () => new BettererTest({ + test: () => 1, + constraint: bigger + }), + 'should fail': () => new BettererTest({ + test: () => { throw new Error('throws'); }, + constraint: bigger + }) +}; + ` + }, + { + logFilters: [/: running /, /running.../] + } + ); + + const configPaths = [paths.config]; + const resultsPath = resolve(paths.results); + + const firstRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(firstRun.new)).toEqual(['should shrink', 'should grow', 'should stay the same']); + expect(testNames(firstRun.failed)).toEqual(['should fail']); + + const secondRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(secondRun.better)).toEqual(['should shrink']); + expect(testNames(secondRun.worse)).toEqual(['should grow']); + expect(testNames(secondRun.same)).toEqual(['should stay the same']); + expect(testNames(secondRun.failed)).toEqual(['should fail']); + + expect(logs).toMatchSnapshot(); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/obsolete.spec.ts b/test/obsolete.spec.ts new file mode 100644 index 000000000..fe361b884 --- /dev/null +++ b/test/obsolete.spec.ts @@ -0,0 +1,58 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should report obsolete tests and remove them with the update flag', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('obsolete', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + 'will be renamed': () => tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, `console.log('foo');`); + + const newTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['will be renamed']); + + const configFile = await readFile(paths.config); + const updated = configFile.replace('will be renamed', 'has been renamed'); + await writeFile(paths.config, updated); + + const obsoleteTestRun = await betterer({ configPaths, resultsPath, workers: false }); + + expect(testNames(obsoleteTestRun.obsolete)).toEqual(['will be renamed']); + expect(testNames(obsoleteTestRun.new)).toEqual(['has been renamed']); + expect(obsoleteTestRun.changed).toEqual(['will be renamed', 'has been renamed']); + + const resultObsolete = await readFile(resultsPath); + + expect(resultObsolete).toMatchSnapshot(); + + const updatedTestRun = await betterer({ configPaths, resultsPath, workers: false, update: true }); + + expect(testNames(updatedTestRun.removed)).toEqual(['will be renamed']); + expect(testNames(updatedTestRun.same)).toEqual(['has been renamed']); + + const resultRemoved = await readFile(resultsPath); + + expect(resultRemoved).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/printer-pathological.spec.ts b/test/printer-pathological.spec.ts index e8a1d3705..15db575f6 100644 --- a/test/printer-pathological.spec.ts +++ b/test/printer-pathological.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should handle printing for pathological cases', async () => { @@ -7,8 +8,8 @@ describe('betterer', () => { const { paths, readFile, cleanup } = await createFixture('printer-pathological', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; const paths = [ './some/long/path/to/some/file', @@ -54,7 +55,7 @@ const map = { s: './some/long/path/to/some/file', }; -module.exports = { +export default { 'big array': () => new BettererTest({ test: () => paths, constraint: () => 'same', diff --git a/test/regexp-message.spec.ts b/test/regexp-message.spec.ts index 0b2ecd1ef..eea3a9a9f 100644 --- a/test/regexp-message.spec.ts +++ b/test/regexp-message.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the existence of RegExp matches, with a custom issue message', async () => { @@ -9,9 +10,9 @@ describe('betterer', () => { 'regexp-with-issue-message', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { 'regexp': () => regexp(/(\\/\\/\\s*HACK)/i, "no hacks here!").include('./src/**/*.ts') }; ` diff --git a/test/regexp-no-regexp.spec.ts b/test/regexp-no-regexp.spec.ts index 717bd44a1..3dbd999f7 100644 --- a/test/regexp-no-regexp.spec.ts +++ b/test/regexp-no-regexp.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw if there is no regexp', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('regexp-no-regexp', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { 'regexp': () => regexp() }; ` diff --git a/test/regexp.spec.ts b/test/regexp.spec.ts index 02ba2ce7a..31c804ba7 100644 --- a/test/regexp.spec.ts +++ b/test/regexp.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the existence of RegExp matches', async () => { @@ -7,10 +8,10 @@ describe('betterer', () => { const { logs, paths, readFile, cleanup, resolve, writeFile, testNames } = await createFixture('regexp', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { - 'regexp': () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') +export default { + 'regexp': () => regexp(/(\\/\\/\\s*HACK)/g).include('./src/**/*.ts') }; ` }); diff --git a/test/reporter-inline.spec.ts b/test/reporter-inline.spec.ts index a12e7269c..9a2767549 100644 --- a/test/reporter-inline.spec.ts +++ b/test/reporter-inline.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should work with an inline reporter', async () => { @@ -11,7 +12,7 @@ import { BettererTest } from '@betterer/betterer'; import { bigger } from '@betterer/constraints'; import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); export const test = () => new BettererTest({ test: () => grows.increment(), diff --git a/test/reporter-invalid-hook-function.spec.ts b/test/reporter-invalid-hook-function.spec.ts index 30673091e..0c3b8c6a3 100644 --- a/test/reporter-invalid-hook-function.spec.ts +++ b/test/reporter-invalid-hook-function.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should throw when a hook is not a function', async () => { @@ -10,7 +11,8 @@ describe('betterer --reporter', () => { module.exports.reporter = { contextStart: '' }; - ` + `, + '.betterer.js': '' }); const configPaths = [paths.config]; diff --git a/test/reporter-invalid-hook-name.spec.ts b/test/reporter-invalid-hook-name.spec.ts index c7705a06c..6bc042a27 100644 --- a/test/reporter-invalid-hook-name.spec.ts +++ b/test/reporter-invalid-hook-name.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should throw when there is an invalid hook name', async () => { @@ -9,14 +10,17 @@ describe('betterer --reporter', () => { module.exports.reporter = { notAHook: '' }; - ` + `, + '.betterer.js': '' }); const configPaths = [paths.config]; const resultsPath = paths.results; const reporters = [resolve('reporter.js')]; - await expect(async () => await betterer({ configPaths, resultsPath, reporters, workers: false })).rejects.toThrow(); + await expect(async () => { + await betterer({ configPaths, resultsPath, reporters, workers: false }); + }).rejects.toThrow(); expect(logs).toMatchSnapshot(); diff --git a/test/reporter-lifecycle.spec.ts b/test/reporter-lifecycle.spec.ts index 033b563cf..e7bee4ae1 100644 --- a/test/reporter-lifecycle.spec.ts +++ b/test/reporter-lifecycle.spec.ts @@ -7,8 +7,9 @@ import type { BettererSuiteSummary } from '@betterer/betterer'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should work with a lifecycle based reporter', async () => { @@ -20,7 +21,7 @@ import { BettererTest } from '@betterer/betterer'; import { bigger } from '@betterer/constraints'; import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); export const test = () => new BettererTest({ test: () => grows.increment(), @@ -39,21 +40,21 @@ export const test = () => new BettererTest({ async contextStart(_: BettererContext, lifecycle: Promise) { try { await lifecycle; - } catch (e) { + } catch { return; } }, async suiteStart(_: BettererSuite, lifecycle: Promise) { try { await lifecycle; - } catch (e) { + } catch { return; } }, async runStart(_: BettererRun, lifecycle: Promise) { try { await lifecycle; - } catch (e) { + } catch { return; } } diff --git a/test/reporter-local-ts.spec.ts b/test/reporter-local-ts.spec.ts index 4176acc99..827f52066 100644 --- a/test/reporter-local-ts.spec.ts +++ b/test/reporter-local-ts.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should work with a local TypeScript module', async () => { @@ -7,7 +8,15 @@ describe('betterer --reporter', () => { const { paths, cleanup, resolve } = await createFixture('reporter-local-ts', { 'reporter.ts': ` - export const reporter = {}; + import { BettererReporter } from '@betterer/betterer'; + import { reporter as actual } from './actual-reporter.ts'; + + export const reporter: BettererReporter = actual; + `, + 'actual-reporter.ts': ` + import type { BettererReporter } from '@betterer/betterer'; + + export const reporter: BettererReporter = {}; `, '.betterer.js': `` }); diff --git a/test/reporter-local.spec.ts b/test/reporter-local.spec.ts index 4a3da2202..15cb43902 100644 --- a/test/reporter-local.spec.ts +++ b/test/reporter-local.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should work with a local module', async () => { diff --git a/test/reporter-no-export.spec.ts b/test/reporter-no-export.spec.ts index 360586f27..dac0c4664 100644 --- a/test/reporter-no-export.spec.ts +++ b/test/reporter-no-export.spec.ts @@ -1,12 +1,14 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should throw when there is nothing exported', async () => { const { betterer } = await import('@betterer/betterer'); const { logs, paths, cleanup, resolve } = await createFixture('reporter-no-export', { - 'reporter.js': `` + 'reporter.js': ``, + '.betterer.js': `` }); const configPaths = [paths.config]; diff --git a/test/reporter-npm.spec.ts b/test/reporter-npm.spec.ts index 7346ca6d9..13b3cf7f6 100644 --- a/test/reporter-npm.spec.ts +++ b/test/reporter-npm.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --reporter', () => { it('should work with an npm module', async () => { diff --git a/test/results-escape.spec.ts b/test/results-escape.spec.ts index 88a507549..712a1ed7a 100644 --- a/test/results-escape.spec.ts +++ b/test/results-escape.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should escape interpolation characters in the result file', async () => { diff --git a/test/results-file-paths.spec.ts b/test/results-file-paths.spec.ts new file mode 100644 index 000000000..6267726bd --- /dev/null +++ b/test/results-file-paths.spec.ts @@ -0,0 +1,55 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should remove the version control path from issue messages', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, cleanup, resolve, writeFile } = await createFixture('results-files-paths', { + '.betterer.ts': ` +import { BettererFileTest } from '@betterer/betterer'; +import path from 'node:path'; + +function test(): BettererFileTest { + return new BettererFileTest((files, fileTestResult) => { + files.forEach(filePath => { + const file = fileTestResult.addFile(filePath, ''); + file.addIssue(0, 0, \`some error found in \${filePath} oh no\`); + file.addIssue(0, 0, \`some error found in ../../some/file/path and ..\\\\..\\\\some\\\\other\\\\file\\\\path oh no\`); + file.addIssue(0, 0, \`some error found in '\${filePath}' oh no\`); + file.addIssue(0, 0, \`some error found in [../../some/file/path] and "..\\\\..\\\\some\\\\other\\\\file\\\\path" oh no\`); + file.addIssue(0, 0, \`some error found in \\\`\${filePath}\\\` oh no\`); + file.addIssue(0, 0, \`some error found in (../../some/file/path) and {..\\\\..\\\\some\\\\other\\\\file\\\\path} oh no\`); + file.addIssue(0, 0, \`some error found in <\${filePath}> oh no\`); + }); + }); +} + +export default { + test: () => test().include('./src/**/*.ts') +}; + `, + './src/another-file.ts': '' + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await writeFile(resolve('./src/index.ts'), ''); + + // First run to create .betterer.results file: + await betterer({ configPaths, resultsPath, workers: false }); + + // Second run to make sure it doesn't throw when reading results: + await betterer({ configPaths, resultsPath, workers: false }); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/results-filter.spec.ts b/test/results-filter.spec.ts index fcf687228..48ce25003 100644 --- a/test/results-filter.spec.ts +++ b/test/results-filter.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should return only the current results for a filtered test', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { paths, cleanup } = await createFixture('results-filter', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { 'test 1': () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts'), 'test 2': () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts'), 'test 3': () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts') diff --git a/test/results-includes.spec.ts b/test/results-includes.spec.ts index f2212b4ff..0aa25305a 100644 --- a/test/results-includes.spec.ts +++ b/test/results-includes.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should return only the current results for an included file', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { paths, cleanup, resolve } = await createFixture('results-includes', { '.betterer.js': ` -const { regexp } = require('@betterer/regexp'); +import { regexp } from '@betterer/regexp'; -module.exports = { +export default { 'test': () => regexp(/(\\/\\/\\s*HACK)/i).include('./src/**/*.ts'), }; `, @@ -35,22 +36,22 @@ module.exports = { const fileWithIssues = resolve('./src/file-with-issues.ts'); const fileWithIssue = resolve('./src/file-with-issue.ts'); - const fileTestResultSummary = (!!testResultSummary?.isFileTest && testResultSummary.details) || {}; + const fileTestResultSummary = testResultSummary?.isFileTest ? testResultSummary.details : {}; expect(fileTestResultSummary[fileWithIssues]).toBeDefined(); expect(fileTestResultSummary[fileWithIssue]).not.toBeDefined(); - const fileWithIssuesResult = fileTestResultSummary[fileWithIssues]; + const fileWithIssuesResult = fileTestResultSummary[fileWithIssues] ?? []; const [issue1, issue2] = fileWithIssuesResult; - expect(issue1.message).toEqual('RegExp match'); - expect(issue1.line).toEqual(0); - expect(issue1.column).toEqual(0); + expect(issue1?.message).toEqual('RegExp match'); + expect(issue1?.line).toEqual(0); + expect(issue1?.column).toEqual(0); - expect(issue2.message).toEqual('RegExp match'); - expect(issue2.line).toEqual(1); - expect(issue2.column).toEqual(0); + expect(issue2?.message).toEqual('RegExp match'); + expect(issue2?.line).toEqual(1); + expect(issue2?.column).toEqual(0); await cleanup(); }); diff --git a/test/results-path.spec.ts b/test/results-path.spec.ts index 2bd67fb08..84ccab6dd 100644 --- a/test/results-path.spec.ts +++ b/test/results-path.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should write a results file to a different path', async () => { @@ -13,7 +14,7 @@ function test(): BettererFileTest { return new BettererFileTest((files, fileTestResult) => { files.forEach(filePath => { const file = fileTestResult.addFile(filePath, ''); - file.addIssue(0, 0, "\`$" + "{key}\`"); + file.addIssue(0, 0, "issue"); }); }); } diff --git a/test/results-read-error.spec.ts b/test/results-read-error.spec.ts index b575a2bd9..d5e8c0e3c 100644 --- a/test/results-read-error.spec.ts +++ b/test/results-read-error.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw when reading the results file fails', async () => { @@ -7,13 +8,13 @@ describe('betterer', () => { const { logs, paths, cleanup, resolve, writeFile } = await createFixture('results-read-error', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); -module.exports = { +export default { test: () => new BettererTest({ test: () => grows.increment(), constraint: smaller diff --git a/test/results.spec.ts b/test/results.spec.ts index 7a247f4d6..1eb20b61a 100644 --- a/test/results.spec.ts +++ b/test/results.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should return the current results for a test', async () => { @@ -7,13 +8,13 @@ describe('betterer', () => { const { paths, cleanup } = await createFixture('results', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller, bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller, bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const grows = persist(__dirname, 'grows', 0); +const grows = persist(import.meta.url, 'grows', 0); -module.exports = { +export default { test: () => new BettererTest({ test: () => grows.increment(), constraint: bigger diff --git a/test/runner/runner-excluded.spec.ts b/test/runner/runner-excluded.spec.ts index 14350f767..46e5b7b3f 100644 --- a/test/runner/runner-excluded.spec.ts +++ b/test/runner/runner-excluded.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; describe('betterer.runner', () => { it(`should ignore any files that aren't included in the test`, async () => { @@ -7,38 +8,41 @@ describe('betterer.runner', () => { const { paths, resolve, cleanup, writeFile } = await createFixture('runner-excluded', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); +import { eslint } from '@betterer/eslint'; -module.exports = { - test: () => eslint({ 'no-debugger': 'error'}).include('./src/**/*.ts') +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') }; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; + { rules: { 'no-debugger': 'off' } } +); `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } ` }); @@ -52,11 +56,14 @@ module.exports = { const runner = await betterer.runner({ configPaths, resultsPath, cwd, workers: false }); await runner.queue(testPath); - const suiteSummary = await runner.stop(); - const [runSummary] = suiteSummary.runSummaries; - expect(runSummary.isComplete).toEqual(true); - expect(runSummary.filePaths).toHaveLength(0); + const contextSummary = await runner.stop(); + + const runSuite = contextSummary?.lastSuite; + const [runSummary] = runSuite?.runSummaries ?? []; + + expect(runSummary?.isComplete).toEqual(true); + expect(runSummary?.filePaths).toHaveLength(0); await cleanup(); }); diff --git a/test/runner/runner-included.spec.ts b/test/runner/runner-included.spec.ts index cf344b276..f27c80cf5 100644 --- a/test/runner/runner-included.spec.ts +++ b/test/runner/runner-included.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; describe('betterer.runner', () => { it('should run the test against an included file', async () => { @@ -7,38 +8,41 @@ describe('betterer.runner', () => { const { paths, resolve, cleanup, writeFile } = await createFixture('runner-included', { '.betterer.js': ` -const { eslint } = require('@betterer/eslint'); +import { eslint } from '@betterer/eslint'; -module.exports = { - test: () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') -}; +export default { + test: () => eslint({ + rules: { + 'no-debugger': 'error' + } + }) + .include('./src/**/*.ts') +}; `, - '.eslintrc.js': ` -const path = require('path'); - -module.exports = { - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 2018, - project: path.resolve(__dirname, './tsconfig.json'), - sourceType: 'module' + 'eslint.config.js': ` +import eslint from '@eslint/js'; +import tslint from 'typescript-eslint'; + +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +export default tslint.config( + eslint.configs.recommended, + ...tslint.configs.recommended, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: path.dirname(fileURLToPath(import.meta.url)) + }, + }, }, - plugins: ['@typescript-eslint'], - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/eslint-recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/recommended-requiring-type-checking' - ], - rules: { - 'no-debugger': 1 - } -}; + { rules: { 'no-debugger': 'off' } } +); `, 'tsconfig.json': ` { - "extends": "../../tsconfig.json", - "include": ["./src/**/*", "./.betterer.js", "./.eslintrc.js"] + "include": ["./src/**/*"] } ` }); @@ -52,11 +56,14 @@ module.exports = { const runner = await betterer.runner({ configPaths, resultsPath, cwd, workers: false }); await runner.queue(indexPath); - const suiteSummary = await runner.stop(); - const [runSummary] = suiteSummary.runSummaries; - expect(runSummary.isNew).toEqual(true); - expect(runSummary.filePaths).toEqual([indexPath]); + const contextSummary = await runner.stop(); + + const runSuite = contextSummary?.lastSuite; + const [runSummary] = runSuite?.runSummaries ?? []; + + expect(runSummary?.isNew).toEqual(true); + expect(runSummary?.filePaths).toEqual([indexPath]); await cleanup(); }); diff --git a/test/same-move-file.spec.ts b/test/same-move-file.spec.ts index 37000c79d..6da3f55ed 100644 --- a/test/same-move-file.spec.ts +++ b/test/same-move-file.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should stay the same when a file is moved', async () => { @@ -26,13 +27,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` } diff --git a/test/same-move-issue.spec.ts b/test/same-move-issue.spec.ts index 357b07e60..5eb3bf964 100644 --- a/test/same-move-issue.spec.ts +++ b/test/same-move-issue.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should stay the same when an issue is moved', async () => { @@ -24,13 +25,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); diff --git a/test/same-move-issues.spec.ts b/test/same-move-issues.spec.ts index a874567a0..5b5adf9c8 100644 --- a/test/same-move-issues.spec.ts +++ b/test/same-move-issues.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should stay the same when multiple issues are moved', async () => { @@ -25,13 +26,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); diff --git a/test/same-result.spec.ts b/test/same-result.spec.ts index 578201671..a34a4fb28 100644 --- a/test/same-result.spec.ts +++ b/test/same-result.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it(`should work when a test is the same`, async () => { @@ -9,16 +10,20 @@ describe('betterer', () => { 'same-result', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { bigger } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger, smaller } from '@betterer/constraints'; const start = 0; -module.exports = { - test: () => new BettererTest({ +export default { + bigger: () => new BettererTest({ test: () => start, constraint: bigger }), + smaller: () => new BettererTest({ + test: () => start, + constraint: smaller + }), }; ` }, @@ -32,11 +37,11 @@ module.exports = { const firstRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(testNames(firstRun.new)).toEqual(['test']); + expect(testNames(firstRun.new)).toEqual(['bigger', 'smaller']); const secondRun = await betterer({ configPaths, resultsPath, workers: false }); - expect(testNames(secondRun.same)).toEqual(['test']); + expect(testNames(secondRun.same)).toEqual(['bigger', 'smaller']); expect(logs).toMatchSnapshot(); diff --git a/test/setup.ts b/test/setup.ts index 9145467f7..db7c3324d 100644 --- a/test/setup.ts +++ b/test/setup.ts @@ -1,14 +1,14 @@ import '@betterer/fixture'; -import { jest } from '@jest/globals'; -jest.setTimeout(300000); +import { beforeEach, vitest } from 'vitest'; -jest.mock('@betterer/time', (): typeof import('@betterer/time') => { - const time = jest.requireActual('@betterer/time') as typeof import('@betterer/time'); - - return { - ...time, - getPreciseTime__: () => 0, - getTime__: () => 0 - }; +beforeEach(() => { + vitest.mock('@betterer/time', async (importOriginal): Promise => { + const time: typeof import('@betterer/time') = await importOriginal(); + return { + ...time, + getPreciseTimeΔ: () => 0, + getTimeΔ: () => 0 + }; + }); }); diff --git a/test/silent-mute.spec.ts b/test/silent-mute.spec.ts index 183c96a21..94a0f8296 100644 --- a/test/silent-mute.spec.ts +++ b/test/silent-mute.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --silent', () => { it('should mute all console output', async () => { @@ -7,13 +8,13 @@ describe('betterer --silent', () => { const { logs, paths, cleanup } = await createFixture('silent-mute', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const shrinks = persist(__dirname, 'shrinks', 2); +const shrinks = persist(import.meta.url, 'shrinks', 2); -module.exports = { +export default { test: () => new BettererTest({ test: () => shrinks.decrement(), constraint: smaller diff --git a/test/silent-unmute.spec.ts b/test/silent-unmute.spec.ts index 2380d85ee..2ff11a45b 100644 --- a/test/silent-unmute.spec.ts +++ b/test/silent-unmute.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer --silent', () => { it('should be possible to unmute a subsequent run', async () => { @@ -7,13 +8,13 @@ describe('betterer --silent', () => { const { logs, paths, cleanup } = await createFixture('silent-unmute', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const shrinks = persist(__dirname, 'shrinks', 2); +const shrinks = persist(import.meta.url, 'shrinks', 2); -module.exports = { +export default { test: () => new BettererTest({ test: () => shrinks.decrement(), constraint: smaller diff --git a/test/stylelint-no-config.spec.ts b/test/stylelint-no-config.spec.ts index f587d28a0..76cc46490 100644 --- a/test/stylelint-no-config.spec.ts +++ b/test/stylelint-no-config.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw if there is no config', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('stylelint-no-config', { '.betterer.js': ` -const { stylelint } = require('@betterer/stylelint'); +import { stylelint } from '@betterer/stylelint'; -module.exports = { +export default { 'stylelint': () => stylelint().include('./src/**/*.css') }; ` diff --git a/test/stylelint-no-files.spec.ts b/test/stylelint-no-files.spec.ts new file mode 100644 index 000000000..c9812ab5d --- /dev/null +++ b/test/stylelint-no-files.spec.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should work when there are no relevant files for a StyleLint test', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, cleanup } = await createFixture('stylelint-no-files', { + '.betterer.ts': ` +import { stylelint } from '@betterer/stylelint'; + +export default { + 'stylelint': () => stylelint({ + rules: { + 'order/order': [ + { type: 'rule' }, + { type: 'rule', selector: /^&:\\w/ }, + { type: 'rule', selector: /^&/ }, + ] + } + }).include('./src/**/*.css') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await betterer({ configPaths, resultsPath, workers: false }); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/styelint.spec.ts b/test/stylelint.spec.ts similarity index 93% rename from test/styelint.spec.ts rename to test/stylelint.spec.ts index d6c246c15..e8a630c9d 100644 --- a/test/styelint.spec.ts +++ b/test/stylelint.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; const STYLES_SOURCE = ` a { diff --git a/test/test-local.spec.ts b/test/test-local.spec.ts new file mode 100644 index 000000000..9b75723fb --- /dev/null +++ b/test/test-local.spec.ts @@ -0,0 +1,54 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should handle importing from local files', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, cleanup } = await createFixture('test-local', { + '.betterer.ts': ` +import { shrinks } from './test-ts.ts'; +import { grows } from './test-js.js'; + +export default { + shrinks, + grows +} + `, + './test-ts.ts': ` +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const count = persist(import.meta.url, 'shrinks', 2); + +export const shrinks = () => new BettererTest({ + test: () => count.decrement(), + constraint: smaller +}) + `, + './test-js.js': ` +import { BettererTest } from '@betterer/betterer'; +import { bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; + +const count = persist(import.meta.url, 'grows', 2); + +export const grows = () => new BettererTest({ + test: () => count.increment(), + constraint: bigger +}) + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await betterer({ configPaths, resultsPath, workers: false }); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/test-no-constraint.spec.ts b/test/test-no-constraint.spec.ts index 07524f520..eb7e74ead 100644 --- a/test/test-no-constraint.spec.ts +++ b/test/test-no-constraint.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw if there is no constraint', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('test-no-constraint', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); +import { BettererTest } from '@betterer/betterer'; -module.exports = { +export default { test: () => new BettererTest({}) }; ` diff --git a/test/test-no-test.spec.ts b/test/test-no-test.spec.ts index e6181846e..2ada64868 100644 --- a/test/test-no-test.spec.ts +++ b/test/test-no-test.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw if there is no test', async () => { @@ -7,10 +8,10 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('test-no-test', { '.betterer.js': ` - const { BettererTest } = require('@betterer/betterer'); - const { smaller } = require('@betterer/constraints'); + import { BettererTest } from '@betterer/betterer'; + import { smaller } from '@betterer/constraints'; - module.exports = { + export default { test: () => new BettererTest({ constraint: smaller }) diff --git a/test/test-not-a-betterer-test.spec.ts b/test/test-not-a-betterer-test.spec.ts index a8bd804dd..41ab771a7 100644 --- a/test/test-not-a-betterer-test.spec.ts +++ b/test/test-not-a-betterer-test.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it(`should throw if it doesn't return a BettererTest`, async () => { @@ -8,7 +9,7 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('test-not-a-betterertest', { '.betterer.js': ` -module.exports = { +export default { test: () => {} }; ` diff --git a/test/test-not-a-function.spec.ts b/test/test-not-a-function.spec.ts index a0b412d57..ade7135f7 100644 --- a/test/test-not-a-function.spec.ts +++ b/test/test-not-a-function.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw if a test is not a function', async () => { @@ -7,13 +8,13 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('test-not-a-function', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const shrinks = persist(__dirname, 'shrinks', 2); +const shrinks = persist(import.meta.url, 'shrinks', 2); -module.exports = { +export default { test: new BettererTest({ test: () => shrinks.decrement(), constraint: smaller diff --git a/test/tsquery-message.spec.ts b/test/tsquery-message.spec.ts index 05312de13..0435f6002 100644 --- a/test/tsquery-message.spec.ts +++ b/test/tsquery-message.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should include custom TSQuery warning messages', async () => { diff --git a/test/tsquery-no-files.spec.ts b/test/tsquery-no-files.spec.ts new file mode 100644 index 000000000..e20656b3c --- /dev/null +++ b/test/tsquery-no-files.spec.ts @@ -0,0 +1,30 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should work when there are no relevant files for a TSQuery test', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, cleanup } = await createFixture('tsquery-no-files', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + tsquery: () => tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + await betterer({ configPaths, resultsPath, workers: false }); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/tsquery-no-query.spec.ts b/test/tsquery-no-query.spec.ts index 4074f6928..4ff4f467e 100644 --- a/test/tsquery-no-query.spec.ts +++ b/test/tsquery-no-query.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw if there is no query', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('tsquery-no-query', { '.betterer.js': ` -const { tsquery } = require('@betterer/tsquery'); +import { tsquery } from '@betterer/tsquery'; -module.exports = { +export default { tsquery: () => tsquery() }; ` diff --git a/test/tsquery.spec.ts b/test/tsquery.spec.ts index af9d4ab9f..834d2f091 100644 --- a/test/tsquery.spec.ts +++ b/test/tsquery.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the existence of TSQuery matches', async () => { diff --git a/test/typescript-cache.spec.ts b/test/typescript-cache.spec.ts new file mode 100644 index 000000000..86468b9a4 --- /dev/null +++ b/test/typescript-cache.spec.ts @@ -0,0 +1,84 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +describe('betterer', () => { + it('should still reports errors if another file effects a cached TypeScript file', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, resolve, readFile, cleanup, writeFile, testNames } = await createFixture('typescript-cache', { + '.betterer.ts': ` +import { typescript } from '@betterer/typescript'; + +export default { + typescript: () => typescript('./tsconfig.json', { + strict: true + }).include('./src/**/*.ts') +}; + `, + 'tsconfig.json': ` +{ + "compilerOptions": { + "noEmit": true, + "lib": ["esnext", "dom"], + "moduleResolution": "node", + "target": "ES5", + "typeRoots": [], + "resolveJsonModule": true, + "strict": false + }, + "include": ["./src/**/*"] +} + `, + './src/types.ts': ` +export interface MyThing { + one: 1, + two: 2, +} + `, + './src/index.ts': ` +import type { MyThing } from './types.js'; + +const myThing: MyThing = { + one: 1, + two: 2, + three: 3 +} + ` + }); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + const typesPath = resolve('./src/types.ts'); + + const newTestRun = await betterer({ cachePath, configPaths, resultsPath, workers: false, cache: true }); + + expect(testNames(newTestRun.new)).toEqual(['typescript']); + + const sameTestRun = await betterer({ cachePath, configPaths, resultsPath, workers: false, cache: true }); + + expect(testNames(sameTestRun.same)).toEqual(['typescript']); + + await writeFile(typesPath, `\nexport interface MyThing {\n one: 1\n}`); + + const worseTestRun = await betterer({ + cachePath, + configPaths, + resultsPath, + workers: false, + cache: true, + includes: [resolve('./src/index.ts')] + }); + + expect(testNames(worseTestRun.worse)).toEqual(['typescript']); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/typescript-dependency.spec.ts b/test/typescript-dependency.spec.ts index c69028c9f..f1762fbfe 100644 --- a/test/typescript-dependency.spec.ts +++ b/test/typescript-dependency.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the status of the TypeScript compiler when there is a npm dependency', async () => { @@ -19,14 +20,14 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true, "strict": false }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); diff --git a/test/typescript-fix-missing-properties.spec.ts b/test/typescript-fix-missing-properties.spec.ts new file mode 100644 index 000000000..f016fd1b4 --- /dev/null +++ b/test/typescript-fix-missing-properties.spec.ts @@ -0,0 +1,100 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +const INDEX_SOURCE = ` +type A = { + a1: string; +} +type B = { + b1: string; + b2: string; +} +type C = { + c1: string; + c2: string; + c3: string; +} +type D = { + d1: string; + d2: string; + d3: string; + d4: string; +} +type E = { + e1: string; + e2: string; + e3: string; + e4: string; + e5: string; +} +type F = { + f1: string; + f2: string; + f3: string; + f4: string; + f5: string; + f6: string; +} + +const a: A = { }; +const b: B = { }; +const c: C = { }; +const d: D = { }; +const e: E = { }; +const f: F = { }; +`; + +describe('betterer', () => { + it('should stabilise the number of missing properties in issue messages', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, readFile, resolve, cleanup, writeFile, testNames } = await createFixture( + 'typescript-fix-missing-properties', + { + '.betterer.ts': ` +import { typescript } from '@betterer/typescript'; + +export default { + typescript: () => typescript('./tsconfig.json', { + strict: true + }).include('./src/**/*.ts') +}; + `, + 'tsconfig.json': ` +{ + "compilerOptions": { + "noEmit": true, + "lib": ["esnext", "dom"], + "moduleResolution": "node", + "target": "ES5", + "typeRoots": [], + "resolveJsonModule": true, + "strict": false + }, + "include": ["./src/**/*"] +} + ` + } + ); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, INDEX_SOURCE); + + const newTestRun = await betterer({ cachePath, configPaths, resultsPath, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['typescript']); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/typescript-fix-union-issue.spec.ts b/test/typescript-fix-union-issue.spec.ts new file mode 100644 index 000000000..d8a413d6e --- /dev/null +++ b/test/typescript-fix-union-issue.spec.ts @@ -0,0 +1,62 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +const INDEX_SOURCE = ` +let a: 9 | 5 | 3 | 1 | 4 | 8 | 6 | 2 | 7 | null; +const b: 'A' | 'U' | 'Q' | 'H' | 'Z' | 'L' | 'W' | 'B' | 'J' | 'M' | 'T' | 'E' | 'N' | 'K' | 'W' | 'I' | 'P' | 'S' | 'Y' | 'G' | 'R' | 'X' | 'O' | 'C' | 'F' | 'D' | 'V' = a; +`; + +describe('betterer', () => { + it('should stabilise the order of union types in issue messages', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, logs, readFile, resolve, cleanup, writeFile, testNames } = await createFixture( + 'typescript-fix-union-issue', + { + '.betterer.ts': ` +import { typescript } from '@betterer/typescript'; + +export default { + typescript: () => typescript('./tsconfig.json', { + strict: true + }).include('./src/**/*.ts') +}; + `, + 'tsconfig.json': ` +{ + "compilerOptions": { + "noEmit": true, + "lib": ["esnext", "dom"], + "moduleResolution": "node", + "target": "ES5", + "typeRoots": [], + "resolveJsonModule": true, + "strict": false + }, + "include": ["./src/**/*"] +} + ` + } + ); + + const cachePath = paths.cache; + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, INDEX_SOURCE); + + const newTestRun = await betterer({ cachePath, configPaths, resultsPath, workers: false }); + + expect(testNames(newTestRun.new)).toEqual(['typescript']); + + const result = await readFile(resultsPath); + + expect(result).toMatchSnapshot(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/typescript-incremental.spec.ts b/test/typescript-incremental.spec.ts index ef2a7e801..b988e68d2 100644 --- a/test/typescript-incremental.spec.ts +++ b/test/typescript-incremental.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work with an incremental build', async () => { @@ -22,14 +23,14 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true, "strict": false }, - "include": ["./src/**/*.ts", ".betterer.ts"] + "include": ["./src/**/*.ts"] } `, './src/foo.ts': ` diff --git a/test/typescript-no-config-file.spec.ts b/test/typescript-no-config-file.spec.ts index 21674069b..7998744a2 100644 --- a/test/typescript-no-config-file.spec.ts +++ b/test/typescript-no-config-file.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should throw if there is no configFilePath', async () => { @@ -7,9 +8,9 @@ describe('betterer', () => { const { paths, logs, cleanup } = await createFixture('typescript-no-config-file', { '.betterer.js': ` -const { typescript } = require('@betterer/typescript'); +import { typescript } from '@betterer/typescript'; -module.exports = { +export default { typescript: () => typescript() }; ` diff --git a/test/typescript-strict.spec.ts b/test/typescript-strict.spec.ts index 4c4599813..47c67a7d7 100644 --- a/test/typescript-strict.spec.ts +++ b/test/typescript-strict.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; const INDEX_SOURCE = `export function extractIds(list) { return list.map(member => member.id); @@ -51,14 +52,14 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true, "strict": false }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); diff --git a/test/typescript.spec.ts b/test/typescript.spec.ts index 85320e286..a87d1d543 100644 --- a/test/typescript.spec.ts +++ b/test/typescript.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should report the status of the TypeScript compiler', async () => { @@ -19,13 +20,13 @@ export default { { "compilerOptions": { "noEmit": true, - "lib": ["esnext"], + "lib": ["esnext", "dom"], "moduleResolution": "node", "target": "ES5", - "typeRoots": ["../../node_modules/@types/"], + "typeRoots": [], "resolveJsonModule": true }, - "include": ["./src/**/*", ".betterer.ts"] + "include": ["./src/**/*"] } ` }); diff --git a/test/watch/__snapshots__/watch-cli.spec.ts.snap b/test/watch/__snapshots__/watch-cli.spec.ts.snap new file mode 100644 index 000000000..404aca099 --- /dev/null +++ b/test/watch/__snapshots__/watch-cli.spec.ts.snap @@ -0,0 +1,13 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should work when run from the cli 1`] = ` +[ + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", +] +`; diff --git a/test/watch/__snapshots__/watch-config-validation.spec.ts.snap b/test/watch/__snapshots__/watch-config-validation.spec.ts.snap new file mode 100644 index 000000000..a283e75d7 --- /dev/null +++ b/test/watch/__snapshots__/watch-config-validation.spec.ts.snap @@ -0,0 +1,33 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should throw when there is invalid config: { ignores: [ 1234 ] } 1`] = ` +[ + " +Error: "ignores" must be an array of strings. Received \`[1234]\`. +", +] +`; + +exports[`betterer.watch > should throw when there is invalid config: { ignores: {} } 1`] = ` +[ + " +Error: "ignores" must be an array of strings. Received \`[{}]\`. +", +] +`; + +exports[`betterer.watch > should throw when there is invalid config: { ignores: 1234 } 1`] = ` +[ + " +Error: "ignores" must be an array of strings. Received \`[1234]\`. +", +] +`; + +exports[`betterer.watch > should throw when there is invalid config: { ignores: true } 1`] = ` +[ + " +Error: "ignores" must be an array of strings. Received \`[true]\`. +", +] +`; diff --git a/test/watch/__snapshots__/watch-debounced.spec.ts.snap b/test/watch/__snapshots__/watch-debounced.spec.ts.snap index afa324529..d78077829 100644 --- a/test/watch/__snapshots__/watch-debounced.spec.ts.snap +++ b/test/watch/__snapshots__/watch-debounced.spec.ts.snap @@ -1,80 +1,67 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer.watch should debounce runs when multiple files change 1`] = ` -Array [ - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns +exports[`betterer.watch > should debounce runs when multiple files change 1`] = ` +[ + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Starting Betterer in watch mode! 🎉 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 2 files... 🤔 -・ /fixtures/watch-debounce/src/file.ts -・ /fixtures/watch-debounce/src/index.ts +・ fixtures/watch-debounce/src/file.ts +・ fixtures/watch-debounce/src/index.ts 🌟 Betterer (0ms): -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 2 files... 🤔 -・ /fixtures/watch-debounce/src/file.ts -・ /fixtures/watch-debounce/src/index.ts +・ fixtures/watch-debounce/src/file.ts +・ fixtures/watch-debounce/src/index.ts 🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! +🤔 test: running "test"! -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 2 files... 🤔 -・ /fixtures/watch-debounce/src/file.ts -・ /fixtures/watch-debounce/src/index.ts - -🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 2 files... 🤔 - -・ /fixtures/watch-debounce/src/file.ts -・ /fixtures/watch-debounce/src/index.ts +・ fixtures/watch-debounce/src/file.ts +・ fixtures/watch-debounce/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checked 2 files! 🔍 -・ /fixtures/watch-debounce/src/file.ts -・ /fixtures/watch-debounce/src/index.ts +・ fixtures/watch-debounce/src/file.ts +・ fixtures/watch-debounce/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (3 issues) 🎉 +✅ test: "test" got checked for the first time! (3 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", "Stopping watch mode... 👋 ", diff --git a/test/watch/__snapshots__/watch-filter-error.spec.ts.snap b/test/watch/__snapshots__/watch-filter-error.spec.ts.snap new file mode 100644 index 000000000..0f2f06237 --- /dev/null +++ b/test/watch/__snapshots__/watch-filter-error.spec.ts.snap @@ -0,0 +1,111 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should show an error for an invalid filter in watch mode 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (1 issue) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Press "enter" to confirm, or "esc" to cancel. +Use RegExp patterns e.g. /my test/. Use "," to separate multiple filters. +Filters: + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" to quit) +", + "Press "enter" to confirm, or "esc" to cancel. +Use RegExp patterns e.g. /my test/. Use "," to separate multiple filters. +Filters: ( + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" to quit) +", + "Press "enter" to confirm, or "esc" to cancel. +Use RegExp patterns e.g. /my test/. Use "," to separate multiple filters. +Filters: ( +Invalid regular expression: /(/i: Unterminated group + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" to quit) +", + "Filters (press "f" to edit): ( +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter-error/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter-error/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter-error/src/index.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (1 issue) 😐 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checked 1 file! 🔍 + +・ fixtures/watch-filter-error/src/index.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (1 issue) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 + +(press "ctrl+c" or "q" to quit) +", + "Stopping watch mode... 👋 +", +] +`; diff --git a/test/watch/__snapshots__/watch-filter.spec.ts.snap b/test/watch/__snapshots__/watch-filter.spec.ts.snap new file mode 100644 index 000000000..3d534d2c5 --- /dev/null +++ b/test/watch/__snapshots__/watch-filter.spec.ts.snap @@ -0,0 +1,409 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should filter based on input in watch mode 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! +", + "🌟 Betterer (0ms): 1 test running... 1 test done! +✅ test1: "test1" got checked for the first time! (1 issue) 🎉 +✅ test2: "test2" met its goal! 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ test1: "test1" got checked for the first time! (1 issue) 🎉 +✅ test2: "test2" met its goal! 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ test1: "test1" got checked for the first time! (1 issue) 🎉 +✅ test2: "test2" met its goal! 🎉 + +2 tests got checked. 🤔 +1 test got checked for the first time! 🎉 +1 test met its goal! 🎉 +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 2 tests running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 1 test running... 1 test done! +✅ test1: "test1" stayed the same. (1 issue) 😐 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" stayed the same. (1 issue) 😐 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checked 1 file! 🔍 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" stayed the same. (1 issue) 😐 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +2 tests got checked. 🤔 +1 test stayed the same. 😐 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Press "enter" to confirm, or "esc" to cancel. +Use RegExp patterns e.g. /my test/. Use "," to separate multiple filters. +Filters: + +Checked 1 file! 🔍 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" stayed the same. (1 issue) 😐 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +2 tests got checked. 🤔 +1 test stayed the same. 😐 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" to quit) +", + "Press "enter" to confirm, or "esc" to cancel. +Use RegExp patterns e.g. /my test/. Use "," to separate multiple filters. +Filters: 2 + +Checked 1 file! 🔍 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" stayed the same. (1 issue) 😐 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +2 tests got checked. 🤔 +1 test stayed the same. 😐 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checked 1 file! 🔍 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" stayed the same. (1 issue) 😐 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +2 tests got checked. 🤔 +1 test stayed the same. 😐 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 2 tests running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 1 test running... 1 test done! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checked 1 file! 🔍 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (1 new issue, 0 existing, 1 total) 😔 +・ 1 new issue in "fixtures/watch-filter/src/index.ts". +・ +・ > 1 | console.log('foo');debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got skipped. 🚫 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 2 tests running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +🌟 Betterer (0ms): 1 test running... 1 test done! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 2 new issues in "fixtures/watch-filter/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');debugger;debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 2 new issues in "fixtures/watch-filter/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');debugger;debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): 2 +Ignores (press "i" to edit): No current ignore patterns + +Checked 1 file! 🔍 + +・ fixtures/watch-filter/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 2 new issues in "fixtures/watch-filter/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');debugger;debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got skipped. 🚫 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Stopping watch mode... 👋 +", +] +`; diff --git a/test/watch/__snapshots__/watch-force-stop.spec.ts.snap b/test/watch/__snapshots__/watch-force-stop.spec.ts.snap index 8cc242001..65c52e6b0 100644 --- a/test/watch/__snapshots__/watch-force-stop.spec.ts.snap +++ b/test/watch/__snapshots__/watch-force-stop.spec.ts.snap @@ -1,15 +1,13 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer.watch should stop when forced 1`] = ` -Array [ - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns +exports[`betterer.watch > should stop when forced 1`] = ` +[ + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Starting Betterer in watch mode! 🎉 -(press \\"q\\" to quit) -", - "Stopping watch mode... 👋 +(press "ctrl+c" or "q" to quit) ", ] `; diff --git a/test/watch/__snapshots__/watch-ignore.spec.ts.snap b/test/watch/__snapshots__/watch-ignore.spec.ts.snap new file mode 100644 index 000000000..931100301 --- /dev/null +++ b/test/watch/__snapshots__/watch-ignore.spec.ts.snap @@ -0,0 +1,255 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should ignore based on input in watch mode 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" met its goal! 🎉 + +1 test got checked. 🤔 +1 test met its goal! 🎉 +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 2 files... 🤔 + +・ fixtures/watch-ignore/src/ignored.ts +・ fixtures/watch-ignore/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 2 files... 🤔 + +・ fixtures/watch-ignore/src/ignored.ts +・ fixtures/watch-ignore/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 2 files... 🤔 + +・ fixtures/watch-ignore/src/ignored.ts +・ fixtures/watch-ignore/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 1 new issue in "fixtures/watch-ignore/src/ignored.ts". +・ 1 new issue in "fixtures/watch-ignore/src/index.ts". +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checked 2 files! 🔍 + +・ fixtures/watch-ignore/src/ignored.ts +・ fixtures/watch-ignore/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 1 new issue in "fixtures/watch-ignore/src/ignored.ts". +・ 1 new issue in "fixtures/watch-ignore/src/index.ts". +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Press "enter" to confirm, or "esc" to cancel. +Use glob patterns starting from CWD e.g. **/*.ts. Use "," to separate multiple ignores. +Ignores: + +Checked 2 files! 🔍 + +・ fixtures/watch-ignore/src/ignored.ts +・ fixtures/watch-ignore/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 1 new issue in "fixtures/watch-ignore/src/ignored.ts". +・ 1 new issue in "fixtures/watch-ignore/src/index.ts". +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" to quit) +", + "Press "enter" to confirm, or "esc" to cancel. +Use glob patterns starting from CWD e.g. **/*.ts. Use "," to separate multiple ignores. +Ignores: **/ignored.* + +Checked 2 files! 🔍 + +・ fixtures/watch-ignore/src/ignored.ts +・ fixtures/watch-ignore/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 1 new issue in "fixtures/watch-ignore/src/ignored.ts". +・ 1 new issue in "fixtures/watch-ignore/src/index.ts". +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): **/ignored.* + +Checked 2 files! 🔍 + +・ fixtures/watch-ignore/src/ignored.ts +・ fixtures/watch-ignore/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 1 new issue in "fixtures/watch-ignore/src/ignored.ts". +・ 1 new issue in "fixtures/watch-ignore/src/index.ts". +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ +・ +・ > 1 | console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-ignore/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-ignore/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-ignore/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 2 new issues in "fixtures/watch-ignore/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): **/ignored.* + +Checked 1 file! 🔍 + +・ fixtures/watch-ignore/src/index.ts + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (2 new issues, 0 existing, 2 total) 😔 +・ 2 new issues in "fixtures/watch-ignore/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');console.log('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Stopping watch mode... 👋 +", +] +`; diff --git a/test/watch/__snapshots__/watch-ignored.spec.ts.snap b/test/watch/__snapshots__/watch-ignored.spec.ts.snap index 064cee3ca..b3c7ea2c7 100644 --- a/test/watch/__snapshots__/watch-ignored.spec.ts.snap +++ b/test/watch/__snapshots__/watch-ignored.spec.ts.snap @@ -1,75 +1,63 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer.watch should ignore .gitignored files 1`] = ` -Array [ - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns +exports[`betterer.watch > should ignore .gitignored files 1`] = ` +[ + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Starting Betterer in watch mode! 🎉 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch-ignored/src/index.ts +・ fixtures/watch-ignored/src/index.ts 🌟 Betterer (0ms): -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch-ignored/src/index.ts +・ fixtures/watch-ignored/src/index.ts 🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! +🤔 test: running "test"! -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch-ignored/src/index.ts - -🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch-ignored/src/index.ts +・ fixtures/watch-ignored/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checked 1 file! 🔍 -・ /fixtures/watch-ignored/src/index.ts +・ fixtures/watch-ignored/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (1 issue) 🎉 +✅ test: "test" got checked for the first time! (1 issue) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", "Stopping watch mode... 👋 ", diff --git a/test/watch/__snapshots__/watch-options.spec.ts.snap b/test/watch/__snapshots__/watch-options.spec.ts.snap new file mode 100644 index 000000000..e1e485bb1 --- /dev/null +++ b/test/watch/__snapshots__/watch-options.spec.ts.snap @@ -0,0 +1,147 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should be able to change options while running in watch mode 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! +", + "🌟 Betterer (0ms): 2 tests running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! +", + "🌟 Betterer (0ms): 1 test running... 1 test done! +✅ test1: "test1" got checked for the first time! (1 issue) 🎉 +✅ test2: "test2" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ test1: "test1" got checked for the first time! (1 issue) 🎉 +✅ test2: "test2" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 2 tests done! +✅ test1: "test1" got checked for the first time! (1 issue) 🎉 +✅ test2: "test2" got checked for the first time! (1 issue) 🎉 + +2 tests got checked. 🤔 +2 tests got checked for the first time! 🎉 +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): /2/ +Ignores (press "i" to edit): **/ignored.* + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): /2/ +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-options/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): /2/ +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-options/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): /2/ +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-options/src/index.ts + +🌟 Betterer (0ms): 2 tests running... +🤔 test1: running "test1"! +🤔 test2: running "test2"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): /2/ +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-options/src/index.ts + +🌟 Betterer (0ms): 1 test running... 1 test done! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 fixed, 2 new issues in "fixtures/watch-options/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');debugger;debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): /2/ +Ignores (press "i" to edit): **/ignored.* + +Checking 1 file... 🤔 + +・ fixtures/watch-options/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 fixed, 2 new issues in "fixtures/watch-options/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');debugger;debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): /2/ +Ignores (press "i" to edit): **/ignored.* + +Checked 1 file! 🔍 + +・ fixtures/watch-options/src/index.ts + +💥 Betterer (0ms): 2 tests done! 1 test errored! +✅ test1: "test1" got skipped. 🚫 +🔥 test2: "test2" got worse. (1 new issue, 1 existing, 2 total) 😔 +・ 1 fixed, 2 new issues in "fixtures/watch-options/src/index.ts". +・ Showing first of 2 new issues: +・ +・ > 1 | console.log('foo');debugger;debugger; +・ | ^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got skipped. 🚫 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Stopping watch mode... 👋 +", +] +`; diff --git a/test/watch/__snapshots__/watch-quit.e2e.spec.ts.snap b/test/watch/__snapshots__/watch-quit.e2e.spec.ts.snap deleted file mode 100644 index 7769e866a..000000000 --- a/test/watch/__snapshots__/watch-quit.e2e.spec.ts.snap +++ /dev/null @@ -1,77 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`betterer.watch should quit when "q" is pressed 1`] = ` -Array [ - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Starting Betterer in watch mode! 🎉 - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch-quit/src/index.ts - -🌟 Betterer (0ms): - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch-quit/src/index.ts - -🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch-quit/src/index.ts - -🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch-quit/src/index.ts - -🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checked 1 file! 🔍 - -・ /fixtures/watch-quit/src/index.ts - -🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 - -1 test got checked. 🤔 -1 test got checked for the first time! 🎉 - -(press \\"q\\" to quit) -", - "Stopping watch mode... 👋 -", -] -`; diff --git a/test/watch/__snapshots__/watch-quit.spec.ts.snap b/test/watch/__snapshots__/watch-quit.spec.ts.snap new file mode 100644 index 000000000..af445c588 --- /dev/null +++ b/test/watch/__snapshots__/watch-quit.spec.ts.snap @@ -0,0 +1,65 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should quit when "q" is pressed 1`] = ` +[ + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-quit/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-quit/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-quit/src/index.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checked 1 file! 🔍 + +・ fixtures/watch-quit/src/index.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (2 issues) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Stopping watch mode... 👋 +", +] +`; diff --git a/test/watch/__snapshots__/watch-tests-change.spec.ts.snap b/test/watch/__snapshots__/watch-tests-change.spec.ts.snap new file mode 100644 index 000000000..cfc76a868 --- /dev/null +++ b/test/watch/__snapshots__/watch-tests-change.spec.ts.snap @@ -0,0 +1,125 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`betterer.watch > should rerun all tests if the tests file changes 1`] = ` +[ + "🌟 Betterer (0ms): +", + "🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (1 issue) 🎉 +", + "🎉 Betterer (0ms): 1 test done! +✅ test: "test" got checked for the first time! (1 issue) 🎉 + +1 test got checked. 🤔 +1 test got checked for the first time! 🎉 +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Starting Betterer in watch mode! 🎉 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-tests-change/src/index.ts + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-tests-change/src/index.ts + +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checking 1 file... 🤔 + +・ fixtures/watch-tests-change/src/index.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (1 issue) 😐 + +(press "ctrl+c" or "q" to quit) +", + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns + +Checked 1 file! 🔍 + +・ fixtures/watch-tests-change/src/index.ts + +🎉 Betterer (0ms): 1 test done! +✅ test: "test" stayed the same. (1 issue) 😐 + +1 test got checked. 🤔 +1 test stayed the same. 😐 + +(press "ctrl+c" or "q" to quit) +", + "Your tests have changed, re-checking everything... +This could take a sec. ⏰ + +🌟 Betterer (0ms): + +(press "ctrl+c" or "q" to quit) +", + "Your tests have changed, re-checking everything... +This could take a sec. ⏰ + +🌟 Betterer (0ms): 1 test running... +🤔 test: running "test"! + +(press "ctrl+c" or "q" to quit) +", + "Your tests have changed, re-checking everything... +This could take a sec. ⏰ + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (1 issue) 😔 +・ 1 fixed, 1 new issues in "fixtures/watch-tests-change/src/index.ts". +・ +・ > 1 | console.log('foo');console.dir('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +(press "ctrl+c" or "q" to quit) +", + "Your tests have changed, re-checking everything... +This could take a sec. ⏰ + +💥 Betterer (0ms): 1 test done! 1 test errored! +🔥 test: "test" got worse. (1 issue) 😔 +・ 1 fixed, 1 new issues in "fixtures/watch-tests-change/src/index.ts". +・ +・ > 1 | console.log('foo');console.dir('foo'); +・ | ^^^^^^^^^^^ TSQuery match +・ + +1 test got checked. 🤔 +1 test got worse. 😔 + +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 + +(press "ctrl+c" or "q" to quit) +", + "Stopping watch mode... 👋 +", +] +`; diff --git a/test/watch/__snapshots__/watch.spec.ts.snap b/test/watch/__snapshots__/watch.spec.ts.snap index 8ed87e1a6..bd66f34a8 100644 --- a/test/watch/__snapshots__/watch.spec.ts.snap +++ b/test/watch/__snapshots__/watch.spec.ts.snap @@ -1,263 +1,193 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`betterer.watch should run in watch mode 1`] = ` -Array [ +exports[`betterer.watch > should run in watch mode 1`] = ` +[ "🌟 Betterer (0ms): ", "🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! -", - "🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +🤔 test: running "test"! ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 ", "🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got checked for the first time! (2 issues) 🎉 +✅ test: "test" got checked for the first time! (2 issues) 🎉 1 test got checked. 🤔 1 test got checked for the first time! 🎉 ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Starting Betterer in watch mode! 🎉 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🌟 Betterer (0ms): -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch/src/index.ts - -🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch/src/index.ts - -🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🌟 Betterer (0ms): 1 test running... -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 +🤔 test: running "test"! -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/watch/src/index.ts\\". -・ New issue in \\"/fixtures/watch/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/watch/src/index.ts". ・ -・ /fixtures/watch/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo');console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match ・ -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checked 1 file! 🔍 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/watch/src/index.ts\\". -・ New issue in \\"/fixtures/watch/src/index.ts\\"! +🔥 test: "test" got worse. (1 new issue, 2 existing, 3 total) 😔 +・ 2 existing, 1 new issues in "fixtures/watch/src/index.ts". ・ -・ /fixtures/watch/src/index.ts ・ 1 | console.log('foo'); ・ > 2 | console.log('foo');console.log('foo'); ・ | ^^^^^^^^^^^ TSQuery match ・ -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 - 1 test got checked. 🤔 1 test got worse. 😔 +You should try to fix the new issues! As a last resort, you can run \`betterer --update\` to force an update of the results file. 🆙 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts -💥 Betterer (0ms): 1 test done! 1 test errored! -🔥 test: \\"test\\" got worse. (1 new issue, 3 total) 😔 -・ 2 existing issues in \\"/fixtures/watch/src/index.ts\\". -・ New issue in \\"/fixtures/watch/src/index.ts\\"! -・ -・ /fixtures/watch/src/index.ts -・ 1 | console.log('foo'); -・ > 2 | console.log('foo');console.log('foo'); -・ | ^^^^^^^^^^^ TSQuery match -・ - -Error: \\"test\\" got worse. (1 new issue, 3 total) 😔 - -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch/src/index.ts - -🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! +🌟 Betterer (0ms): -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +🤔 test: running "test"! -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checked 1 file! 🔍 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 +✅ test: "test" stayed the same. (2 issues) 😐 1 test got checked. 🤔 1 test stayed the same. 😐 -(press \\"q\\" to quit) -", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns - -Checking 1 file... 🤔 - -・ /fixtures/watch/src/index.ts - -🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" stayed the same. (2 issues) 😐 - -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts -🌟 Betterer (0ms): 1 test running... -🤔 test: running \\"test\\"! +🌟 Betterer (0ms): -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🌟 Betterer (0ms): 1 test running... -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +🤔 test: running "test"! -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checking 1 file... 🤔 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 1 remaining) 😍 +・ 1 fixed, 1 existing issues in "fixtures/watch/src/index.ts". -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", - "Filters (press \\"f\\" to edit): No current filter patterns -Ignores (press \\"i\\" to edit): No current ignore patterns + "Filters (press "f" to edit): No current filter patterns +Ignores (press "i" to edit): No current ignore patterns Checked 1 file! 🔍 -・ /fixtures/watch/src/index.ts +・ fixtures/watch/src/index.ts 🎉 Betterer (0ms): 1 test done! -✅ test: \\"test\\" got better! (1 fixed issue, 1 remaining) 😍 +✅ test: "test" got better! (1 fixed issue, 1 remaining) 😍 +・ 1 fixed, 1 existing issues in "fixtures/watch/src/index.ts". 1 test got checked. 🤔 1 test got better! 😍 -(press \\"q\\" to quit) +(press "ctrl+c" or "q" to quit) ", "Stopping watch mode... 👋 ", diff --git a/test/watch/watch-cli.spec.ts b/test/watch/watch-cli.spec.ts new file mode 100644 index 000000000..2a87d298e --- /dev/null +++ b/test/watch/watch-cli.spec.ts @@ -0,0 +1,36 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const ARGV = ['node', './bin/betterer']; + +describe('betterer.watch', () => { + it('should work when run from the cli', async () => { + const { logs, paths, cleanup, sendKeys } = await createFixture('watch-cli', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + test: () => tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') +}; + ` + }); + + const fixturePath = paths.cwd; + + const { cliΔ } = await import('@betterer/cli'); + + const done = cliΔ(fixturePath, [...ARGV, 'watch', '--workers=false'], false); + + // Press "q" to quit watch mode: + await sendKeys('q'); + + await done; + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/watch/watch-config-validation.spec.ts b/test/watch/watch-config-validation.spec.ts new file mode 100644 index 000000000..ef9776f40 --- /dev/null +++ b/test/watch/watch-config-validation.spec.ts @@ -0,0 +1,26 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +describe('betterer.watch', () => { + it.each([{ ignores: 1234 }, { ignores: true }, { ignores: {} }, { ignores: [1234] }])( + `should throw when there is invalid config: %s`, + async (config) => { + const { betterer } = await import('@betterer/betterer'); + + const { cleanup, logs, paths } = await createFixture('watch-config-validation', { + '.betterer.js': '' + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + // @ts-expect-error testing invalid config + await expect(async () => await betterer.watch({ configPaths, resultsPath, ...config })).rejects.toThrow(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + } + ); +}); diff --git a/test/watch/watch-debounced.spec.ts b/test/watch/watch-debounced.spec.ts index 7d83a125a..cb39dc925 100644 --- a/test/watch/watch-debounced.spec.ts +++ b/test/watch/watch-debounced.spec.ts @@ -1,8 +1,8 @@ import type { BettererSuiteSummary } from '@betterer/betterer'; -import assert from 'node:assert'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; describe('betterer.watch', () => { it('should debounce runs when multiple files change', async () => { @@ -26,7 +26,7 @@ export default { const filePath = resolve('./src/file.ts'); const { cwd } = paths; - const suiteSummaryDefer = defer(); + const suiteSummaryDefer = Promise.withResolvers(); const runner = await watch({ configPaths, @@ -56,23 +56,3 @@ export default { await cleanup(); }); }); - -type Resolve = (value: T) => void; -type Reject = (error: Error) => void; -interface Defer { - promise: Promise; - resolve: Resolve; - reject: Reject; -} - -function defer(): Defer { - let resolve: Resolve | null = null; - let reject: Reject | null = null; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - assert(resolve); - assert(reject); - return { promise, resolve, reject }; -} diff --git a/test/watch/watch-filter-error.spec.ts b/test/watch/watch-filter-error.spec.ts new file mode 100644 index 000000000..1e5932316 --- /dev/null +++ b/test/watch/watch-filter-error.spec.ts @@ -0,0 +1,61 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +const isNode16 = process.version.startsWith('v16'); + +describe('betterer.watch', () => { + it.skipIf(!process.stdout.isTTY || isNode16)('should show an error for an invalid filter in watch mode', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, resolve, cleanup, writeFile, sendKeys } = await createFixture('watch-filter-error', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + test: async () => { + await new Promise(resolve => setTimeout(resolve, 2000)); + return tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') + }, +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + const { cwd } = paths; + + await writeFile(indexPath, `console.log('foo');`); + + await betterer({ configPaths, resultsPath, cwd, workers: false }); + + const runner = await betterer.watch({ + configPaths, + resultsPath, + cwd, + reporters: ['@betterer/reporter'], + strict: false, + workers: false + }); + + await writeFile(indexPath, `console.log('foo');debugger;`); + + // Press "f" to enter filter mode: + await sendKeys('f'); + + // Press "(" which is an invalid filter: + await sendKeys('('); + + // Press "Enter" which shouldn't work: + await sendKeys('\r'); + + await runner.stop(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/watch/watch-filter.spec.ts b/test/watch/watch-filter.spec.ts new file mode 100644 index 000000000..9d9088fc4 --- /dev/null +++ b/test/watch/watch-filter.spec.ts @@ -0,0 +1,93 @@ +import type { BettererSuiteSummary } from '@betterer/betterer'; + +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +describe('betterer.watch', () => { + it.skipIf(!process.stdout.isTTY)('should filter based on input in watch mode', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, resolve, cleanup, writeFile, sendKeys } = await createFixture('watch-filter', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + test1: async () => { + await new Promise(resolve => setTimeout(resolve, 2000)); + return tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') + }, + test2: () => tsquery('DebuggerStatement').include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + const { cwd } = paths; + + await writeFile(indexPath, `console.log('foo');`); + + await betterer({ configPaths, resultsPath, cwd, workers: false }); + + const suiteSummaryDefers = [ + Promise.withResolvers(), + Promise.withResolvers(), + Promise.withResolvers() + ]; + const [worse, filtered, worseFiltered] = suiteSummaryDefers; + + const runner = await betterer.watch({ + configPaths, + resultsPath, + cwd, + reporters: [ + '@betterer/reporter', + { + suiteEnd(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + }, + suiteError(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + } + } + ], + strict: false, + workers: false + }); + + await writeFile(indexPath, `console.log('foo');debugger;`); + + const worseSuiteSummary = await worse.promise; + + expect(worseSuiteSummary.runSummaries).toHaveLength(2); + + // Press "f" to enter filter mode: + await sendKeys('f'); + + // Press "2" to target "test2": + await sendKeys('2'); + + // Press "Enter" to enable the filter: + await sendKeys('\r'); + + const filteredSuiteSummary = await filtered.promise; + expect(filteredSuiteSummary.runSummaries).toHaveLength(2); + + await writeFile(indexPath, `console.log('foo');debugger;debugger;`); + + const filteredWorseSuiteSummary = await worseFiltered.promise; + expect(filteredWorseSuiteSummary.runSummaries).toHaveLength(2); + + await runner.stop(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/watch/watch-force-stop.spec.ts b/test/watch/watch-force-stop.spec.ts index 69f6496fd..d1f496721 100644 --- a/test/watch/watch-force-stop.spec.ts +++ b/test/watch/watch-force-stop.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; describe('betterer.watch', () => { it('should stop when forced', async () => { diff --git a/test/watch/watch-ignore.spec.ts b/test/watch/watch-ignore.spec.ts new file mode 100644 index 000000000..4ebc51453 --- /dev/null +++ b/test/watch/watch-ignore.spec.ts @@ -0,0 +1,91 @@ +import type { BettererSuiteSummary } from '@betterer/betterer'; + +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +describe('betterer.watch', () => { + it.skipIf(!process.stdout.isTTY)('should ignore based on input in watch mode', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, resolve, cleanup, writeFile, sendKeys } = await createFixture('watch-ignore', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + test: () => tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') +}; + `, + './src/ignored.ts': '' + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + const ignoredPath = resolve('./src/ignored.ts'); + const { cwd } = paths; + + await betterer({ configPaths, resultsPath, cwd, workers: false }); + + const suiteSummaryDefers = [ + Promise.withResolvers(), + Promise.withResolvers(), + Promise.withResolvers() + ]; + const [allFiles, ignored] = suiteSummaryDefers; + + const runner = await betterer.watch({ + configPaths, + resultsPath, + cwd, + reporters: [ + '@betterer/reporter', + { + suiteEnd(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + }, + suiteError(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + } + } + ], + workers: false + }); + + await writeFile(indexPath, `console.log('foo');`); + await writeFile(ignoredPath, `console.log('foo');`); + + const allSuiteSummary = await allFiles.promise; + const [allRunSummary] = allSuiteSummary.runSummaries; + expect(allRunSummary.filePaths).toHaveLength(2); + + // Press "p" which should do nothing: + await sendKeys('p'); + + // Press "i" to enter ignore mode: + await sendKeys('i'); + + // Press "ignored" to ignore "ignored.ts": + await sendKeys('**/ignored.*'); + + // Press "Enter" to enable the filter: + await sendKeys('\r'); + + await writeFile(indexPath, `console.log('foo');console.log('foo');`); + await writeFile(ignoredPath, `console.log('foo');console.log('foo');`); + + const ignoredSuiteSummary = await ignored.promise; + const [ignoredRunSummary] = ignoredSuiteSummary.runSummaries; + expect(ignoredRunSummary.filePaths).toHaveLength(1); + + await runner.stop(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/watch/watch-ignored.spec.ts b/test/watch/watch-ignored.spec.ts index 6c372ea13..eecb63d61 100644 --- a/test/watch/watch-ignored.spec.ts +++ b/test/watch/watch-ignored.spec.ts @@ -1,9 +1,8 @@ import type { BettererSuiteSummary } from '@betterer/betterer'; -import assert from 'node:assert'; +import { describe, expect, it } from 'vitest'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { createFixture } from '../fixture.js'; describe('betterer.watch', () => { it('should ignore .gitignored files', async () => { @@ -34,7 +33,7 @@ ignored.ts const nestedPath = resolve('./src/nested/ignored.ts'); const { cwd } = paths; - const suiteSummaryDefer = defer(); + const suiteSummaryDefer = Promise.withResolvers(); const runner = await betterer.watch({ configPaths, @@ -60,30 +59,10 @@ ignored.ts await runner.stop(); - expect(runSummary.filePaths).toHaveLength(1); + expect(runSummary?.filePaths).toHaveLength(1); expect(logs).toMatchSnapshot(); await cleanup(); }); }); - -type Resolve = (value: T) => void; -type Reject = (error: Error) => void; -interface Defer { - promise: Promise; - resolve: Resolve; - reject: Reject; -} - -function defer(): Defer { - let resolve: Resolve | null = null; - let reject: Reject | null = null; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - assert(resolve); - assert(reject); - return { promise, resolve, reject }; -} diff --git a/test/watch/watch-options.spec.ts b/test/watch/watch-options.spec.ts new file mode 100644 index 000000000..7b829abbb --- /dev/null +++ b/test/watch/watch-options.spec.ts @@ -0,0 +1,77 @@ +import type { BettererSuiteSummary } from '@betterer/betterer'; + +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +describe('betterer.watch', () => { + it('should be able to change options while running in watch mode', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, resolve, cleanup, writeFile } = await createFixture('watch-options', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + test1: () => tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts'), + test2: () => tsquery('DebuggerStatement').include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + const ignoredPath = resolve('./src/ignored.ts'); + const { cwd } = paths; + + await writeFile(indexPath, `console.log('foo');debugger`); + + await betterer({ configPaths, resultsPath, cwd, workers: false }); + + const suiteSummaryDefers = [Promise.withResolvers()]; + const [same] = suiteSummaryDefers; + + const runner = await betterer.watch({ + configPaths, + resultsPath, + cwd, + strict: false, + workers: false + }); + + await runner.options({ + filters: '2', + ignores: ['**/ignored.*'], + reporters: [ + '@betterer/reporter', + { + suiteEnd(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + }, + suiteError(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + } + } + ] + }); + + await writeFile(ignoredPath, `console.log('foo');`); + await writeFile(indexPath, `console.log('foo');debugger;debugger;`); + + const sameRunSummary = await same.promise; + + expect(sameRunSummary.worse).toHaveLength(1); + expect(sameRunSummary.skipped).toHaveLength(1); + + await runner.stop(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/watch/watch-queue-after-stop.spec.ts b/test/watch/watch-queue-after-stop.spec.ts new file mode 100644 index 000000000..96109e126 --- /dev/null +++ b/test/watch/watch-queue-after-stop.spec.ts @@ -0,0 +1,61 @@ +import type { BettererSuiteSummary } from '@betterer/betterer'; + +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +describe('betterer.watch', () => { + it('should throw if you try to queue a run after it has stopped', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, cleanup, resolve, writeFile } = await createFixture('watch-queue-after-stop', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + test: () => tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + const { cwd } = paths; + + await writeFile(indexPath, `console.log('foo');`); + + const suiteSummaryDefers = [Promise.withResolvers()]; + const [run] = suiteSummaryDefers; + + const runner = await betterer.watch({ + configPaths, + resultsPath, + cwd, + reporters: [ + { + suiteEnd(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + } + } + ], + strict: false, + workers: false + }); + + await writeFile(indexPath, `console.log('foo');console.log('foo');`); + + await run.promise; + + await runner.stop(); + + await expect(async () => { + await runner.queue(); + }).rejects.toThrow('You cannot queue a test run after the runner has been stopped! 💥'); + + await cleanup(); + }); +}); diff --git a/test/watch/watch-quit.e2e.spec.ts b/test/watch/watch-quit.spec.ts similarity index 58% rename from test/watch/watch-quit.e2e.spec.ts rename to test/watch/watch-quit.spec.ts index c7fc62776..2e534b82d 100644 --- a/test/watch/watch-quit.e2e.spec.ts +++ b/test/watch/watch-quit.spec.ts @@ -1,13 +1,12 @@ -import assert from 'node:assert'; +import { describe, expect, it } from 'vitest'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { createFixture } from '../fixture.js'; describe('betterer.watch', () => { it('should quit when "q" is pressed', async () => { const { betterer } = await import('@betterer/betterer'); - const { logs, paths, cleanup, resolve, writeFile } = await createFixture('watch-quit', { + const { logs, paths, cleanup, resolve, sendKeys, writeFile } = await createFixture('watch-quit', { '.betterer.ts': ` import { tsquery } from '@betterer/tsquery'; @@ -25,8 +24,8 @@ export default { const { cwd } = paths; - const suiteEndDefer = defer(); - const contextEndDefer = defer(); + const suiteEndDefer = Promise.withResolvers(); + const contextEndDefer = Promise.withResolvers(); await betterer.watch({ configPaths, @@ -51,7 +50,7 @@ export default { await suiteEndDefer.promise; // Press "q" to quit watch mode: - process.stdin.emit('data', 'q'); + await sendKeys('q'); await contextEndDefer.promise; @@ -60,23 +59,3 @@ export default { await cleanup(); }); }); - -type Resolve = (value: T) => void; -type Reject = (error: Error) => void; -interface Defer { - promise: Promise; - resolve: Resolve; - reject: Reject; -} - -function defer(): Defer { - let resolve: Resolve | null = null; - let reject: Reject | null = null; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - assert(resolve); - assert(reject); - return { promise, resolve, reject }; -} diff --git a/test/watch/watch-tests-change.spec.ts b/test/watch/watch-tests-change.spec.ts new file mode 100644 index 000000000..35e2f82e5 --- /dev/null +++ b/test/watch/watch-tests-change.spec.ts @@ -0,0 +1,80 @@ +import type { BettererSuiteSummary } from '@betterer/betterer'; + +import { describe, expect, it } from 'vitest'; + +import { createFixture } from '../fixture.js'; + +describe('betterer.watch', () => { + it('should rerun all tests if the tests file changes', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { logs, paths, readFile, resolve, cleanup, writeFile } = await createFixture('watch-tests-change', { + '.betterer.ts': ` +import { tsquery } from '@betterer/tsquery'; + +export default { + test: () => tsquery( + 'CallExpression > PropertyAccessExpression[expression.name="console"][name.name="log"]' + ).include('./src/**/*.ts') +}; + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + const indexPath = resolve('./src/index.ts'); + const { cwd } = paths; + + await writeFile(indexPath, `console.log('foo');`); + + await betterer({ configPaths, resultsPath, cwd, workers: false }); + + const suiteSummaryDefers = [ + Promise.withResolvers(), + Promise.withResolvers() + ]; + const [same, rerun] = suiteSummaryDefers; + + const runner = await betterer.watch({ + configPaths, + resultsPath, + cwd, + reporters: [ + '@betterer/reporter', + { + suiteEnd(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + }, + suiteError(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); + } + } + ], + strict: false, + workers: false + }); + + await writeFile(indexPath, `console.log('foo');console.dir('foo');`); + + const sameSuiteSummary = await same.promise; + const [sameRunSummary] = sameSuiteSummary.runSummaries; + + expect(sameRunSummary.isSame).toBe(true); + + const testsContent = await readFile(paths.config); + await writeFile(paths.config, testsContent.replace('"log"', '"dir"')); + + const rerunSuiteSummary = await rerun.promise; + const [rerunRunSummary] = rerunSuiteSummary.runSummaries; + + expect(rerunRunSummary.isWorse).toBe(true); + + await runner.stop(); + + expect(logs).toMatchSnapshot(); + + await cleanup(); + }); +}); diff --git a/test/watch/watch.spec.ts b/test/watch/watch.spec.ts index b5bf33aa7..5f7d2bf21 100644 --- a/test/watch/watch.spec.ts +++ b/test/watch/watch.spec.ts @@ -1,9 +1,8 @@ import type { BettererSuiteSummary } from '@betterer/betterer'; -import assert from 'node:assert'; +import { describe, expect, it } from 'vitest'; -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from '../fixture'; +import { createFixture } from '../fixture.js'; describe('betterer.watch', () => { it('should run in watch mode', async () => { @@ -31,9 +30,9 @@ export default { await betterer({ configPaths, resultsPath, cwd, workers: false }); const suiteSummaryDefers = [ - defer(), - defer(), - defer() + Promise.withResolvers(), + Promise.withResolvers(), + Promise.withResolvers() ]; const [worse, same, better] = suiteSummaryDefers; @@ -47,9 +46,14 @@ export default { suiteEnd(suiteSummary: BettererSuiteSummary) { const suiteSummaryDefer = suiteSummaryDefers.shift(); suiteSummaryDefer?.resolve(suiteSummary); + }, + suiteError(suiteSummary: BettererSuiteSummary) { + const suiteSummaryDefer = suiteSummaryDefers.shift(); + suiteSummaryDefer?.resolve(suiteSummary); } } ], + strict: false, workers: false }); @@ -81,23 +85,3 @@ export default { await cleanup(); }); }); - -type Resolve = (value: T) => void; -type Reject = (error: Error) => void; -interface Defer { - promise: Promise; - resolve: Resolve; - reject: Reject; -} - -function defer(): Defer { - let resolve: Resolve | null = null; - let reject: Reject | null = null; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - assert(resolve); - assert(reject); - return { promise, resolve, reject }; -} diff --git a/test/workers-faster.e2e.spec.ts b/test/workers-faster.e2e.spec.ts new file mode 100644 index 000000000..d4884b9dc --- /dev/null +++ b/test/workers-faster.e2e.spec.ts @@ -0,0 +1,99 @@ +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; + +const INDEX_SOURCE = `export function extractIds(list) { + return list.map(member => member.id); +} + +function bar() { + return this.baz.toUpperCase(); +} + +const foo = { + baz: 'baz', + bar +}; + +foo.bar(); + +export function findNumberFixed(numbers: Array, search: number) { + const number = numbers.find(n => n === search); + return number.toFixed(2); +} + +export class Foo { + private bar: number; + constructor() {} +} + +export function sum(num1: number, num2: number) { + return num1 + num2; +} + +sum.apply(null, [1, 2, 3]); +`; + +describe('betterer', () => { + it('actually goes faster in workers', async () => { + const { betterer } = await import('@betterer/betterer'); + + const { paths, cleanup, resolve, writeFile, testNames } = await createFixture('workers-faster', { + '.betterer.ts': ` +import { typescript } from '@betterer/typescript'; + +export default { + 'test 1': () => typescript('./tsconfig.json', { + strict: true + }).include('./src/**/*.ts'), + 'test 2': () => typescript('./tsconfig.json', { + strict: true + }).include('./src/**/*.ts'), + 'test 3': () => typescript('./tsconfig.json', { + strict: true + }).include('./src/**/*.ts'), + 'test 4': () => typescript('./tsconfig.json', { + strict: true + }).include('./src/**/*.ts') +}; + `, + 'tsconfig.json': ` +{ + "compilerOptions": { + "noEmit": true, + "lib": ["esnext", "dom"], + "moduleResolution": "node", + "target": "ES5", + "typeRoots": [], + "resolveJsonModule": true, + "strict": false + }, + "include": ["./src/**/*"] +} + ` + }); + + const configPaths = [paths.config]; + const resultsPath = paths.results; + + const indexPath = resolve('./src/index.ts'); + + await writeFile(indexPath, INDEX_SOURCE); + + const noWorkersStart = new Date().getTime(); + const noWorkersTestRun = await betterer({ configPaths, resultsPath, workers: false }); + const noWorkersTime = new Date().getTime() - noWorkersStart; + + expect(testNames(noWorkersTestRun.ran)).toEqual(['test 1', 'test 2', 'test 3', 'test 4']); + + const workersStart = new Date().getTime(); + const workersTestRun = await betterer({ configPaths, resultsPath, workers: true }); + const workersTime = new Date().getTime() - workersStart; + + expect(testNames(workersTestRun.same)).toEqual(['test 1', 'test 2', 'test 3', 'test 4']); + + expect(workersTime).toBeLessThan(noWorkersTime); + + await cleanup(); + }); +}); diff --git a/test/workers.spec.ts b/test/workers.e2e.spec.ts similarity index 93% rename from test/workers.spec.ts rename to test/workers.e2e.spec.ts index 8caa6efd9..968b91d48 100644 --- a/test/workers.spec.ts +++ b/test/workers.e2e.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should run tests in workers', async () => { diff --git a/test/worse-result.spec.ts b/test/worse-result.spec.ts index 194b1d480..2d4db4f4c 100644 --- a/test/worse-result.spec.ts +++ b/test/worse-result.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should work when a test gets worse', async () => { @@ -9,14 +10,14 @@ describe('betterer', () => { 'worse-result', { '.betterer.js': ` -const { BettererTest } = require('@betterer/betterer'); -const { smaller, bigger } = require('@betterer/constraints'); -const { persist } = require('@betterer/fixture'); +import { BettererTest } from '@betterer/betterer'; +import { smaller, bigger } from '@betterer/constraints'; +import { persist } from '@betterer/fixture'; -const shrinks = persist(__dirname, 'shrinks', 2); -const grows = persist(__dirname, 'grows', 0); +const shrinks = persist(import.meta.url, 'shrinks', 2); +const grows = persist(import.meta.url, 'grows', 0); -module.exports = { +export default { 'should shrink': () => new BettererTest({ test: () => shrinks.increment(), constraint: smaller diff --git a/test/worse-strict.spec.ts b/test/worse-strict.spec.ts index 491f82692..9d3c02e51 100644 --- a/test/worse-strict.spec.ts +++ b/test/worse-strict.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should stay worse if an update is not allowed', async () => { diff --git a/test/worse-update.spec.ts b/test/worse-update.spec.ts index 28dc7f283..02657fc9f 100644 --- a/test/worse-update.spec.ts +++ b/test/worse-update.spec.ts @@ -1,5 +1,6 @@ -// eslint-disable-next-line require-extensions/require-extensions -- tests not ESM ready yet -import { createFixture } from './fixture'; +import { describe, expect, it } from 'vitest'; + +import { createFixture } from './fixture.js'; describe('betterer', () => { it('should not stay worse if an update is forced', async () => { diff --git a/tools/docs-filter.ts b/tools/docs-filter.ts index cf8d14d53..6cece893d 100644 --- a/tools/docs-filter.ts +++ b/tools/docs-filter.ts @@ -3,7 +3,7 @@ import path from 'node:path'; interface ApiItem { canonicalReference: string; - members: Array; + members?: Array; } const MODELS_DIR = path.join(process.cwd(), 'goldens', 'models'); @@ -17,7 +17,9 @@ void (async () => { 'coverage', 'errors', 'eslint', + 'knip', 'logger', + 'reporter', 'regexp', 'stylelint', 'tsquery', @@ -44,11 +46,13 @@ async function removeInternalModules(includedPackages: Array) { async function removeItems(toRemove: Record>) { await Promise.all( - Object.keys(toRemove).map(async (name) => { + Object.entries(toRemove).map(async ([name, memberNames]) => { const modelJSONPath = path.join(MODELS_DIR, `${name}${MODELS_EXTENSION}`); const modelJSON = await fs.readFile(modelJSONPath, 'utf-8'); const model = JSON.parse(modelJSON) as ApiItem; - removeMembers(model.members, toRemove[name]); + if (model.members) { + removeMembers(model.members, memberNames); + } await fs.writeFile(modelJSONPath, JSON.stringify(model, null, 2), 'utf-8'); }) ); diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json index 24f432e0b..1ebacdd04 100644 --- a/tsconfig.eslint.json +++ b/tsconfig.eslint.json @@ -1,4 +1,13 @@ { "extends": "./tsconfig.json", - "include": ["**/*.js", "**/*.ts", "**/*.tsx", ".eslintrc.js"] + "include": [ + "**/*.js", + "**/*.ts", + "**/*.tsx", + "*.js", + "*.ts", + ".betterer.ts", + ".prettierrc.js", + "commitlint.config.cjs" + ] } diff --git a/tsconfig.json b/tsconfig.json index 561bd9a3f..756202a49 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,18 +11,20 @@ "jsx": "react", "resolveJsonModule": true, "lib": ["esnext", "DOM"], - "module": "CommonJS", + "module": "ESNext", "moduleResolution": "node", "noEmitOnError": true, "noUnusedLocals": true, "noUnusedParameters": true, "noImplicitReturns": true, "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, "pretty": true, + "skipLibCheck": true, "sourceMap": true, "strict": true, "target": "ES2017", - "outDir": "./dist", + "noEmit": false, "typeRoots": ["./node_modules/@types", "./types"] } } diff --git a/tsconfig.spec.json b/tsconfig.spec.json new file mode 100644 index 000000000..f7b50896c --- /dev/null +++ b/tsconfig.spec.json @@ -0,0 +1,27 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "allowJs": true, + "paths": { + "@betterer/angular": ["./packages/angular/src/index"], + "@betterer/betterer": ["./packages/betterer/src/index"], + "@betterer/cli": ["./packages/cli/src/index"], + "@betterer/constraints": ["./packages/constraints/src/index"], + "@betterer/coverage": ["./packages/coverage/src/index"], + "@betterer/errors": ["./packages/errors/src/index"], + "@betterer/eslint": ["./packages/eslint/src/index"], + "@betterer/fixture": ["./packages/fixture/src/index"], + "@betterer/knip": ["./packages/knip/src/index"], + "@betterer/logger": ["./packages/logger/src/index"], + "@betterer/regexp": ["./packages/regexp/src/index"], + "@betterer/render": ["./packages/render/src/index"], + "@betterer/reporter": ["./packages/reporter/src/index"], + "@betterer/stylelint": ["./packages/stylelint/src/index"], + "@betterer/tasks": ["./packages/tasks/src/index"], + "@betterer/time": ["./packages/time/src/index"], + "@betterer/tsquery": ["./packages/tsquery/src/index"], + "@betterer/typescript": ["./packages/typescript/src/index"], + "@betterer/worker": ["./packages/worker/src/index"] + } + } +} diff --git a/types/dependency-check/index.d.ts b/types/dependency-check/index.d.ts deleted file mode 100644 index 1b85e1cec..000000000 --- a/types/dependency-check/index.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -declare module 'dependency-check' { - type DependencyCheckOptions = { - path: string; - entries: Array; - }; - - type DependencyCheckPackage = { - name: string; - }; - - type DependencyCheckResult = { - package: DependencyCheckPackage; - used: Array; - }; - - namespace check { - export function missing(package: DependencyCheckPackage, used: Array): Promise>; - } - - function check(options?: DependencyCheckOptions): Promise; - export = check; -} diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 000000000..d46709358 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,46 @@ +import { defineConfig } from 'vitest/config'; + +import { MCROptions } from './mcr.config.js'; + +import tsconfigPaths from 'vite-tsconfig-paths'; + +const isNode16 = process.version.startsWith('v16'); + +export default defineConfig({ + plugins: [ + tsconfigPaths({ + configNames: ['tsconfig.spec.json'] + }) + ], + server: { + watch: { + ignored: ['**/fixtures/**'] + } + }, + test: { + setupFiles: ['./test/setup.ts'], + include: ['test/**/*.spec.ts'], + exclude: ['test/**/*.e2e.spec.ts'], + reporters: ['basic'], + isolate: true, + + // node.js v16 struggled with all the parallelism... + fileParallelism: !isNode16, + + // Our tests are basically E2E so they're a bit slow as is... + slowTestThreshold: 30000, + testTimeout: 90000, + + watch: false, + coverage: { + enabled: true, + reportsDirectory: 'reports/unit-coverage-v8', + + provider: 'custom', + customProviderModule: 'vitest-monocart-coverage', + + // @ts-expect-error - types are wrong for monocart I guess? + coverageReportOptions: MCROptions + } + } +}); diff --git a/vitest.e2e.config.ts b/vitest.e2e.config.ts new file mode 100644 index 000000000..0d7e10a44 --- /dev/null +++ b/vitest.e2e.config.ts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vitest/config'; + +import config from './vitest.config.js'; + +export default defineConfig({ + test: { + ...config.test, + include: ['test/**/*.e2e.spec.ts'], + exclude: [], + coverage: { + enabled: false + } + } +}); diff --git a/website/.yarnrc b/website/.yarnrc deleted file mode 100644 index a1f15f515..000000000 --- a/website/.yarnrc +++ /dev/null @@ -1,2 +0,0 @@ -registry "https://registry.npmjs.org/" -network-timeout 600000 \ No newline at end of file diff --git a/website/blog/2020-05-14-betterer-v1.0.0.md b/website/blog/2020-05-14-betterer-v1.0.0.md index d48365528..cab5aa264 100644 --- a/website/blog/2020-05-14-betterer-v1.0.0.md +++ b/website/blog/2020-05-14-betterer-v1.0.0.md @@ -1,8 +1,6 @@ --- title: Betterer v1.0.0 ☀️ -author: Craig Spence -authorURL: http://twitter.com/phenomnominal -authorTwitter: phenomnominal +authors: craig --- I'm stoked to announce [v1.0.0](https://www.npmjs.com/org/betterer) of [**Betterer**!](https://github.com/phenomnomnominal/betterer) @@ -25,6 +23,8 @@ I've seen this happen time and time and again! Sometimes it's introducing a new **Betterer** works in two stages. The first time it runs a test, it will take a snapshot of the current state. From that point on, whenever it runs it will compare against that snapshot. It will either throw an error (if the test got worse ❌), or update the snapshot (if the test got better ✅). That's pretty much it! + + ## How does it work? To get started, you can run the following from the root of your project: diff --git a/website/blog/2020-05-15-improving-accessibility-with-betterer.md b/website/blog/2020-05-15-improving-accessibility-with-betterer.md index b44e4cad8..abd94966f 100644 --- a/website/blog/2020-05-15-improving-accessibility-with-betterer.md +++ b/website/blog/2020-05-15-improving-accessibility-with-betterer.md @@ -1,8 +1,6 @@ --- title: Improving accessibility with Betterer ☀️ -author: Craig Spence -authorURL: http://twitter.com/phenomnominal -authorTwitter: phenomnominal +authors: craig --- So, yesterday I announced the new release of [☀️ **Betterer**](https://dev.to/phenomnominal/betterer-v1-0-0-301b), thanks if you've checked it out already! @@ -15,6 +13,8 @@ I wanted to write another post describing a different example, this time with a **Betterer** works in two stages. The first time it runs a test, it will take a snapshot of the current state. From that point on, whenever it runs it will compare against that snapshot. It will either throw an error (if the test got worse ❌), or update the snapshot (if the test got better ✅). That's pretty much it! + + ## Our first **Betterer** test Writing a test with **Betterer** involves implementing two functions! More formally, we need to implement the `BettererTest` type: diff --git a/website/blog/2021-03-01-betterer-and-stylelint.md b/website/blog/2021-03-01-betterer-and-stylelint.md index 5720a0cb4..37984fd56 100644 --- a/website/blog/2021-03-01-betterer-and-stylelint.md +++ b/website/blog/2021-03-01-betterer-and-stylelint.md @@ -1,8 +1,6 @@ --- title: Incrementally adding Stylelint rules with Betterer ☀️ -author: Craig Spence -authorURL: http://twitter.com/phenomnominal -authorTwitter: phenomnominal +authors: craig --- I just released [v4.0.0 of **Betterer**](https://github.com/phenomnomnominal/betterer) 🎉 (now with [sweet new docs!](https://phenomnomnominal.github.io/betterer/)) and it has a bunch of simplified APIs for writing [tests](https://phenomnomnominal.github.io/betterer/docs/betterer-file-test). And just before I shipped it, I got [an issue](https://github.com/phenomnomnominal/betterer/issues/519) asking how to write a [**Stylelint**](https://stylelint.io/) test, so let's do it here and explain it line by line: @@ -53,6 +51,8 @@ export default { }; ``` + + ## NTL;PR (not that long, please read 😂) ### **Stylelint** diff --git a/website/blog/2021-11-13-betterer-v5.0.0.md b/website/blog/2021-11-13-betterer-v5.0.0.md index 6ad3460b9..c84a50482 100644 --- a/website/blog/2021-11-13-betterer-v5.0.0.md +++ b/website/blog/2021-11-13-betterer-v5.0.0.md @@ -1,8 +1,6 @@ --- title: Betterer v5.0.0 ☀️ -author: Craig Spence -authorURL: http://twitter.com/phenomnominal -authorTwitter: phenomnominal +authors: craig --- Oof, this one feels like it's been a while coming, but after a whole bunch of work, and a whole bunch of breaking changes **I've just released** [**v5.0.0**](https://www.npmjs.com/package/@betterer/cli) **of** [**Betterer!**](https://phenomnomnominal.github.io/betterer/) 🎉 @@ -15,6 +13,8 @@ The first time **Betterer** it runs a test, it will take a snapshot of the curre You can check out the (newly updated!) documentation at [https://phenomnomnominal.github.io/betterer/](https://phenomnomnominal.github.io/betterer/) + + ## What happened to v2, v3, v4...? "But Craig", I hear you say, "The [last time you posted about **Betterer**](https://dev.to/phenomnominal/betterer-v1-0-0-301b), it was at v1.0.0!? What's been going on?!". 🔥🔥🔥 diff --git a/website/blog/authors.yml b/website/blog/authors.yml new file mode 100644 index 000000000..dd041650d --- /dev/null +++ b/website/blog/authors.yml @@ -0,0 +1,9 @@ +craig: + name: Craig Spence + title: Creator of Betterer + url: http://twitter.com/phenomnominal + image_url: https://avatars.githubusercontent.com/u/1086286 + email: craigspence0@gmail.com + socials: + x: phenomnominal + github: phenomnomnominal diff --git a/website/docs/angular-test.md b/website/docs/angular-test.md index a1ec80013..85678cfba 100644 --- a/website/docs/angular-test.md +++ b/website/docs/angular-test.md @@ -21,4 +21,4 @@ export default { }; ``` -[`@betterer/angular`](https://www.npmjs.com/package/@betterer/angular) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererfiletest.include), [`exclude`](./betterer.bettererfiletest.exclude), [`only`](betterer.bettererfiletest.only), and [`skip`](betterer.bettererfiletest.skip). +[`@betterer/angular`](https://www.npmjs.com/package/@betterer/angular) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docs/coverage-test.md b/website/docs/coverage-test.md index ed2870fc3..18502ef8f 100644 --- a/website/docs/coverage-test.md +++ b/website/docs/coverage-test.md @@ -10,22 +10,29 @@ slug: /coverage-test Use the `coverage` test to incrementally increase the per-file test coverage of your project. +:::caution + [`@betterer/coverage`](https://www.npmjs.com/package/@betterer/coverage) expects an [Istanbul](https://istanbul.js.org/) [json-summary](https://github.com/istanbuljs/istanbuljs/tree/master/packages/istanbul-reports/lib/json-summary) to exist, so you must run your tests first. +::: + +By default, `coverage()` looks for the summary at `'./coverage/coverage-summary.json'`, but you can pass the path to wherever yours is located, relative to your [test definition file](./test-definition-file). ```typescript import { coverage } from '@betterer/coverage'; export default { - 'increase per-file test coverage': () => coverage() + 'increase per-file test coverage': () => coverage('./my-reports/coverage.json') }; ``` Use the `coverageTotal` test to incrementally increase the total test coverage of your project. -```javascript +```typescript import { coverageTotal } from '@betterer/coverage'; export default { 'increase total test coverage': () => coverageTotal() }; ``` + +[`@betterer/coverage`](https://www.npmjs.com/package/@betterer/coverage) is a [BettererResolverTest](./betterer.bettererresolvertest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docs/eslint-test.md b/website/docs/eslint-test.md index 706ffe3af..8179abda1 100644 --- a/website/docs/eslint-test.md +++ b/website/docs/eslint-test.md @@ -8,14 +8,22 @@ slug: /eslint-test ### [`@betterer/eslint`](https://www.npmjs.com/package/@betterer/eslint) -Use this test to incrementally introduce new [**ESLint**](https://eslint.org/) rules to your codebase. You can pass as many [rule configurations](https://eslint.org/docs/rules/) as you like: +Use this test to incrementally introduce new [**ESLint**](https://eslint.org/) configuration to your codebase. + +From [`@betterer/eslint@6.0.0`](https://www.npmjs.com/package/@betterer/eslint), this test only works with ESLint's new flat config, so if you are using the old configuration format, you'll need to use an older version of `@betterer/eslint`. ```typescript import { eslint } from '@betterer/eslint'; export default { - 'no more debuggers': () => eslint({ 'no-debugger': 'error' }).include('./src/**/*.ts') + 'new eslint rules': () => + eslint({ + rules: { + 'no-debugger': 'error', + 'no-unsafe-finally': 'error' + } + }).include('./src/*.ts') }; ``` -[`@betterer/eslint`](https://www.npmjs.com/package/@betterer/eslint) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererfiletest.include), [`exclude`](./betterer.bettererfiletest.exclude), [`only`](betterer.bettererfiletest.only), and [`skip`](betterer.bettererfiletest.skip). +[`@betterer/eslint`](https://www.npmjs.com/package/@betterer/eslint) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docs/knip-test.md b/website/docs/knip-test.md new file mode 100644 index 000000000..991b716b6 --- /dev/null +++ b/website/docs/knip-test.md @@ -0,0 +1,30 @@ +--- +id: knip-test +title: Knip test +slug: /knip-test +--- + +**Betterer** ships several built-in tests to get you started. Check out the [implementations](https://github.com/phenomnomnominal/betterer/blob/master/packages/knip/src/knip.ts) for inspiration for your own tests! + +### [`@betterer/knip`](https://www.npmjs.com/package/@betterer/knip) + +Use this test to incrementally introduce [**Knip** checks](https://knip.dev/) to your codebase. + +:::warning + +This test is currently in _beta_ since the underlying [Knip](https://knip.dev/) +implementation is based on private APIs. Will stabilise when it can be migrated to +use public APIs. + +::: + +```typescript +import { knip } from '@betterer/knip'; + +export default { + 'knip dependency checks': () => + knip('./knip.json', { entry: ['index.{js,ts}', 'src/index.{js,ts}'] }, '--strict').include('./src/*.ts') +}; +``` + +[`@betterer/knip`](https://www.npmjs.com/package/@betterer/knip) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docs/regexp-test.md b/website/docs/regexp-test.md index c561fe98a..39ed8920c 100644 --- a/website/docs/regexp-test.md +++ b/website/docs/regexp-test.md @@ -18,4 +18,4 @@ export default { }; ``` -[`@betterer/regexp`](https://www.npmjs.com/package/@betterer/regexp) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererfiletest.include), [`exclude`](./betterer.bettererfiletest.exclude), [`only`](betterer.bettererfiletest.only), and [`skip`](betterer.bettererfiletest.skip). +[`@betterer/regexp`](https://www.npmjs.com/package/@betterer/regexp) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docs/running-betterer.md b/website/docs/running-betterer.md index 6d097dbcc..b73cce627 100644 --- a/website/docs/running-betterer.md +++ b/website/docs/running-betterer.md @@ -312,12 +312,3 @@ Run `npm run betterer watch --ignore "**/*.js" --ignore "**/*.css"` to run **Bet :::info When running in [Watch mode](./running-betterer#watch-mode-run-your-tests-when-files-change), ignores can be updated on the fly by first pressing `i`, and then modifying the current ignore. ::: - -## Debug mode - -If something isn't working correctly, it can be useful for debugging purposes to get a debug log. You can pass the following options to any of the run commands: - -| Option | Description | Default | -| -------------------------- | ----------------------------------------------------------------------------- | ----------------- | -| `-d`, `--debug` | Enable debug mode. Also enables the `silent` option to hide reporters output. | `false` | -| `-l`, `--debug-log` [path] | Path to the debug log file. | `./.betterer.log` | diff --git a/website/docs/stylelint-test.md b/website/docs/stylelint-test.md index 8308b2860..61b5afed2 100644 --- a/website/docs/stylelint-test.md +++ b/website/docs/stylelint-test.md @@ -23,4 +23,4 @@ export default { }; ``` -[`@betterer/stylelint`](https://www.npmjs.com/package/@betterer/stylelint) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererfiletest.include), [`exclude`](./betterer.bettererfiletest.exclude), [`only`](betterer.bettererfiletest.only), and [`skip`](betterer.bettererfiletest.skip). +[`@betterer/stylelint`](https://www.npmjs.com/package/@betterer/stylelint) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docs/test-definition-file.md b/website/docs/test-definition-file.md index eca4c2cf7..e63fa1bf2 100644 --- a/website/docs/test-definition-file.md +++ b/website/docs/test-definition-file.md @@ -50,9 +50,9 @@ export default { ```javascript // .betterer.js -const { BettererTest } = require('@betterer/betterer'); +import { BettererTest } from '@betterer/betterer'; -module.exports = { +export default { 'my test': () => new BettererTest({ // ... test config @@ -104,15 +104,15 @@ export function myOtherTest() { ```javascript // .betterer.js -const { BettererTest } = require('@betterer/betterer'); +import { BettererTest } from '@betterer/betterer'; -module.exports.myTest = () => { +export const myTest = () => { return new BettererTest({ // ... test config }); }; -module.exports.myOtherTest = () => { +export const myOtherTest = () => { return new BettererTest({ // ... test config }); diff --git a/website/docs/tests.md b/website/docs/tests.md index e63a0bdc3..c1b4b94ff 100644 --- a/website/docs/tests.md +++ b/website/docs/tests.md @@ -59,10 +59,10 @@ function getBundleSize(): number { ```javascript // .betterer.js -const { BettererTest } = require('@betterer/betterer'); -const { bigger, smaller } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger, smaller } from '@betterer/constraints'; -module.exports = { +export default { 'should grow': () => new BettererTest({ test: () => getNumberOfTests(), @@ -134,10 +134,10 @@ function getBundleSize(): number { ```javascript // .betterer.js -const { BettererTest } = require('@betterer/betterer'); -const { bigger, smaller } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger, smaller } from '@betterer/constraints'; -module.exports = { +export default { 'should grow': () => new BettererTest({ test: () => getNumberOfTests(), @@ -211,10 +211,10 @@ function getBundleSize(): number { ```javascript // .betterer.js -const { BettererTest } = require('@betterer/betterer'); -const { bigger, smaller } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger, smaller } from '@betterer/constraints'; -module.exports = { +export default { 'should grow': () => new BettererTest({ test: () => getNumberOfTests(), @@ -290,10 +290,10 @@ function getBundleSize(): number { ```javascript // .betterer.js -const { BettererTest } = require('@betterer/betterer'); -const { bigger, smaller } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { bigger, smaller } from '@betterer/constraints'; -module.exports = { +export default { 'should grow': () => new BettererTest({ test: () => getNumberOfTests(), @@ -360,9 +360,9 @@ function countFiles(issue: string) { ```javascript // .betterer.js -const { BettererFileTest } = require('@betterer/betterer'); +import { BettererFileTest } from '@betterer/betterer'; -module.exports = { +export default { 'no more JavaScript': () => countFiles('no more JavaScript files!').include('**/*.js') }; @@ -436,10 +436,10 @@ function accessibilityConstraint(result: AccessibilityReport, expected: Accessib ```javascript // .betterer.js -const { BettererTest } = require('@betterer/betterer'); -const { BettererConstraintResult } = require('@betterer/constraints'); +import { BettererTest } from '@betterer/betterer'; +import { BettererConstraintResult } from '@betterer/constraints'; -module.exports = { +export default { 'should be accessible': () => new BettererTest({ test: accessibilityTest, diff --git a/website/docs/tsquery-test.md b/website/docs/tsquery-test.md index 860130cb1..8e7afc565 100644 --- a/website/docs/tsquery-test.md +++ b/website/docs/tsquery-test.md @@ -21,4 +21,4 @@ export default { }; ``` -[`@betterer/tsquery`](https://www.npmjs.com/package/@betterer/tsquery) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererfiletest.include), [`exclude`](./betterer.bettererfiletest.exclude), [`only`](betterer.bettererfiletest.only), and [`skip`](betterer.bettererfiletest.skip). +[`@betterer/tsquery`](https://www.npmjs.com/package/@betterer/tsquery) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docs/typescript-test.md b/website/docs/typescript-test.md index f0ef4a85e..a6bae3487 100644 --- a/website/docs/typescript-test.md +++ b/website/docs/typescript-test.md @@ -22,4 +22,4 @@ export default { }; ``` -[`@betterer/typescript`](https://www.npmjs.com/package/@betterer/typescript) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererfiletest.include), [`exclude`](./betterer.bettererfiletest.exclude), [`only`](betterer.bettererfiletest.only), and [`skip`](betterer.bettererfiletest.skip). +[`@betterer/typescript`](https://www.npmjs.com/package/@betterer/typescript) is a [BettererFileTest](./betterer.bettererfiletest), so you can use [`include`](./betterer.bettererresolvertest.include), [`exclude`](./betterer.bettererresolvertest.exclude), [`only`](betterer.bettererresolvertest.only), and [`skip`](betterer.bettererresolvertest.skip). diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js index 1110fb210..803edd48d 100644 --- a/website/docusaurus.config.js +++ b/website/docusaurus.config.js @@ -1,14 +1,14 @@ -const BASE_THEME = require('prism-react-renderer/themes/dracula'); +import { themes } from 'prism-react-renderer'; const THEME = { - ...BASE_THEME, + ...themes.dracula, plain: { - ...BASE_THEME.plain, + ...themes.dracula.plain, backgroundColor: '#000000' } }; -module.exports = { +export default { title: 'Betterer', tagline: 'Improve, incrementally', diff --git a/website/package-lock.json b/website/package-lock.json new file mode 100644 index 000000000..62a030c76 --- /dev/null +++ b/website/package-lock.json @@ -0,0 +1,15892 @@ +{ + "name": "website", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "website", + "version": "0.0.0", + "dependencies": { + "@algolia/client-search": "^5.2.4", + "@docusaurus/core": "^3.5.2", + "@docusaurus/plugin-client-redirects": "^3.5.2", + "@docusaurus/preset-classic": "^3.5.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-loadable": "^5.5.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "^3.0.0", + "@docusaurus/tsconfig": "^3.0.0", + "@docusaurus/types": "^3.0.0", + "@types/react": "^18.3.5" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.24.0.tgz", + "integrity": "sha512-t63W9BnoXVrGy9iYHBgObNXqYXM3tYXCjDSHeNwnsc324r4o5UiVKUiAB4THQ5z9U5hTj6qUvwg/Ez43ZD85ww==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.24.0.tgz", + "integrity": "sha512-emi+v+DmVLpMGhp0V9q9h5CdkURsNmFC+cOS6uK9ndeJm9J4TiqSvPYVu+THUP8P/S08rxf5x2P+p3CfID0Y4g==", + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.24.0.tgz", + "integrity": "sha512-gDrt2so19jW26jY3/MkFg5mEypFIPbPoXsQGQWAi6TrCPsNOSEYepBMPlucqWigsmEy/prp5ug2jy/N3PVG/8w==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", + "integrity": "sha512-adcvyJ3KjPZFDybxlqnf+5KgxJtBjwTPTeyG2aOyoJvx0Y8dUQAEOEVOJ/GBxX0WWNbmaSrhDURMhc+QeevDsA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-account/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.24.0.tgz", + "integrity": "sha512-y8jOZt1OjwWU4N2qr8G4AxXAzaa8DBvyHTWlHzX/7Me1LX8OayfgHexqrsL4vSBcoMmVw2XnVW9MhL+Y2ZDJXg==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.2.4.tgz", + "integrity": "sha512-xNkNJ9Vk1WjxEU/SzcA2vZWeYSiQFQOUS7Akffx8aeAIJIOcmwbpLr2D8JzBEC4QNmNb5KAZOJTrGl1ri9Mclg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.24.0.tgz", + "integrity": "sha512-l5FRFm/yngztweU0HdUzz1rC4yoWCFo3IF+dVIVTfEPg906eZg5BOd1k0K6rZx5JzyyoP4LdmOikfkfGsKVE9w==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-personalization/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.2.4.tgz", + "integrity": "sha512-xlBaro8nU5EvsNsLu8dSsd7jzHVvOVGCOTW4dM6gjRmQDYChzMsF69Tb1OfLaXk7YJ0jHk1rNeccBOsYBtQcIQ==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.2.4", + "@algolia/requester-browser-xhr": "5.2.4", + "@algolia/requester-node-http": "5.2.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", + "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==", + "license": "MIT" + }, + "node_modules/@algolia/logger-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", + "integrity": "sha512-LLUNjkahj9KtKYrQhFKCzMx0BY3RnNP4FEtO+sBybCjJ73E8jNdaKJ/Dd8A/VA4imVHP5tADZ8pn5B8Ga/wTMA==", + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.24.0.tgz", + "integrity": "sha512-X4C8IoHgHfiUROfoRCV+lzSy+LHMgkoEEU1BbKcsfnV0i0S20zyy0NLww9dwVHUWNfPPxdMU+/wKmLGYf96yTg==", + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", + "integrity": "sha512-P9kcgerfVBpfYHDfVZDvvdJv0lEoCvzNlOy2nykyt5bK8TyieYyiD0lguIJdRZZYGre03WIAFf14pgE+V+IBlw==", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.2.4.tgz", + "integrity": "sha512-ncssmlq86ZnoQ/RH/EEG2KgmBZQnprzx3dZZ+iJrvkbxIi8V9wBWyCgjsuPrKGitzhpnjxZLNlHJZtcps5jaXw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.2.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", + "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==", + "license": "MIT" + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.2.4.tgz", + "integrity": "sha512-EoLOebO81Dtwuz/hy4onmQAb9dK8fDqyPWMwX017SvGDi3w1h4i6W6//VTO0vKLfXMNpoAKWFi+LBBTLCVtiiw==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "5.2.4" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.24.0.tgz", + "integrity": "sha512-86nI7w6NzWxd1Zp9q3413dRshDqAzSbsQjhcDhPIatEFiZrL1/TjnHL8S7jVKFePlIMzDsZWXAXwXzcok9c5oA==", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/traverse": "^7.25.4", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz", + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz", + "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz", + "integrity": "sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.1.tgz", + "integrity": "sha512-SLV/giH/V4SmloZ6Dt40HjTGTAIkxn33TVIHxNGNvo8ezMhrxBkzisj4op1KZYPIOHFLqhv60OHvX+YRu4xbmQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz", + "integrity": "sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.2.tgz", + "integrity": "sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.25.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz", + "integrity": "sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz", + "integrity": "sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.4.tgz", + "integrity": "sha512-8hsyG+KUYGY0coX6KUCDancA0Vw225KJ2HJO0yCNr1vq5r+lJTleDaJf0K7iOhjw4SWhu03TMBzYTJ9krmzULQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.7.tgz", + "integrity": "sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz", + "integrity": "sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.25.6.tgz", + "integrity": "sha512-Gz0Nrobx8szge6kQQ5Z5MX9L3ObqNwCQY1PSwSNzreFL7aHGxv8Fp2j3ETV6/wWdbiV+mW6OSm8oQhg3Tcsniw==", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", + "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", + "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.1", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", + "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "p-map": "^4.0.0", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@mdx-js/react": "^3.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", + "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", + "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", + "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", + "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.5.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/module-type-aliases/node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", + "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.5.2.tgz", + "integrity": "sha512-GMU0ZNoVG1DEsZlBbwLPdh0iwibrVZiRfmdppvX17SnByCVP74mb/Nne7Ss7ALgxQLtM4IHbXi8ij90VVjAJ+Q==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", + "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "cheerio": "1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", + "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/module-type-aliases": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", + "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", + "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", + "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", + "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", + "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", + "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", + "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/plugin-content-blog": "3.5.2", + "@docusaurus/plugin-content-docs": "3.5.2", + "@docusaurus/plugin-content-pages": "3.5.2", + "@docusaurus/plugin-debug": "3.5.2", + "@docusaurus/plugin-google-analytics": "3.5.2", + "@docusaurus/plugin-google-gtag": "3.5.2", + "@docusaurus/plugin-google-tag-manager": "3.5.2", + "@docusaurus/plugin-sitemap": "3.5.2", + "@docusaurus/theme-classic": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/theme-search-algolia": "3.5.2", + "@docusaurus/types": "3.5.2" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", + "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.5.2", + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/module-type-aliases": "3.5.2", + "@docusaurus/plugin-content-blog": "3.5.2", + "@docusaurus/plugin-content-docs": "3.5.2", + "@docusaurus/plugin-content-pages": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/theme-translations": "3.5.2", + "@docusaurus/types": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.44", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", + "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.5.2", + "@docusaurus/module-type-aliases": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/plugin-content-docs": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", + "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.5.2", + "@docusaurus/logger": "3.5.2", + "@docusaurus/plugin-content-docs": "3.5.2", + "@docusaurus/theme-common": "3.5.2", + "@docusaurus/theme-translations": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-validation": "3.5.2", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", + "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/tsconfig": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/tsconfig/-/tsconfig-3.5.2.tgz", + "integrity": "sha512-rQ7toURCFnWAIn8ubcquDs0ewhPwviMzxh6WpRjBW7sJVCXb6yzwUaY3HMNa0VXCFw+qkIbFywrMTf+Pb4uHWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@docusaurus/types": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", + "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", + "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "@svgr/webpack": "^8.1.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", + "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", + "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.5.2", + "@docusaurus/utils": "3.5.2", + "@docusaurus/utils-common": "3.5.2", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", + "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.0.1.tgz", + "integrity": "sha512-9ZrPIU4MGf6et1m1ov3zKf+q9+deetI51zprKB1D/z3NOb+rUxxtEl3mCjW5wTGh6VhRdwPueh1oRzi6ezkA8A==", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "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", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz", + "integrity": "sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@slorber/remark-comment/-/remark-comment-1.0.0.tgz", + "integrity": "sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", + "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", + "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", + "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", + "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", + "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/@types/gtag.js/-/gtag.js-0.0.12.tgz", + "integrity": "sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", + "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", + "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz", + "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.2.tgz", + "integrity": "sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", + "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.4", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.4.tgz", + "integrity": "sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", + "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.5.tgz", + "integrity": "sha512-WeqMfGJLGuLCqHGYRGHxnKrXcTitc6L/nBUWfWPcTarG3t9PsquqUMuVeXZeca+mglY4Vo5GZjCi0A3Or2lnxA==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "resolved": "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.11.tgz", + "integrity": "sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.7.tgz", + "integrity": "sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", + "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", + "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz", + "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "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==", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz", + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.24.0.tgz", + "integrity": "sha512-bf0QV/9jVejssFBmz2HQLxUadxk574t4iwjCKp5E7NBzwKkrDEhKPISIIjAU/p6K5qDx3qoeh4+26zWN1jmw3g==", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-account": "4.24.0", + "@algolia/client-analytics": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-personalization": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/recommend": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.4.tgz", + "integrity": "sha512-fvBCywguW9f+939S6awvRMstqMF1XXcd2qs1r1aGqL/PJ1go/DqN06tWmDVmhCDqBJanm++imletrQWf0G2S1g==", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-common": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.24.0.tgz", + "integrity": "sha512-bc2ROsNL6w6rqpl5jj/UywlIYC21TwSSoFHKl01lYirGMW+9Eek6r02Tocg4gZ8HAw3iBvu6XQiM3BEbmEMoiA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/client-search": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.24.0.tgz", + "integrity": "sha512-uRW6EpNapmLAD0mW47OXqTP8eiIx5F6qN9/x/7HHO6owL3N1IXqydGwW5nhDFBrV+ldouro2W1VX3XlcUXEFCA==", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.24.0.tgz", + "integrity": "sha512-Z2NxZMb6+nVXSjF13YpjYTdvV3032YTBSGm2vnYvYPA6mMxzM3v5rsCiSspndn9rzIW4Qp1lPHBvuoKJV6jnAA==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/algoliasearch/node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.24.0.tgz", + "integrity": "sha512-JF18yTjNOVYvU/L3UosRcvbPMGT9B+/GQWNWnenIImglzNVGpyzChkXLnrSf6uxwVNO6ESGu6oN8MqcGQcjQJw==", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.2.tgz", + "integrity": "sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz", + "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz", + "integrity": "sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", + "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", + "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", + "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "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/clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.2.0.tgz", + "integrity": "sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.53.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz", + "integrity": "sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz", + "integrity": "sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz", + "integrity": "sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/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==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.38.1.tgz", + "integrity": "sha512-OP35aUorbU3Zvlx7pjsFdu1rGNnD4pgw/CWoYzRY3t2EzoVT7shKHY1dlAy3f41cGIO7ZDPQimhGFTlEYkG/Hw==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.38.1.tgz", + "integrity": "sha512-BY8Etc1FZqdw1glX0XNOq2FDwfrg/VGqoZOZCdaL+UmdaqDwQwYXkMJT4t6In+zfEfOJDcM9T0KdbBeJg8KKCQ==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", + "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-5.0.1.tgz", + "integrity": "sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-6.1.2.tgz", + "integrity": "sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz", + "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz", + "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-6.1.1.tgz", + "integrity": "sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==", + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", + "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/emojilib/-/emojilib-2.4.0.tgz", + "integrity": "sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.2.tgz", + "integrity": "sha512-S0gW2+XZkmsx00tU2uJ4L9hUT7IFabbml9pHh2WQqFmAbxit++YGZne0sKJbNwkj9Wvg9E4uqWl4nCIFQMmfag==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.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==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz", + "integrity": "sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz", + "integrity": "sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "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/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "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.4" + }, + "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==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "license": "MIT" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ==", + "license": "MIT", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fault/-/fault-2.0.1.tgz", + "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/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==", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", + "license": "Unlicense" + }, + "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==", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz", + "integrity": "sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", + "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-4.0.0.tgz", + "integrity": "sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.4.tgz", + "integrity": "sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.0.tgz", + "integrity": "sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", + "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", + "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==", + "license": "MIT" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.7.tgz", + "integrity": "sha512-uSjr59G5u6fbxUfKbb8GcqMGT3Xs9v5IbPkjb0S16GyOeBLAzSRK0CixBv5YrYvzO6TDLzIS6QCn78tkqWngPw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", + "integrity": "sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", + "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-7.2.0.tgz", + "integrity": "sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-3.0.0.tgz", + "integrity": "sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.0.tgz", + "integrity": "sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.1.tgz", + "integrity": "sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz", + "integrity": "sha512-541xKlUw6jr/6gGuk92F+mYM5zaFAc5ahphvkqvNe2bQ6gVBkd6bfrmVJ2t4KDAfikAYZyIqTnktX3i6/aQDrQ==", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "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/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.44", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.44.tgz", + "integrity": "sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "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.", + "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==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==", + "license": "MIT" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.2.tgz", + "integrity": "sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", + "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.0.0.tgz", + "integrity": "sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.1.tgz", + "integrity": "sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.1.tgz", + "integrity": "sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-frontmatter/-/mdast-util-frontmatter-2.0.1.tgz", + "integrity": "sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.0.0.tgz", + "integrity": "sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.0.0.tgz", + "integrity": "sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.1.tgz", + "integrity": "sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.1.tgz", + "integrity": "sha512-VGV2uxUzhEZmaP7NSFo2vtq7M2nUD+WfmYQD+d8i/1nHbzE+rMy9uzTvUybBbNiVbrhOZibg3gbyoARGqgDWyg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-frontmatter/-/micromark-extension-frontmatter-2.0.0.tgz", + "integrity": "sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.0.tgz", + "integrity": "sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.1.0.tgz", + "integrity": "sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.2.0.tgz", + "integrity": "sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.1.0.tgz", + "integrity": "sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.2.tgz", + "integrity": "sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.1.tgz", + "integrity": "sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.1.0.tgz", + "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.1.tgz", + "integrity": "sha512-+Vyi+GCCOHnrJ2VPS+6aPoXN2k2jgUzDRhTFLjjTBn23qyXJXkjUWQgTL+mXpF5/A8ixLdCc6kWsoeOjKGejKQ==", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", + "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.1.tgz", + "integrity": "sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "license": "MIT", + "engines": { + "node": ">= 0.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==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", + "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", + "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.44", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.44.tgz", + "integrity": "sha512-Aweb9unOEpQ3ezu4Q00DPvvM2ZTUitJdNKeP/+uQgr1IBIqu574IaZoURId7BKtWMREwzKa9OgzPzezWGPWFQw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", + "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz", + "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", + "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz", + "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz", + "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz", + "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-6.0.5.tgz", + "integrity": "sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", + "integrity": "sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", + "integrity": "sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz", + "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz", + "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", + "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz", + "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz", + "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz", + "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz", + "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz", + "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz", + "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz", + "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz", + "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", + "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", + "integrity": "sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz", + "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz", + "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-5.2.0.tgz", + "integrity": "sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz", + "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-6.0.2.tgz", + "integrity": "sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-2.4.0.tgz", + "integrity": "sha512-327BsVCD/unU4CNLZTWVHyUHKnsqcvj2qbPlQ8MiBE2eq2rgctjigPA1Gp9HLF83kZ20zNN6jgizHJeEsyFYOw==", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "license": "MIT" + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz", + "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/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==", + "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/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==", + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz", + "integrity": "sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/react-json-view-lite/-/react-json-view-lite-1.5.0.tgz", + "integrity": "sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "license": "MIT", + "dependencies": { + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz", + "integrity": "sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", + "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz", + "integrity": "sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==", + "license": "MIT" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/rehype-raw/-/rehype-raw-7.0.0.tgz", + "integrity": "sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remark-directive/-/remark-directive-3.0.0.tgz", + "integrity": "sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-4.0.1.tgz", + "integrity": "sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/remark-frontmatter/-/remark-frontmatter-5.0.0.tgz", + "integrity": "sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.0.tgz", + "integrity": "sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", + "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", + "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.1.2.tgz", + "integrity": "sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==", + "license": "BSD-3-Clause" + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", + "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.1.tgz", + "integrity": "sha512-HHFjYH/0AqXacETlIbe9EYc3UNlQYGNNTY0fZ/sWl6SweX+GDxq9NB5+RVoPLgEFuOtCz7M9dhYxqDnhbbF0eQ==", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz", + "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", + "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", + "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-7.1.2.tgz", + "integrity": "sha512-ARCqzHJ0p4gWt+j7NlU5eDlIO9+Rkr/JhPFZKKQ1l5GCus7rJH4UdrlVAh0xC/gDS/Qir2UMxqYNHtsKr2rpCw==", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz", + "integrity": "sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/skin-tone/-/skin-tone-2.0.0.tgz", + "integrity": "sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.2.0.tgz", + "integrity": "sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/srcset/-/srcset-4.0.0.tgz", + "integrity": "sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "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==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/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==", + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, + "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==", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz", + "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unicode-emoji-modifier-base/-/unicode-emoji-modifier-base-1.0.0.tgz", + "integrity": "sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/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==", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.11.0.tgz", + "integrity": "sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz", + "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/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==", + "license": "MIT" + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", + "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-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==", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/website/package.json b/website/package.json index 24db6a6c7..6b8593d32 100644 --- a/website/package.json +++ b/website/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "docusaurus": "docusaurus", - "start": "docusaurus start", + "start": "docusaurus clear && docusaurus start", "build": "docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", @@ -12,19 +12,21 @@ "clear": "docusaurus clear" }, "dependencies": { - "@algolia/client-search": "^4.13.0", - "@docusaurus/core": "^2.4.0", - "@docusaurus/plugin-client-redirects": "^2.4.0", - "@docusaurus/preset-classic": "^2.4.0", - "@mdx-js/react": "^1.6.21", - "clsx": "^1.2.1", - "react": "^17.0.2", - "react-dom": "^17.0.2", + "@algolia/client-search": "^5.2.4", + "@docusaurus/core": "^3.5.2", + "@docusaurus/plugin-client-redirects": "^3.5.2", + "@docusaurus/preset-classic": "^3.5.2", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.1.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", "react-loadable": "^5.5.0" }, "devDependencies": { - "@types/react": "^17.0.2", - "typescript": "^4.4.2" + "@docusaurus/tsconfig": "^3.0.0", + "@docusaurus/module-type-aliases": "^3.0.0", + "@docusaurus/types": "^3.0.0", + "@types/react": "^18.3.5" }, "browserslist": { "production": [ diff --git a/website/sidebars.js b/website/sidebars.js index 2e21fc72f..54e6597ba 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -15,6 +15,7 @@ module.exports = { 'angular-test', 'coverage-test', 'eslint-test', + 'knip-test', 'regexp-test', 'stylelint-test', 'tsquery-test', diff --git a/website/src/css/custom.css b/website/src/css/custom.css index d10fc8676..3078ad858 100644 --- a/website/src/css/custom.css +++ b/website/src/css/custom.css @@ -88,3 +88,10 @@ html[data-theme='dark'] .DocSearch { code { vertical-align: initial; } + +main[class*='docMainContainer'] div[class*='docItemCol'] { + background: rgba(255, 255, 255, 0.1); + margin: 1rem; + padding: 1.5rem; + border-radius: 10px; +} diff --git a/website/yarn.lock b/website/yarn.lock deleted file mode 100644 index c318c688a..000000000 --- a/website/yarn.lock +++ /dev/null @@ -1,7657 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@algolia/autocomplete-core@1.8.2": - version "1.8.2" - resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.8.2.tgz#8d758c8652742e2761450d2b615a841fca24e10e" - integrity sha512-mTeshsyFhAqw/ebqNsQpMtbnjr+qVOSKXArEj4K0d7sqc8It1XD0gkASwecm9mF/jlOQ4Z9RNg1HbdA8JPdRwQ== - dependencies: - "@algolia/autocomplete-shared" "1.8.2" - -"@algolia/autocomplete-preset-algolia@1.8.2": - version "1.8.2" - resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.8.2.tgz#706e87f94c5f198c0e90502b97af09adeeddcc79" - integrity sha512-J0oTx4me6ZM9kIKPuL3lyU3aB8DEvpVvR6xWmHVROx5rOYJGQcZsdG4ozxwcOyiiu3qxMkIbzntnV1S1VWD8yA== - dependencies: - "@algolia/autocomplete-shared" "1.8.2" - -"@algolia/autocomplete-shared@1.8.2": - version "1.8.2" - resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.8.2.tgz#e6972df5c6935a241f16e4909aa82902338e029d" - integrity sha512-b6Z/X4MczChMcfhk6kfRmBzPgjoPzuS9KGR4AFsiLulLNRAAqhP+xZTKtMnZGhLuc61I20d5WqlId02AZvcO6g== - -"@algolia/cache-browser-local-storage@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.17.0.tgz#4c54a9b1795dcc1cd9f9533144f7df3057984d39" - integrity sha512-myRSRZDIMYB8uCkO+lb40YKiYHi0fjpWRtJpR/dgkaiBlSD0plRyB6lLOh1XIfmMcSeBOqDE7y9m8xZMrXYfyQ== - dependencies: - "@algolia/cache-common" "4.17.0" - -"@algolia/cache-common@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.17.0.tgz#bc3da15548df585b44d76c55e66b0056a2b3f917" - integrity sha512-g8mXzkrcUBIPZaulAuqE7xyHhLAYAcF2xSch7d9dABheybaU3U91LjBX6eJTEB7XVhEsgK4Smi27vWtAJRhIKQ== - -"@algolia/cache-in-memory@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.17.0.tgz#eb55a92cb8eb8641903a2b23fd6d05ebdaca2010" - integrity sha512-PT32ciC/xI8z919d0oknWVu3kMfTlhQn3MKxDln3pkn+yA7F7xrxSALysxquv+MhFfNAcrtQ/oVvQVBAQSHtdw== - dependencies: - "@algolia/cache-common" "4.17.0" - -"@algolia/client-account@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.17.0.tgz#4b13e5a8e50a06be1f3289d9db337096ebc66b73" - integrity sha512-sSEHx9GA6m7wrlsSMNBGfyzlIfDT2fkz2u7jqfCCd6JEEwmxt8emGmxAU/0qBfbhRSuGvzojoLJlr83BSZAKjA== - dependencies: - "@algolia/client-common" "4.17.0" - "@algolia/client-search" "4.17.0" - "@algolia/transporter" "4.17.0" - -"@algolia/client-analytics@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.17.0.tgz#1b36ffbe913b7b4d8900bc15982ca431f47a473c" - integrity sha512-84ooP8QA3mQ958hQ9wozk7hFUbAO+81CX1CjAuerxBqjKIInh1fOhXKTaku05O/GHBvcfExpPLIQuSuLYziBXQ== - dependencies: - "@algolia/client-common" "4.17.0" - "@algolia/client-search" "4.17.0" - "@algolia/requester-common" "4.17.0" - "@algolia/transporter" "4.17.0" - -"@algolia/client-common@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.17.0.tgz#67fd898006e3ac359ea3e3ed61abfc26147ffa53" - integrity sha512-jHMks0ZFicf8nRDn6ma8DNNsdwGgP/NKiAAL9z6rS7CymJ7L0+QqTJl3rYxRW7TmBhsUH40wqzmrG6aMIN/DrQ== - dependencies: - "@algolia/requester-common" "4.17.0" - "@algolia/transporter" "4.17.0" - -"@algolia/client-personalization@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.17.0.tgz#428d9f4762c22856b6062bb54351eb31834db6c1" - integrity sha512-RMzN4dZLIta1YuwT7QC9o+OeGz2cU6eTOlGNE/6RcUBLOU3l9tkCOdln5dPE2jp8GZXPl2yk54b2nSs1+pAjqw== - dependencies: - "@algolia/client-common" "4.17.0" - "@algolia/requester-common" "4.17.0" - "@algolia/transporter" "4.17.0" - -"@algolia/client-search@4.17.0", "@algolia/client-search@^4.13.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.17.0.tgz#0053c682f5f588e006c20791c27e8bcb0aa5b53c" - integrity sha512-x4P2wKrrRIXszT8gb7eWsMHNNHAJs0wE7/uqbufm4tZenAp+hwU/hq5KVsY50v+PfwM0LcDwwn/1DroujsTFoA== - dependencies: - "@algolia/client-common" "4.17.0" - "@algolia/requester-common" "4.17.0" - "@algolia/transporter" "4.17.0" - -"@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz#fd39e7477e7bc703d7f893b556f676c032af3950" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== - -"@algolia/logger-common@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.17.0.tgz#0fcea39c9485554edb4cdbfd965c5748b0b837ac" - integrity sha512-DGuoZqpTmIKJFDeyAJ7M8E/LOenIjWiOsg1XJ1OqAU/eofp49JfqXxbfgctlVZVmDABIyOz8LqEoJ6ZP4DTyvw== - -"@algolia/logger-console@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.17.0.tgz#8ac56ef4259c4fa3eb9eb6586c7b4b4ed942e8da" - integrity sha512-zMPvugQV/gbXUvWBCzihw6m7oxIKp48w37QBIUu/XqQQfxhjoOE9xyfJr1KldUt5FrYOKZJVsJaEjTsu+bIgQg== - dependencies: - "@algolia/logger-common" "4.17.0" - -"@algolia/requester-browser-xhr@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.17.0.tgz#f52fdeeac2f3c531f00838920af33a73066a159b" - integrity sha512-aSOX/smauyTkP21Pf52pJ1O2LmNFJ5iHRIzEeTh0mwBeADO4GdG94cAWDILFA9rNblq/nK3EDh3+UyHHjplZ1A== - dependencies: - "@algolia/requester-common" "4.17.0" - -"@algolia/requester-common@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.17.0.tgz#746020d2cbc829213e7cede8eef2182c7a71e32b" - integrity sha512-XJjmWFEUlHu0ijvcHBoixuXfEoiRUdyzQM6YwTuB8usJNIgShua8ouFlRWF8iCeag0vZZiUm4S2WCVBPkdxFgg== - -"@algolia/requester-node-http@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.17.0.tgz#262276d94c25a4ec2128b1bdfb9471529528d8b9" - integrity sha512-bpb/wDA1aC6WxxM8v7TsFspB7yBN3nqCGs2H1OADolQR/hiAIjAxusbuMxVbRFOdaUvAIqioIIkWvZdpYNIn8w== - dependencies: - "@algolia/requester-common" "4.17.0" - -"@algolia/transporter@4.17.0": - version "4.17.0" - resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.17.0.tgz#6aabdbc20c475d72d83c8e6519f1191f1a51fb37" - integrity sha512-6xL6H6fe+Fi0AEP3ziSgC+G04RK37iRb4uUUqVAH9WPYFI8g+LYFq6iv5HS8Cbuc5TTut+Bwj6G+dh/asdb9uA== - dependencies: - "@algolia/cache-common" "4.17.0" - "@algolia/logger-common" "4.17.0" - "@algolia/requester-common" "4.17.0" - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4", "@babel/code-frame@^7.8.3": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" - integrity sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.5", "@babel/compat-data@^7.21.5": - version "7.21.7" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz#61caffb60776e49a57ba61a88f02bedd8714f6bc" - integrity sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA== - -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz#fd450c4ec10cdbb980e2928b7aa7a28484593fc8" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz#2a8c7f0f53d60100ba4c32470ba0281c92aa9aa4" - integrity sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helpers" "^7.21.5" - "@babel/parser" "^7.21.8" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.0" - -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz#c0c0e5449504c7b7de8236d99338c3e2a340745f" - integrity sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w== - dependencies: - "@babel/types" "^7.21.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz#817f73b6c59726ab39f6ba18c234268a519e5abb" - integrity sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz#631e6cc784c7b660417421349aac304c94115366" - integrity sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w== - dependencies: - "@babel/compat-data" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - browserslist "^4.21.3" - lru-cache "^5.1.1" - semver "^6.3.0" - -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz#205b26330258625ef8869672ebca1e0dee5a0f02" - integrity sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-member-expression-to-functions" "^7.21.5" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.21.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/helper-split-export-declaration" "^7.18.6" - semver "^6.3.0" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz#a7886f61c2e29e21fd4aaeaf1e473deba6b571dc" - integrity sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.3.1" - semver "^6.3.0" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== - dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - semver "^6.1.2" - -"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz#c769afefd41d171836f7cb63e295bedf689d48ba" - integrity sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ== - -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0", "@babel/helper-function-name@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz#d552829b10ea9f120969304023cd0645fa00b1b4" - integrity sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg== - dependencies: - "@babel/template" "^7.20.7" - "@babel/types" "^7.21.0" - -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-member-expression-to-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz#3b1a009af932e586af77c1030fba9ee0bde396c0" - integrity sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-module-imports@^7.18.6", "@babel/helper-module-imports@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" - integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== - dependencies: - "@babel/types" "^7.21.4" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz#d937c82e9af68d31ab49039136a222b17ac0b420" - integrity sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw== - dependencies: - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-simple-access" "^7.21.5" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.21.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz#345f2377d05a720a4e5ecfa39cbf4474a4daed56" - integrity sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg== - -"@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.20.7", "@babel/helper-replace-supers@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz#a6ad005ba1c7d9bc2973dfde05a1bba7065dde3c" - integrity sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg== - dependencies: - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-member-expression-to-functions" "^7.21.5" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - -"@babel/helper-simple-access@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz#d697a7971a5c39eac32c7e63c0921c06c8a249ee" - integrity sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg== - dependencies: - "@babel/types" "^7.21.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" - integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6", "@babel/helper-validator-option@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz#8224c7e13ace4bafdc4004da2cf064ef42673180" - integrity sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz#5bac66e084d7a4d2d9696bdf0175a93f7fb63c08" - integrity sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA== - dependencies: - "@babel/template" "^7.20.7" - "@babel/traverse" "^7.21.5" - "@babel/types" "^7.21.5" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.20.7", "@babel/parser@^7.21.5", "@babel/parser@^7.21.8": - version "7.21.8" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz#642af7d0333eab9c0ad70b14ac5e76dbde7bfdf8" - integrity sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA== - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz#d9c85589258539a22a901033853101a6198d4ef1" - integrity sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-proposal-optional-chaining" "^7.20.7" - -"@babel/plugin-proposal-async-generator-functions@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326" - integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-proposal-class-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" - integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-class-static-block@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz#77bdd66fb7b605f3a61302d224bdfacf5547977d" - integrity sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz#dfbcaa8f7b4d37b51e8bfb46d94a5aea2bb89d83" - integrity sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" - integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-object-rest-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" - integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== - dependencies: - "@babel/compat-data" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.7" - -"@babel/plugin-proposal-optional-catch-binding@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" - integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-proposal-optional-chaining@^7.20.7", "@babel/plugin-proposal-optional-chaining@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" - integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz#19496bd9883dd83c23c7d7fc45dcd9ad02dfa1dc" - integrity sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== - dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz#9d9d357cc818aa7ae7935917c1257f67677a0926" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.21.4": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz#f264ed7bf40ffc9ec239edabc17a50c4f5b6fea2" - integrity sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz#2751948e9b7c6d771a8efa59340c15d4a2891ff8" - integrity sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-arrow-functions@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz#9bb42a53de447936a57ba256fbf537fc312b6929" - integrity sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-async-to-generator@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz#dfee18623c8cb31deb796aa3ca84dda9cea94354" - integrity sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-remap-async-to-generator" "^7.18.9" - -"@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-block-scoping@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz#e737b91037e5186ee16b76e7ae093358a5634f02" - integrity sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-classes@^7.21.0": - version "7.21.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz#f469d0b07a4c5a7dbb21afad9e27e57b47031665" - integrity sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.7" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.20.7" - "@babel/helper-split-export-declaration" "^7.18.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz#3a2d8bb771cd2ef1cd736435f6552fe502e11b44" - integrity sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/template" "^7.20.7" - -"@babel/plugin-transform-destructuring@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz#73b46d0fd11cd6ef57dea8a381b1215f4959d401" - integrity sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-for-of@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz#e890032b535f5a2e237a18535f56a9fdaa7b83fc" - integrity sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== - dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-modules-amd@^7.20.11": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz#3daccca8e4cc309f03c3a0c4b41dc4b26f55214a" - integrity sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g== - dependencies: - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-modules-commonjs@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz#d69fb947eed51af91de82e4708f676864e5e47bc" - integrity sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ== - dependencies: - "@babel/helper-module-transforms" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-simple-access" "^7.21.5" - -"@babel/plugin-transform-modules-systemjs@^7.20.11": - version "7.20.11" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz#467ec6bba6b6a50634eea61c9c232654d8a4696e" - integrity sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw== - dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.20.11" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-identifier" "^7.19.1" - -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== - dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.20.5": - version "7.20.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" - -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz#18fc4e797cf6d6d972cb8c411dbe8a809fa157db" - integrity sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz#b32a5556100d424b25e388dd689050d78396884d" - integrity sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - -"@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" - -"@babel/plugin-transform-react-jsx@^7.18.6": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz#bd98f3b429688243e4fa131fe1cbb2ef31ce6f38" - integrity sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/types" "^7.21.5" - -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-regenerator@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz#576c62f9923f94bcb1c855adc53561fd7913724e" - integrity sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - regenerator-transform "^0.15.1" - -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-runtime@^7.18.6": - version "7.21.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz#2e1da21ca597a7d01fc96b699b21d8d2023191aa" - integrity sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA== - dependencies: - "@babel/helper-module-imports" "^7.21.4" - "@babel/helper-plugin-utils" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" - -"@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-spread@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz#c2d83e0b99d3bf83e07b11995ee24bf7ca09401e" - integrity sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw== - dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" - -"@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - -"@babel/plugin-transform-typescript@^7.21.3": - version "7.21.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz#316c5be579856ea890a57ebc5116c5d064658f2b" - integrity sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.21.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" - -"@babel/plugin-transform-unicode-escapes@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz#1e55ed6195259b0e9061d81f5ef45a9b009fb7f2" - integrity sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - -"@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz#db2089d99efd2297716f018aeead815ac3decffb" - integrity sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg== - dependencies: - "@babel/compat-data" "^7.21.5" - "@babel/helper-compilation-targets" "^7.21.5" - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.20.7" - "@babel/plugin-proposal-async-generator-functions" "^7.20.7" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.21.0" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.20.7" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.7" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.21.0" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.21.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.21.5" - "@babel/plugin-transform-async-to-generator" "^7.20.7" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.21.0" - "@babel/plugin-transform-classes" "^7.21.0" - "@babel/plugin-transform-computed-properties" "^7.21.5" - "@babel/plugin-transform-destructuring" "^7.21.3" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.21.5" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.20.11" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-modules-systemjs" "^7.20.11" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.20.5" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.21.3" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.21.5" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.20.7" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.21.5" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.21.5" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/types" "^7.4.4" - esutils "^2.0.2" - -"@babel/preset-react@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" - -"@babel/preset-typescript@^7.18.6": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz#68292c884b0e26070b4d66b202072d391358395f" - integrity sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA== - dependencies: - "@babel/helper-plugin-utils" "^7.21.5" - "@babel/helper-validator-option" "^7.21.0" - "@babel/plugin-syntax-jsx" "^7.21.4" - "@babel/plugin-transform-modules-commonjs" "^7.21.5" - "@babel/plugin-transform-typescript" "^7.21.3" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime-corejs3@^7.18.6": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.21.5.tgz#a6d4e132ab1cb2fae2354f02284ebb6e07b4f7d8" - integrity sha512-FRqFlFKNazWYykft5zvzuEl1YyTDGsIRrjV9rvxvYkUC7W/ueBng1X68Xd6uRMzAaJ0xMKn08/wem5YS1lpX8w== - dependencies: - core-js-pure "^3.25.1" - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.8.4": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" - integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.12.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7": - version "7.20.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" - integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.20.7" - "@babel/types" "^7.20.7" - -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.20.5", "@babel/traverse@^7.21.5": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz#ad22361d352a5154b498299d523cf72998a4b133" - integrity sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw== - dependencies: - "@babel/code-frame" "^7.21.4" - "@babel/generator" "^7.21.5" - "@babel/helper-environment-visitor" "^7.21.5" - "@babel/helper-function-name" "^7.21.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.21.5" - "@babel/types" "^7.21.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/types@^7.12.7", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.20.0", "@babel/types@^7.20.5", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.4", "@babel/types@^7.21.5", "@babel/types@^7.4.4": - version "7.21.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" - integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== - dependencies: - "@babel/helper-string-parser" "^7.21.5" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@docsearch/css@3.3.4": - version "3.3.4" - resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.3.4.tgz#533719eac0aa3934318074e7e981e633727ad2fd" - integrity sha512-vDwCDoVXDgopw/hvr0zEADew2wWaGP8Qq0Bxhgii1Ewz2t4fQeyJwIRN/mWADeLFYPVkpz8TpEbxya/i6Tm0WA== - -"@docsearch/react@^3.1.1": - version "3.3.4" - resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.3.4.tgz#d49cf9e5d939145c9fe688113c5bdf41975d8ae7" - integrity sha512-aeOf1WC5zMzBEi2SI6WWznOmIo9rnpN4p7a3zHXxowVciqlI4HsZGtOR9nFOufLeolv7HibwLlaM0oyUqJxasw== - dependencies: - "@algolia/autocomplete-core" "1.8.2" - "@algolia/autocomplete-preset-algolia" "1.8.2" - "@docsearch/css" "3.3.4" - algoliasearch "^4.0.0" - -"@docusaurus/core@2.4.0", "@docusaurus/core@^2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.0.tgz#a12c175cb2e5a7e4582e65876a50813f6168913d" - integrity sha512-J55/WEoIpRcLf3afO5POHPguVZosKmJEQWKBL+K7TAnfuE7i+Y0NPLlkKtnWCehagGsgTqClfQEexH/UT4kELA== - dependencies: - "@babel/core" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.6" - "@babel/preset-env" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@babel/runtime" "^7.18.6" - "@babel/runtime-corejs3" "^7.18.6" - "@babel/traverse" "^7.18.8" - "@docusaurus/cssnano-preset" "2.4.0" - "@docusaurus/logger" "2.4.0" - "@docusaurus/mdx-loader" "2.4.0" - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-common" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" - babel-plugin-dynamic-import-node "^2.3.3" - boxen "^6.2.1" - chalk "^4.1.2" - chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" - combine-promises "^1.1.0" - commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" - del "^6.1.1" - detect-port "^1.3.0" - escape-html "^1.0.3" - eta "^2.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" - leven "^3.1.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" - prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" - react-router-config "^5.1.1" - react-router-dom "^5.3.3" - rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" - url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" - webpackbar "^5.0.2" - -"@docusaurus/cssnano-preset@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.0.tgz#9213586358e0cce517f614af041eb7d184f8add6" - integrity sha512-RmdiA3IpsLgZGXRzqnmTbGv43W4OD44PCo+6Q/aYjEM2V57vKCVqNzuafE94jv0z/PjHoXUrjr69SaRymBKYYw== - dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" - -"@docusaurus/logger@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.0.tgz#393d91ad9ecdb9a8f80167dd6a34d4b45219b835" - integrity sha512-T8+qR4APN+MjcC9yL2Es+xPJ2923S9hpzDmMtdsOcUGLqpCGBbU1vp3AAqDwXtVgFkq+NsEk7sHdVsfLWR/AXw== - dependencies: - chalk "^4.1.2" - tslib "^2.4.0" - -"@docusaurus/mdx-loader@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.0.tgz#c6310342904af2f203e7df86a9df623f86840f2d" - integrity sha512-GWoH4izZKOmFoC+gbI2/y8deH/xKLvzz/T5BsEexBye8EHQlwsA7FMrVa48N063bJBH4FUOiRRXxk5rq9cC36g== - dependencies: - "@babel/parser" "^7.18.8" - "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@mdx-js/mdx" "^1.6.22" - escape-html "^1.0.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" - stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@docusaurus/module-type-aliases@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.0.tgz#6961605d20cd46f86163ed8c2d83d438b02b4028" - integrity sha512-YEQO2D3UXs72qCn8Cr+RlycSQXVGN9iEUyuHwTuK4/uL/HFomB2FHSU0vSDM23oLd+X/KibQ3Ez6nGjQLqXcHg== - dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.4.0" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - -"@docusaurus/plugin-client-redirects@^2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-2.4.0.tgz#53117d112ac9cc191deda053af4335e0381b4125" - integrity sha512-HsS+Dc2ZLWhfpjYJ5LIrOB/XfXZcElcC7o1iA4yIVtiFz+LHhwP863fhqbwSJ1c6tNDOYBH3HwbskHrc/PIn7Q== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/logger" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-common" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - eta "^2.0.0" - fs-extra "^10.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - -"@docusaurus/plugin-content-blog@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.0.tgz#50dbfbc7b51f152ae660385fd8b34076713374c3" - integrity sha512-YwkAkVUxtxoBAIj/MCb4ohN0SCtHBs4AS75jMhPpf67qf3j+U/4n33cELq7567hwyZ6fMz2GPJcVmctzlGGThQ== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/logger" "2.4.0" - "@docusaurus/mdx-loader" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-common" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - cheerio "^1.0.0-rc.12" - feed "^4.2.2" - fs-extra "^10.1.0" - lodash "^4.17.21" - reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-docs@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.0.tgz#36e235adf902325735b873b4f535205884363728" - integrity sha512-ic/Z/ZN5Rk/RQo+Io6rUGpToOtNbtPloMR2JcGwC1xT2riMu6zzfSwmBi9tHJgdXH6CB5jG+0dOZZO8QS5tmDg== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/logger" "2.4.0" - "@docusaurus/mdx-loader" "2.4.0" - "@docusaurus/module-type-aliases" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - "@types/react-router-config" "^5.0.6" - combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-pages@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.0.tgz#6169909a486e1eae0ddffff0b1717ce4332db4d4" - integrity sha512-Pk2pOeOxk8MeU3mrTU0XLIgP9NZixbdcJmJ7RUFrZp1Aj42nd0RhIT14BGvXXyqb8yTQlk4DmYGAzqOfBsFyGw== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/mdx-loader" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" - -"@docusaurus/plugin-debug@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.0.tgz#1ad513fe9bcaf017deccf62df8b8843faeeb7d37" - integrity sha512-KC56DdYjYT7Txyux71vXHXGYZuP6yYtqwClvYpjKreWIHWus5Zt6VNi23rMZv3/QKhOCrN64zplUbdfQMvddBQ== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils" "2.4.0" - fs-extra "^10.1.0" - react-json-view "^1.21.3" - tslib "^2.4.0" - -"@docusaurus/plugin-google-analytics@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.0.tgz#8062d7a09d366329dfd3ce4e8a619da8624b6cc3" - integrity sha512-uGUzX67DOAIglygdNrmMOvEp8qG03X20jMWadeqVQktS6nADvozpSLGx4J0xbkblhJkUzN21WiilsP9iVP+zkw== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - tslib "^2.4.0" - -"@docusaurus/plugin-google-gtag@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.0.tgz#a8efda476f971410dfb3aab1cfe1f0f7d269adc5" - integrity sha512-adj/70DANaQs2+TF/nRdMezDXFAV/O/pjAbUgmKBlyOTq5qoMe0Tk4muvQIwWUmiUQxFJe+sKlZGM771ownyOg== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - tslib "^2.4.0" - -"@docusaurus/plugin-google-tag-manager@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.0.tgz#9a94324ac496835fc34e233cc60441df4e04dfdd" - integrity sha512-E66uGcYs4l7yitmp/8kMEVQftFPwV9iC62ORh47Veqzs6ExwnhzBkJmwDnwIysHBF1vlxnzET0Fl2LfL5fRR3A== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - tslib "^2.4.0" - -"@docusaurus/plugin-sitemap@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.0.tgz#ba0eb43565039fe011bdd874b5c5d7252b19d709" - integrity sha512-pZxh+ygfnI657sN8a/FkYVIAmVv0CGk71QMKqJBOfMmDHNN1FeDeFkBjWP49ejBqpqAhjufkv5UWq3UOu2soCw== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/logger" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-common" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - fs-extra "^10.1.0" - sitemap "^7.1.1" - tslib "^2.4.0" - -"@docusaurus/preset-classic@^2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.0.tgz#92fdcfab35d8d0ffb8c38bcbf439e4e1cb0566a3" - integrity sha512-/5z5o/9bc6+P5ool2y01PbJhoGddEGsC0ej1MF6mCoazk8A+kW4feoUd68l7Bnv01rCnG3xy7kHUQP97Y0grUA== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/plugin-content-blog" "2.4.0" - "@docusaurus/plugin-content-docs" "2.4.0" - "@docusaurus/plugin-content-pages" "2.4.0" - "@docusaurus/plugin-debug" "2.4.0" - "@docusaurus/plugin-google-analytics" "2.4.0" - "@docusaurus/plugin-google-gtag" "2.4.0" - "@docusaurus/plugin-google-tag-manager" "2.4.0" - "@docusaurus/plugin-sitemap" "2.4.0" - "@docusaurus/theme-classic" "2.4.0" - "@docusaurus/theme-common" "2.4.0" - "@docusaurus/theme-search-algolia" "2.4.0" - "@docusaurus/types" "2.4.0" - -"@docusaurus/react-loadable@5.5.2", "react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz#81aae0db81ecafbdaee3651f12804580868fa6ce" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -"@docusaurus/theme-classic@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.0.tgz#a5404967b00adec3472efca4c3b3f6a5e2021c78" - integrity sha512-GMDX5WU6Z0OC65eQFgl3iNNEbI9IMJz9f6KnOyuMxNUR6q0qVLsKCNopFUDfFNJ55UU50o7P7o21yVhkwpfJ9w== - dependencies: - "@docusaurus/core" "2.4.0" - "@docusaurus/mdx-loader" "2.4.0" - "@docusaurus/module-type-aliases" "2.4.0" - "@docusaurus/plugin-content-blog" "2.4.0" - "@docusaurus/plugin-content-docs" "2.4.0" - "@docusaurus/plugin-content-pages" "2.4.0" - "@docusaurus/theme-common" "2.4.0" - "@docusaurus/theme-translations" "2.4.0" - "@docusaurus/types" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-common" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - "@mdx-js/react" "^1.6.22" - clsx "^1.2.1" - copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.43" - lodash "^4.17.21" - nprogress "^0.2.0" - postcss "^8.4.14" - prism-react-renderer "^1.3.5" - prismjs "^1.28.0" - react-router-dom "^5.3.3" - rtlcss "^3.5.0" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-common@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.0.tgz#626096fe9552d240a2115b492c7e12099070cf2d" - integrity sha512-IkG/l5f/FLY6cBIxtPmFnxpuPzc5TupuqlOx+XDN+035MdQcAh8wHXXZJAkTeYDeZ3anIUSUIvWa7/nRKoQEfg== - dependencies: - "@docusaurus/mdx-loader" "2.4.0" - "@docusaurus/module-type-aliases" "2.4.0" - "@docusaurus/plugin-content-blog" "2.4.0" - "@docusaurus/plugin-content-docs" "2.4.0" - "@docusaurus/plugin-content-pages" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-common" "2.4.0" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - clsx "^1.2.1" - parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" - use-sync-external-store "^1.2.0" - utility-types "^3.10.0" - -"@docusaurus/theme-search-algolia@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.0.tgz#07d297d50c44446d6bc5a37be39afb8f014084e1" - integrity sha512-pPCJSCL1Qt4pu/Z0uxBAuke0yEBbxh0s4fOvimna7TEcBLPq0x06/K78AaABXrTVQM6S0vdocFl9EoNgU17hqA== - dependencies: - "@docsearch/react" "^3.1.1" - "@docusaurus/core" "2.4.0" - "@docusaurus/logger" "2.4.0" - "@docusaurus/plugin-content-docs" "2.4.0" - "@docusaurus/theme-common" "2.4.0" - "@docusaurus/theme-translations" "2.4.0" - "@docusaurus/utils" "2.4.0" - "@docusaurus/utils-validation" "2.4.0" - algoliasearch "^4.13.1" - algoliasearch-helper "^3.10.0" - clsx "^1.2.1" - eta "^2.0.0" - fs-extra "^10.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-translations@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.0.tgz#62dacb7997322f4c5a828b3ab66177ec6769eb33" - integrity sha512-kEoITnPXzDPUMBHk3+fzEzbopxLD3fR5sDoayNH0vXkpUukA88/aDL1bqkhxWZHA3LOfJ3f0vJbOwmnXW5v85Q== - dependencies: - fs-extra "^10.1.0" - tslib "^2.4.0" - -"@docusaurus/types@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.0.tgz#f94f89a0253778b617c5d40ac6f16b17ec55ce41" - integrity sha512-xaBXr+KIPDkIaef06c+i2HeTqVNixB7yFut5fBXPGI2f1rrmEV2vLMznNGsFwvZ5XmA3Quuefd4OGRkdo97Dhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - commander "^5.1.0" - joi "^17.6.0" - react-helmet-async "^1.3.0" - utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" - -"@docusaurus/utils-common@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.0.tgz#eb2913871860ed32e73858b4c7787dd820c5558d" - integrity sha512-zIMf10xuKxddYfLg5cS19x44zud/E9I7lj3+0bv8UIs0aahpErfNrGhijEfJpAfikhQ8tL3m35nH3hJ3sOG82A== - dependencies: - tslib "^2.4.0" - -"@docusaurus/utils-validation@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.0.tgz#1ed92bfab5da321c4a4d99cad28a15627091aa90" - integrity sha512-IrBsBbbAp6y7mZdJx4S4pIA7dUyWSA0GNosPk6ZJ0fX3uYIEQgcQSGIgTeSC+8xPEx3c16o03en1jSDpgQgz/w== - dependencies: - "@docusaurus/logger" "2.4.0" - "@docusaurus/utils" "2.4.0" - joi "^17.6.0" - js-yaml "^4.1.0" - tslib "^2.4.0" - -"@docusaurus/utils@2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.0.tgz#fdf0c3545819e48bb57eafc5057495fd4d50e900" - integrity sha512-89hLYkvtRX92j+C+ERYTuSUK6nF9bGM32QThcHPg2EDDHVw6FzYQXmX6/p+pU5SDyyx5nBlE4qXR92RxCAOqfg== - dependencies: - "@docusaurus/logger" "2.4.0" - "@svgr/webpack" "^6.2.1" - escape-string-regexp "^4.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" - globby "^11.1.0" - gray-matter "^4.0.3" - js-yaml "^4.1.0" - lodash "^4.17.21" - micromatch "^4.0.5" - resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.4.0" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz#dc448e332c6c6e37a4dc02fd84ba8d44b9afb012" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/types@^29.5.0": - version "29.5.0" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz#f59ef9b031ced83047c67032700d8c807d6e1593" - integrity sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog== - dependencies: - "@jest/schemas" "^29.4.3" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz#8108265659d4c33e72ffe14e33d6cc5eb59f2fda" - integrity sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz#8a723157bf90e78f17dc0f27995398e6c731f1ba" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== - dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/react@^1.6.21", "@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz#ae09b4744fddc74714ee9f9d6f17a66e77c43573" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz#219dfd89ae5b97a8801f015323ffa4b62f45718b" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz#fc1678bddefab014e2145cbe25b3ce4e1cfc36f3" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== - dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" - -"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz#74a5d648bd0347bda99d82409d87b8ca80b9a1ba" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== - -"@svgr/babel-plugin-remove-jsx-attribute@*": - version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz#69177f7937233caca3a1afb051906698f2f59186" - integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz#c2c48104cfd7dcd557f373b70a56e9e3bdae1d44" - integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz#fb9d22ea26d2bc5e0a44b763d4c46d5d3f596c60" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== - -"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz#01b2024a2b53ffaa5efceaa0bf3e1d5a4c520ce4" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== - -"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz#dd3fa9f5b24eb4f93bcf121c3d40ff5facecb217" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== - -"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz#1d8e945a03df65b601551097d8f5e34351d3d305" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== - -"@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz#48620b9e590e25ff95a80f811544218d27f8a250" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== - -"@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz#b90de7979c8843c5c580c7e2ec71f024b49eb828" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute" "*" - "@svgr/babel-plugin-remove-jsx-empty-expression" "*" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" - "@svgr/babel-plugin-transform-svg-component" "^6.5.1" - -"@svgr/core@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz#d3e8aa9dbe3fbd747f9ee4282c1c77a27410488a" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - camelcase "^6.2.0" - cosmiconfig "^7.0.1" - -"@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz#81800bd09b5bcdb968bf6ee7c863d2288fdb80d2" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== - dependencies: - "@babel/types" "^7.20.0" - entities "^4.4.0" - -"@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz#0e30d1878e771ca753c94e69581c7971542a7072" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/hast-util-to-babel-ast" "^6.5.1" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz#0f91910e988fc0b842f88e0960c2862e022abe84" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== - dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" - -"@svgr/webpack@^6.2.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz#ecf027814fc1cb2decc29dc92f39c3cf691e40e8" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== - dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-constant-elements" "^7.18.12" - "@babel/preset-env" "^7.19.4" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@svgr/core" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - "@svgr/plugin-svgo" "^6.5.1" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.0" - resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#9fd20b3974bdc2bcd4ac6567e2e0f6885cb2cf41" - integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.37.0" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz#29cebc6c2a3ac7fea7113207bf5a828fdf4d7ef1" - integrity sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.34" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.34.tgz#c119e85b75215178bc127de588e93100698ab4cc" - integrity sha512-fvr49XlCGoUj2Pp730AItckfjat4WNb0lb3kfrLWffd+RLeoGAMsq7UOy04PAPtoL01uKwcp6u8nhzpgpDYr3w== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz#01d5437f6ef9cfa8668e616e13c2f2ac9a491ae4" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/hast@^2.0.0": - version "2.3.4" - resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz#8aa5ef92c117d20d974a82bdfb6a648b08c0bafc" - integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== - dependencies: - "@types/unist" "*" - -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz#56588b17ae8f50c53983a524fc3cc47437969d64" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#4fc33a00c1d0c16987b1a20cf92d20614c55ac35" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz#0ca21949a5588d55ac2b659b69035c84bd5da293" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/mdast@^3.0.0": - version "3.0.11" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.11.tgz#dc130f7e7d9306124286f6d6cee40cf4d14a3dc0" - integrity sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw== - dependencies: - "@types/unist" "*" - -"@types/mime@*": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" - integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== - -"@types/mime@^1": - version "1.3.2" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/node@*": - version "20.1.1" - resolved "https://registry.npmjs.org/@types/node/-/node-20.1.1.tgz#afc492e8dbe7f672dd3a13674823522b467a45ad" - integrity sha512-uKBEevTNb+l6/aCQaKVnUModfEMjAl98lw2Si9P5y4hLu9tm6AlX2ZIoXZX6Wh9lJueYPrGPKk5WMCNHg/u6/A== - -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz#e7b5aebbac150f8b5fdd4a46e7f0bd8e65e19109" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-router-config@*", "@types/react-router-config@^5.0.6": - version "5.0.7" - resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.7.tgz#36207a3fe08b271abee62b26993ee932d13cbb02" - integrity sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "^5.1.0" - -"@types/react-router-dom@*": - version "5.3.3" - resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz#e9d6b4a66fcdbd651a5f106c2656a30088cc1e83" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*", "@types/react-router@^5.1.0": - version "5.1.20" - resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz#88eccaa122a82405ef3efbcaaa5dcdd9f021387c" - integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - -"@types/react@*": - version "18.2.6" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz#5cd53ee0d30ffc193b159d3516c8c8ad2f19d571" - integrity sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/react@^17.0.2": - version "17.0.59" - resolved "https://registry.npmjs.org/@types/react/-/react-17.0.59.tgz#5aa4e161a356fcb824d81f166e01bad9e82243bb" - integrity sha512-gSON5zWYIGyoBcycCE75E9+r6dCC2dHdsrVkOEiIYNU5+Q28HcBAuqvDuxHcCbMfHBHdeT5Tva/AFn3rnMKE4g== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/sax@^1.2.1": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" - integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz#cef09e3ec9af1d63d2a6cc5b383a737e24e6dcf5" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/send@*": - version "0.17.1" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz#ed4932b8a2a805f1fe362a70f4e62d0ac994e301" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.1" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz#86b1753f0be4f9a1bee68d459fcda5be4ea52b5d" - integrity sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ== - dependencies: - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.6" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" - integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ== - -"@types/ws@^8.5.1": - version "8.5.4" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" - integrity sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz#b3ef8d50ad4aa6aecf6ddc97c580a00f5aa11902" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.7.6: - version "1.8.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" - integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.0.4, acorn@^8.5.0, acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -address@^1.0.1, address@^1.1.2: - version "1.2.2" - resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz#2b5248dac5485a6390532c6a517fda2e3faac89e" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -algoliasearch-helper@^3.10.0: - version "3.13.0" - resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.0.tgz#1ccca7056fd27c2b0b5c92dd5c0abf4314bec3b8" - integrity sha512-kV3c1jMQCvkARtGsSDvAwuht4PAMSsQILqPiH4WFiARoa3jXJ/r1TQoBWAjWyWF48rsNYCv7kzxgB4LTxrvvuw== - dependencies: - "@algolia/events" "^4.0.1" - -algoliasearch@^4.0.0, algoliasearch@^4.13.1: - version "4.17.0" - resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.17.0.tgz#46ed58b2b99509d041f11cd1ea83623edf84355f" - integrity sha512-JMRh2Mw6sEnVMiz6+APsi7lx9a2jiDFF+WUtANaUVCv6uSU9UOLdo5h9K3pdP6frRRybaM2fX8b1u0nqICS9aA== - dependencies: - "@algolia/cache-browser-local-storage" "4.17.0" - "@algolia/cache-common" "4.17.0" - "@algolia/cache-in-memory" "4.17.0" - "@algolia/client-account" "4.17.0" - "@algolia/client-analytics" "4.17.0" - "@algolia/client-common" "4.17.0" - "@algolia/client-personalization" "4.17.0" - "@algolia/client-search" "4.17.0" - "@algolia/logger-common" "4.17.0" - "@algolia/logger-console" "4.17.0" - "@algolia/requester-browser-xhr" "4.17.0" - "@algolia/requester-common" "4.17.0" - "@algolia/requester-node-http" "4.17.0" - "@algolia/transporter" "4.17.0" - -ansi-align@^3.0.0, ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.7: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz#e28d49902f8e759dd25b153264e862df2705f79d" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz#349cfbb31331a9b4453190791760a8d35b093e0a" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== - dependencies: - follow-redirects "^1.14.7" - -babel-loader@^8.2.5: - version "8.3.0" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz#124936e841ba4fe8176786d6ff28add1f134d6a8" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz#d216e8fd0de91de3f1478ef3231e05446bc8705b" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz#de5f9a28eb12f3eb2578bf74472204e66d1a13dc" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" - -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" - -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz#e297f60d7ec1014a7a971a39ebc8a98c0b681e70" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz#960948fa0e0153f5d26743ab15baf8e33752c135" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz#788cb686fc83c1f486dfa8a40c68fc2b831d2b50" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -boxen@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz#b098a2278b2cd2845deef2dff2efc38d329b434d" - integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== - dependencies: - ansi-align "^3.0.1" - camelcase "^6.2.0" - chalk "^4.1.2" - cli-boxes "^3.0.0" - string-width "^5.0.1" - type-fest "^2.5.0" - widest-line "^4.0.1" - wrap-ansi "^8.0.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.3, browserslist@^4.21.4, browserslist@^4.21.5: - version "4.21.5" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz#75c5dae60063ee641f977e00edd3cfb2fb7af6a7" - integrity sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w== - dependencies: - caniuse-lite "^1.0.30001449" - electron-to-chromium "^1.4.284" - node-releases "^2.0.8" - update-browserslist-db "^1.0.10" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz#ee978f6947914cc30c6b44741b6ed1df7f043fd5" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001464: - version "1.0.30001486" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz#56a08885228edf62cbe1ac8980f2b5dae159997e" - integrity sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz#4d8673286b8126ca2a8e42740d5e3c4884ae21b4" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.12: - version "1.0.0-rc.12" - resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz#788bf7466506b1c6bf5fae51d24a2c4d62e47683" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -clean-css@^5.2.2, clean-css@^5.3.0: - version "5.3.2" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz#70ecc7d4d4114921f5d298349ff86a31a9975224" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-table3@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz#61ab765aac156b52f222954ffc607a6f01dbeeb2" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz#0ddc4a20a549b59c93a4116bb26f5294ca17dc12" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^2.0.10: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combine-promises@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz#72db90743c0ca7aab7d0d8d2052fd7b0f674de71" - integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz#95523eff170ca57c29a0ca41e6fe131f41e5bb8f" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-text-to-clipboard@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.1.0.tgz#6bf40deef0a51ac6858efb0d76ded2c6d6a15059" - integrity sha512-PFM6BnjLnOON/lB3ta/Jg7Ywsv+l9kQGD4TWDCSlRBGmqnnTM5MrDkhAFgw+8HZt0wW6Q2BBE4cmy9sq+s9Qng== - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz#96d4dbdb5f73d02dd72d0528d1958721ab72e04a" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - -core-js-compat@^3.25.1: - version "3.30.2" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz#83f136e375babdb8c80ad3c22d67c69098c1dd8b" - integrity sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA== - dependencies: - browserslist "^4.21.5" - -core-js-pure@^3.25.1: - version "3.30.2" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz#005a82551f4af3250dcfb46ed360fad32ced114e" - integrity sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg== - -core-js@^3.23.3: - version "3.30.2" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz#6528abfda65e5ad728143ea23f7a14f0dcf503fc" - integrity sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz#da4fee853c52f6b1e6935f41c1a2fc50bd4a9982" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz#1443b9afa596b670082ea46cbd8f6a62b84635f6" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.1.3: - version "8.1.3" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" - integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -cross-fetch@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" - integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== - dependencies: - node-fetch "2.6.7" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-declaration-sorter@^6.3.1: - version "6.4.0" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz#630618adc21724484b3e9505bce812def44000ad" - integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== - -css-loader@^6.7.1: - version "6.7.3" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz#1e8799f3ccc5874fdd55461af51137fcc5befbcd" - integrity sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.19" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.0" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz#79f6199eb5adf1ff7ba57f105e3752d15211eb35" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== - dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1, css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-advanced@^5.3.8: - version "5.3.10" - resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz#25558a1fbf3a871fb6429ce71e41be7f5aca6eef" - integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== - dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.14" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz#309def4f7b7e16d71ab2438052093330d9ab45d8" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.1.12, cssnano@^5.1.8: - version "5.1.15" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz#ded66b5480d5127fcb44dac12ea5a983755136bf" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -debug@2.6.9, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.1.4: - version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detab@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz#b927892069aff405fbb9a186fe97a44a92a94b43" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz#c9c70775a49c3d03bc2c06d9a73be550f978f8b1" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz#451ca9b6eaf20451acb0799b8ab40dff7718727b" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz#2202c947845c7a63c23ece58f2f70ff6ab4c2f7d" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz#c47f551278d3dc4b0b1ab8cbb42d751a6f0d824e" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.284: - version "1.4.388" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.388.tgz#ec0d1be823d5b14da56d91ec5c57e84b4624ea45" - integrity sha512-xZ0y4zjWZgp65okzwwt00f2rYibkFPHUv9qBz+Vzn8cB9UXIo9Zc6Dw81LJYhhNt0G/vR1OJEfStZ49NKl0YxQ== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz#c008ca7d7620fac742fe1bf4af8ff8fed154ae7f" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.13.0: - version "5.14.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz#0b6c676c8a3266c99fa281e4433a706f5c0c61c4" - integrity sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eta@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/eta/-/eta-2.1.1.tgz#dfc1ced5e5515211cb9c6c9fac3eed86f4cce3e1" - integrity sha512-daWDLvwOCghtrXRVI4LEt57/R3hFwCidxRlczeYUGBWZ/8MuyZiusOFiCAXkVziuBMdku/lKQk2BgH1hsmijbA== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eval@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz#2b903473b8cc1d1989b83a1e7923f883eb357f85" - integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== - dependencies: - "@types/node" "*" - require-like ">= 0.1.1" - -eventemitter3@^4.0.0: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.3: - version "4.18.2" - resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== - 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.4" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz#7f0d9275cfdd86a1c963dc8b65fcc451edcbb1da" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz#00b2a1af5411254aab416cd75f9e6289bee4bff3" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz#216551136ae02fe255932c3ec8775f18e2c078b8" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.4" - resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.4.tgz#e1871c6bd3083bac71ff2da868ad5067d37716c6" - integrity sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^0.7.30" - -feed@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz#865783ef6ed12579e2c44bbef3c9113bc4956a7e" - integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== - dependencies: - xml-js "^1.6.11" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flux@^4.0.1: - version "4.0.4" - resolved "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz#9661182ea81d161ee1a6a6af10d20485ef2ac572" - integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@^1.0.0, follow-redirects@^1.14.7: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz#eda2eff6e22476a2688d10661688c47f611b37f3" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" - integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.2.0" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz#7ad1dc0535f3a2904bba075772763e5051f6d05f" - integrity sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.3" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -github-slugger@^1.4.0: - version "1.5.0" - resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz#17891bbc73232051474d68bd867a34625c955f7d" - integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.0.0, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - 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" - -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz#0c488971f066baceda21447aecb1a8b911d22485" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.1: - version "13.1.4" - resolved "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" - integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^4.0.0" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz#e893c064825de73ea1f5f7d88c7a9f7274288798" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz#065367fd50c239c0671cbcbad5be3e2eeb10e462" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz#9b67fd188e4c81e8ad66f803855334173920218d" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz#554e34abdeea25ac76f5bd950a1f0180e0b3bc2a" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz#d57c23f4da16ae3c63b3b6ca4616683313499c3a" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz#973b15930b7529a7b66984c98148b46526885977" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz#1ec44650b631d72952066cea9b1445df699f8479" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz#e8768d7eac56c3fdeac8a92830d58e811e5bf640" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hoist-non-react-statics@^3.1.0: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -html-entities@^2.3.2: - version "2.3.3" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46" - integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA== - -html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz#bfc818934cc07918f6b3669f5774ecdfd48f32ab" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.2.0: - version "3.3.1" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz#a04026a18c882e4bba8a01a3d39cfe465d40b5ce" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz#ce9159494e86d95e45795b166c2021c2cfca4483" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -html-webpack-plugin@^5.5.0: - version "5.5.1" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.1.tgz#826838e31b427f5f7f30971f8d8fa2422dfa6763" - integrity sha512-cTUzZ1+NqjGEKjmVgZKLMdiFg3m9MdRXkZW2OEe69WYVi5ONLMmlnSZdXzGGMOq0C8jGDrL6EWyEDDUioHO/pA== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.1: - version "8.0.2" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz#f002151705b383e62433b5cf466f5b716edaec21" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz#af23090d9ac4e24573de6f6aecc9d84a48bf20e3" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ignore@^5.2.0: - version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -image-size@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz#d778b6d0ab75b2737c1556dd631652eb963bc486" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== - -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infima@0.2.0-alpha.43: - version "0.2.0-alpha.43" - resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz#f7aa1d7b30b6c08afef441c726bac6150228cbe0" - integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" - integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.11.0: - version "2.12.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz#36ad62f6f73c8253fd6472517a12483cf03e7ec4" - integrity sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ== - dependencies: - has "^1.0.3" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz#43e8d65cc56e1b67f8d47262cf667099193f45a8" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -jest-util@^29.5.0: - version "29.5.0" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz#24a4d3d92fc39ce90425311b23c27a6e0ef16b8f" - integrity sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ== - dependencies: - "@jest/types" "^29.5.0" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.1.2: - version "29.5.0" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz#bdaefb06811bd3384d93f009755014d8acb4615d" - integrity sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA== - dependencies: - "@types/node" "*" - jest-util "^29.5.0" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jiti@^1.18.2: - version "1.18.2" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.18.2.tgz#80c3ef3d486ebf2450d9335122b32d121f2a83cd" - integrity sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg== - -joi@^17.6.0: - version "17.9.2" - resolved "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz#8b2e4724188369f55451aebd1d0b1d9482470690" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== - dependencies: - "@hapi/hoek" "^9.0.0" - "@hapi/topo" "^5.0.0" - "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.1" - "@sideway/pinpoint" "^2.0.0" - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -klona@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" - integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== - -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz#4c0c1a6ac126c572bd9ff9a30da1d2cae66defd7" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.7.3" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz#4fb104b599daafd82ef3e1a41fb9265f87e1f576" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz#248e36072ede906501d75966200a86dab8b23170" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz#87bf40292b8cf83e4e8ce1a3ae4209e20071675a" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz#7c4c114679c3bee27ef10b58e2e015be79f1ef97" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== - dependencies: - unist-util-remove "^2.0.0" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz#c5c1a84db799173b4dcf7643cda999e440c24db2" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz#0cfc82089494c52d46eb0e3edb7a4eb2aea021eb" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.5.1" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz#f0cd1e2bfaef58f6fe09bfb9c2288f07fea099ec" - integrity sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA== - dependencies: - fs-monkey "^1.0.3" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18: - version "2.1.18" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mini-css-extract-plugin@^2.6.1: - version "2.7.5" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5" - integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ== - dependencies: - schema-utils "^4.0.0" - -minimalistic-assert@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimatch@3.1.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz#69a0150e6946e2f115e9d7ea4df7971e2628301c" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-releases@^2.0.8: - version "2.0.10" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" - integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz#cb8f34c53213d895723fcbab907e9422adbcafb1" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-numeric-range@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz#7c63b61190d61e4d53a1197f0c83c47bb670ffa3" - integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz#23c2cc233bcf09bb7beba8b8a69d46b08c62c2f1" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz#86c27c26ed6ba00d96c79e08f3ffb418d1d1988f" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz#04998bb9ba6b65aa31035d669a6af342c5f9d393" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz#8974e9b143d887677304e558c1166d3762501142" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-loader@^7.0.0: - version "7.3.0" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.0.tgz#05991c1e490d8ff86ef18358d87db3b5b2dcb5f5" - integrity sha512-qLAFjvR2BFNz1H930P7mj1iuWJFjGey/nVhimfOAAQ1ZyPpcClAxP8+A55Sl8mBvM+K2a9Pjgdj10KpANWrNfw== - dependencies: - cosmiconfig "^8.1.3" - jiti "^1.18.2" - klona "^2.0.6" - semver "^7.3.8" - -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz#7753817c2e0b75d0853b56f78a89771e15ca04a1" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz#24a1bdf402d9ef0e70f568f39bdc0344d568fb16" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz#2f26fa5cacb75b1402e213789f6766ae5e40313c" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz#c06a6c787128b3208b38c9364cfc40c8aa5d7352" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c" - integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz#f67297fca3fea7f17e0d2caa40769afc487aa030" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz#c89c11336c432ac4b28792f24778859a67dfba95" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz#798cd77b3e033eae7105c18c9d371d989e1382d6" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.12" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" - integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-sort-media-queries@^4.2.1: - version "4.4.1" - resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz#04a5a78db3921eb78f28a1a781a2e68e65258128" - integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== - dependencies: - sort-css-media-queries "2.1.0" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz#4a5c7e5ff1050bd4c01d95b1847dfdcc58a496ff" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== - -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.19: - version "8.4.23" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz#df0aee9ac7c5e53e1075c24a3613496f9e6552ab" - integrity sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-time@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" - integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== - -prism-react-renderer@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz#786bb69aa6f73c32ba1ee813fbe17a0115435085" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== - -prismjs@^1.28.0: - version "1.29.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz#61675545fb23002f245c6540ec46077d4da3ed69" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz#1fe064fb0ac851f0de61320a8bf796836422f33e" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@1.2.8, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz#ef2156d66cf4139695c8a167886cb69ea660792c" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-fast-compare@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.1.tgz#53933d9e14f364281d6cba24bfed7a4afb808b5f" - integrity sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg== - -react-helmet-async@*, react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz#7bd5bf8c5c69ea9f02f6083f14ce33ef545c222e" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz#f184209ee8f1bf374fb0c41b0813cff54549c475" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz#2cdc91e8a744ffdf9e3556caabeb6e4278689883" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== - dependencies: - "@babel/runtime" "^7.10.3" - -react-loadable@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz#582251679d3da86c32aae2c8e689c59f1196d8c4" - integrity sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg== - dependencies: - prop-types "^15.5.0" - -react-router-config@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz#0f4263d1a80c6b2dc7b9c1902c9526478194a988" - integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== - dependencies: - "@babel/runtime" "^7.1.2" - -react-router-dom@^5.3.3: - version "5.3.4" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz#2ed62ffd88cae6db134445f4a0c0ae8b91d2e5e6" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.3.3: - version "5.3.4" - resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz#8ca252d70fcc37841e31473c7a151cf777887bb5" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-textarea-autosize@^8.3.2: - version "8.4.1" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.4.1.tgz#bcfc5462727014b808b14ee916c01e275e8a8335" - integrity sha512-aD2C+qK6QypknC+lCMzteOdIjoMbNlgSFmJjCV+DrfTPwp59i/it9mMNf2HDzvRjQgKAyBDPyLJhcrzElf2U4Q== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz#d2a7f1b6057cb2e169beaf87113cc3411b5bc5bb" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz#e726f328c0d69153bcabd5c322d3195252379372" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz#f02d49c3668884612ca031419491a13539e21fac" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== - dependencies: - rc "1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remark-emoji@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz#1c702090a1525da5b80e15a8f963ef2c8236cac7" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz#06a8dab07dcfdd57f3373af7f86bd0e992108bbd" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== - dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz#9c62aa3b35b79a486454c690472906075f40c7e1" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz#76eb0e085295131c84748c8e43810159c5653ead" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== - dependencies: - mdast-squeeze-paragraphs "^4.0.0" - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -"require-like@>= 0.1.1": - version "0.1.2" - resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz#ad6f30c13becd797010c468afa775c0c0a6b47fa" - integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rtl-detect@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz#40ae0ea7302a150b96bc75af7d749607392ecac6" - integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== - -rtlcss@^3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz#c9eb91269827a102bac7ae3115dd5d049de636c3" - integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== - dependencies: - find-up "^5.0.0" - picocolors "^1.0.0" - postcss "^8.3.11" - strip-json-comments "^3.1.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.4: - version "7.8.1" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz#17151f76d8eae67fbbf77960c33c676ad9f4efc7" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz#1ca4f32d1b24c590c203b8e7a50bf0ea4cd394d7" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz#eb2d042df8b01f4b5c276a2dfd41ba0faab72e8d" - integrity sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz#e9041953506780ec01d59f292a19c7b850b84167" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver@^5.4.1: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: - version "7.5.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-handler@^6.1.3: - version "6.1.5" - resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz#a4a0964f5c55c7e37a02a633232b6f0d6f068375" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.1.2" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz#1d73979b38c7fe91fcba49c85280daa9c2363b49" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -sitemap@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz#eeed9ad6d95499161a3eadc60f8c6dce4bea2bef" - integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== - dependencies: - "@types/node" "^17.0.5" - "@types/sax" "^1.2.1" - arg "^5.0.0" - sax "^1.2.4" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -sort-css-media-queries@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz#7c85e06f79826baabb232f5560e9745d7a78c4ce" - integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -std-env@^3.0.1: - version "3.3.3" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz#a54f06eb245fdcfef53d56f3c0251f1d5c3d01fe" - integrity sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg== - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz#fdc2e29e13951736140b76cb122c8ee6630eb6b5" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: - version "5.3.8" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz#415e03d2508f7de63d59eca85c5d102838f06610" - integrity sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser@^5.10.0, terser@^5.16.8: - version "5.17.3" - resolved "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz#7f908f16b3cdf3f6c0f8338e6c1c674837f90d25" - integrity sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz#8560808c916ef02ecfd55e66090df23a4b7aa642" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz#a4d65a3e546517701e3e5c37a47a70ac97fe56df" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^2.5.0: - version "2.19.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.4.2: - version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -ua-parser-js@^0.7.30: - version "0.7.35" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz#8bda4827be4f0b1dda91699a29499575a1f1d307" - integrity sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz#6c9b503f2b41b262330c80e91c8614abdaa69c22" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz#67a62c627c40589edebbf60f53edfd4d822027f8" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz#5ab51f689e2992a472beb1b35f2ce7ff2f324d4b" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz#976e5f462a7a5de73d94b706bac1b90671b57797" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz#1c42ee6301f8d52f47d14f62bbdb796571fa2d47" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz#5d19ca79fdba712301999b2b73553ca8f3b352cc" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz#b0b4738aa7ee445c402fda9328d604a02d010588" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== - dependencies: - unist-util-is "^4.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz#65a6ce698f78a6b0f56aa0e88f13801886cdaef6" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz#c3703893146df47203bb8a9795af47d7b971208c" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -update-browserslist-db@^1.0.10: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz#9a2a641ad2907ae7b3616506f4b977851db5b940" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz#4ab0d7c7f36a231dd7316cf7729313f0214d9ad9" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz#d13dfb4b08c28e3e33991546a2cee53e14038cf2" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -use-sync-external-store@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz#ea4148f9a741015f05ed74fd615e1d20e6bed82b" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz#d8e41fbcbd406063669ebf6c33d56ae8721d0f3c" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz#16bbc4d1e4ebdd41c5b4e63a2e16dbd1f4e5601e" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== - dependencies: - axios "^0.25.0" - joi "^17.6.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-bundle-analyzer@^4.5.0: - version "4.8.0" - resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz#951b8aaf491f665d2ae325d8b84da229157b1d04" - integrity sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.9.3: - version "4.15.0" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz#87ba9006eca53c551607ea0d663f4ae88be7af21" - integrity sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.1" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@^5.8.0: - version "5.8.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" - integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.2, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.73.0: - version "5.82.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.82.0.tgz#3c0d074dec79401db026b4ba0fb23d6333f88e7d" - integrity sha512-iGNA2fHhnDcV1bONdUu554eZx+XeldsaeQ8T67H6KKHl2nUSwX8Zm7cmzOA46ox/X1ARxf7Bjv8wQ/HsB5fxBg== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.13.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz#d3dd466211c73852741dfc842b7556dcbc2b0570" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== - dependencies: - chalk "^4.1.0" - consola "^2.15.3" - pretty-time "^1.1.0" - std-env "^3.0.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz#a0fc673aaba1ea6f0a0d35b3c2795c9a9cc2ebf2" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.13.0: - version "8.13.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz#9a9fb92f93cf41512a0735c8f4dd09b8a1211cd0" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz#927d2f6947f7f1c19a316dd8eea3614e8b18f8e9" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - -xtend@^4.0.0, xtend@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw== diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index a3731ae47..000000000 --- a/yarn.lock +++ /dev/null @@ -1,12309 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@ampproject/remapping@^2.0.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.0.tgz#72becdf17ee44b2d1ac5651fb12f1952c336fe23" - integrity sha512-d5RysTlJ7hmw5Tw4UxgxcY3lkMe92n8sXCcuLPAyIAHK6j8DefDwtGnVVDgOnv+RnEosulDJ9NPKQL27bDId0g== - dependencies: - "@jridgewell/trace-mapping" "^0.3.0" - -"@angular/common@^12.1.0": - version "12.2.3" - resolved "https://registry.npmjs.org/@angular/common/-/common-12.2.3.tgz#deb11b2cc0e0e3056af4b0318098aecbc67fa561" - integrity sha512-AkOeknm35kzLqqh5dIz1143e3Q1MjWgi7THlY3StY63yphseQUUvGQSNHkDSIpfwBN8Mt+ZykKFjhY+cNFYt7w== - dependencies: - tslib "^2.2.0" - -"@angular/compiler-cli@^12.1.0": - version "12.1.0" - resolved "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-12.1.0.tgz#c2a7dac72d64bda6cae2953af170ecf73d0fe865" - integrity sha512-6MV6h5hlZfjVNrB8il2sCF7wa0qWKutfK2Za8DFHVCqNND1j75iXrrHNxbu30jZC0HXOSrQQuUThifT/YUU3MQ== - dependencies: - "@babel/core" "^7.8.6" - "@babel/types" "^7.8.6" - canonical-path "1.0.0" - chokidar "^3.0.0" - convert-source-map "^1.5.1" - dependency-graph "^0.11.0" - magic-string "^0.25.0" - minimist "^1.2.0" - reflect-metadata "^0.1.2" - semver "^7.0.0" - source-map "^0.6.1" - sourcemap-codec "^1.4.8" - tslib "^2.2.0" - yargs "^17.0.0" - -"@angular/compiler@^12.1.0": - version "12.1.0" - resolved "https://registry.npmjs.org/@angular/compiler/-/compiler-12.1.0.tgz#c630dd7fe26184645dd3f0f227d1b8862920919d" - integrity sha512-Nk9l8fWv0XrEZGpN8EftAzTC6Q2oTnDqnYQ9Ykc3rkRQs4r8MDG9cUd4z5gbEToFgX7KVQ3+wLAYVX+uB6A5hg== - dependencies: - tslib "^2.2.0" - -"@angular/core@^12.1.0": - version "12.2.3" - resolved "https://registry.npmjs.org/@angular/core/-/core-12.2.3.tgz#74f53915da3134f7e3a205219107b2eb4adcf8a6" - integrity sha512-gv3FJPiwDKugySzPepBzXrbr8HxeK2enotEmducNv3IdtGZPS0/qrbDVt7W0woRt7BGAeWaZKEaPoFzMZeEbCw== - dependencies: - tslib "^2.2.0" - -"@angular/platform-browser-dynamic@^12.1.0": - version "12.2.3" - resolved "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-12.2.3.tgz#e4ce6805ec557eeb92c90732b8cfb8ac263ab96b" - integrity sha512-K31+QW6ubquSXkWaf54TXIkV5aoRLwZ5aFo8TEAXbmddgwxhWF7egCB5j0pajq5QTxyDnXns9140HNcqg4QLcw== - dependencies: - tslib "^2.2.0" - -"@angular/platform-browser@^12.1.0": - version "12.2.3" - resolved "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-12.2.3.tgz#0d9c6e8270c8192f4abf7b0a7c520a933ba60a1d" - integrity sha512-dPA9JDZtxBb4VvhFFMh0sQzTfMcUXYxe/jY1rsKqYJVbIW6NZ1kj9/00acxTU0QdrW4xv5TlwgOdTYck6//C4g== - dependencies: - tslib "^2.2.0" - -"@babel/code-frame@7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz#f4ad435aa263db935b8f10f2c552d23fb716a63f" - integrity sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw== - dependencies: - "@babel/highlight" "^7.10.4" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.3", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.14.5", "@babel/code-frame@^7.8.3": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz#23b08d740e83f49c5e59945fbf1b43e80bbf4edb" - integrity sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw== - dependencies: - "@babel/highlight" "^7.14.5" - -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.8.tgz#5b783b9808f15cef71547f1b691f34f8ff6003a6" - integrity sha512-EaI33z19T4qN3xLXsGf48M2cDqa6ei9tPZlfLdb2HC+e/cFtREiRd8hdSqDbwdLB0/+gLwqJmCYASH0z2bUdog== - -"@babel/compat-data@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.5.tgz#8ef4c18e58e801c5c95d3c1c0f2874a2680fadea" - integrity sha512-kixrYn4JwfAVPa0f2yfzc2AWti6WRRyO3XjWW5PJAvtE11qhSayrrcrEnee05KAtNaPC+EwehE8Qt1UedEVB8w== - -"@babel/compat-data@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz#2dbaf8b85334796cafbb0f5793a90a2fc010b176" - integrity sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA== - -"@babel/compat-data@^7.16.4": - version "7.17.0" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.0.tgz#86850b8597ea6962089770952075dcaabb8dba34" - integrity sha512-392byTlpGWXMv4FbyWw3sAZ/FrW/DrwqLGXpy0mbyNe9Taqv1mg9yON5/o0cnr8XYCkFTZbC1eV+c+LAROgrng== - -"@babel/core@>=7.9.0": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.13.8.tgz#c191d9c5871788a591d69ea1dc03e5843a3680fb" - integrity sha512-oYapIySGw1zGhEFRd6lzWNLWFX2s5dA/jm+Pw/+59ZdXtjyIuwlXbrId22Md0rgZVop+aVoqow2riXhBLNyuQg== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.0" - "@babel/helper-compilation-targets" "^7.13.8" - "@babel/helper-module-transforms" "^7.13.0" - "@babel/helpers" "^7.13.0" - "@babel/parser" "^7.13.4" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - lodash "^4.17.19" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/core@^7.1.0": - version "7.9.6" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" - integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.6" - "@babel/parser" "^7.9.6" - "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.12.3", "@babel/core@^7.8.0": - version "7.17.2" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.17.2.tgz#2c77fc430e95139d816d39b113b31bf40fb22337" - integrity sha512-R3VH5G42VSDolRHyUO4V2cfag8WHcZyxdq5Z/m8Xyb92lW/Erm/6kM+XtRFGf3Mulre3mveni2NHfEUws8wSvw== - dependencies: - "@ampproject/remapping" "^2.0.0" - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.0" - "@babel/helper-compilation-targets" "^7.16.7" - "@babel/helper-module-transforms" "^7.16.7" - "@babel/helpers" "^7.17.2" - "@babel/parser" "^7.17.0" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - -"@babel/core@^7.7.2": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.14.5.tgz#d281f46a9905f07d1b3bf71ead54d9c7d89cb1e3" - integrity sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-compilation-targets" "^7.14.5" - "@babel/helper-module-transforms" "^7.14.5" - "@babel/helpers" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/core@^7.8.6": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz#749e57c68778b73ad8082775561f67f5196aafa8" - integrity sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-compilation-targets" "^7.15.0" - "@babel/helper-module-transforms" "^7.15.0" - "@babel/helpers" "^7.14.8" - "@babel/parser" "^7.15.0" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/generator@^7.13.0": - version "7.13.9" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz#3a7aa96f9efb8e2be42d38d80e2ceb4c64d8de39" - integrity sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw== - dependencies: - "@babel/types" "^7.13.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.14.5", "@babel/generator@^7.7.2": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.14.5.tgz#848d7b9f031caca9d0cd0af01b063f226f52d785" - integrity sha512-y3rlP+/G25OIX3mYKKIOlQRcqj7YgrvHxOLbVmyLJ9bPmi5ttvUmpydVjcFjZphOktWuA7ovbx91ECloWTfjIA== - dependencies: - "@babel/types" "^7.14.5" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz#a7d0c172e0d814974bad5aa77ace543b97917f15" - integrity sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ== - dependencies: - "@babel/types" "^7.15.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.17.0": - version "7.17.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.17.0.tgz#7bd890ba706cd86d3e2f727322346ffdbf98f65e" - integrity sha512-I3Omiv6FGOC29dtlZhkfXO6pgkmukJSlT26QjVvS1DGZe/NzSVCPG41X0tS21oZkJYlovfj9qDWgKP+Cn4bXxw== - dependencies: - "@babel/types" "^7.17.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.9.6": - version "7.9.6" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" - integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== - dependencies: - "@babel/types" "^7.9.6" - jsesc "^2.5.1" - lodash "^4.17.13" - source-map "^0.5.0" - -"@babel/helper-compilation-targets@^7.13.8": - version "7.13.8" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.8.tgz#02bdb22783439afb11b2f009814bdd88384bd468" - integrity sha512-pBljUGC1y3xKLn1nrx2eAhurLMA8OqBtBP/JwG4U8skN7kf8/aqwwxpV1N6T0e7r6+7uNitIa/fUxPFagSXp3A== - dependencies: - "@babel/compat-data" "^7.13.8" - "@babel/helper-validator-option" "^7.12.17" - browserslist "^4.14.5" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.5.tgz#7a99c5d0967911e972fe2c3411f7d5b498498ecf" - integrity sha512-v+QtZqXEiOnpO6EYvlImB6zCD2Lel06RzOPzmkz/D/XgQiUu3C/Jb1LOqSt/AIA34TYi/Q+KlT8vTQrgdxkbLw== - dependencies: - "@babel/compat-data" "^7.14.5" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz#973df8cbd025515f3ff25db0c05efc704fa79818" - integrity sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A== - dependencies: - "@babel/compat-data" "^7.15.0" - "@babel/helper-validator-option" "^7.14.5" - browserslist "^4.16.6" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz#06e66c5f299601e6c7da350049315e83209d551b" - integrity sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA== - dependencies: - "@babel/compat-data" "^7.16.4" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz#ff484094a839bde9d89cd63cba017d7aae80ecd7" - integrity sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" - integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== - dependencies: - "@babel/helper-get-function-arity" "^7.12.13" - "@babel/template" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/helper-function-name@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz#89e2c474972f15d8e233b52ee8c480e2cfcd50c4" - integrity sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ== - dependencies: - "@babel/helper-get-function-arity" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-function-name@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz#f1ec51551fb1c8956bc8dd95f38523b6cf375f8f" - integrity sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA== - dependencies: - "@babel/helper-get-function-arity" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-function-name@^7.9.5": - version "7.9.5" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" - integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== - dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.9.5" - -"@babel/helper-get-function-arity@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" - integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-get-function-arity@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz#25fbfa579b0937eee1f3b805ece4ce398c431815" - integrity sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-get-function-arity@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" - integrity sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-hoist-variables@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz#e0dd27c33a78e577d7c8884916a3e7ef1f7c7f8d" - integrity sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-member-expression-to-functions@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.0.tgz#6aa4bb678e0f8c22f58cdb79451d30494461b091" - integrity sha512-yvRf8Ivk62JwisqV1rFRMxiSMDGnN6KH1/mDMmIrij4jztpQNRoHqqMG3U6apYbGRPJpgPalhva9Yd06HlUxJQ== - dependencies: - "@babel/types" "^7.13.0" - -"@babel/helper-member-expression-to-functions@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.14.5.tgz#d5c70e4ad13b402c95156c7a53568f504e2fb7b8" - integrity sha512-UxUeEYPrqH1Q/k0yRku1JE7dyfyehNwT6SVkMHvYvPDv4+uu627VXBckVj891BO8ruKBkiDoGnZf4qPDD8abDQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-member-expression-to-functions@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz#0ddaf5299c8179f27f37327936553e9bba60990b" - integrity sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg== - dependencies: - "@babel/types" "^7.15.0" - -"@babel/helper-member-expression-to-functions@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz#659b710498ea6c1d9907e0c73f206eee7dadc24c" - integrity sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-imports@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" - integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-module-imports@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz#6d1a44df6a38c957aa7c312da076429f11b422f3" - integrity sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-module-imports@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz#25612a8091a999704461c8a222d0efec5d091437" - integrity sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-module-imports@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz#7fe39589b39c016331b6b8c3f441e8f0b1419498" - integrity sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-module-transforms@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" - integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== - dependencies: - "@babel/helper-module-imports" "^7.12.13" - "@babel/helper-replace-supers" "^7.13.0" - "@babel/helper-simple-access" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/helper-validator-identifier" "^7.12.11" - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - lodash "^4.17.19" - -"@babel/helper-module-transforms@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.5.tgz#7de42f10d789b423eb902ebd24031ca77cb1e10e" - integrity sha512-iXpX4KW8LVODuAieD7MzhNjmM6dzYY5tfRqT+R9HDXWl0jPn/djKmA+G9s/2C2T9zggw5tK1QNqZ70USfedOwA== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.14.5" - "@babel/helper-simple-access" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.5" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-module-transforms@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz#679275581ea056373eddbe360e1419ef23783b08" - integrity sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg== - dependencies: - "@babel/helper-module-imports" "^7.14.5" - "@babel/helper-replace-supers" "^7.15.0" - "@babel/helper-simple-access" "^7.14.8" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/helper-validator-identifier" "^7.14.9" - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-module-transforms@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz#7665faeb721a01ca5327ddc6bba15a5cb34b6a41" - integrity sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng== - dependencies: - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-simple-access" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/helper-validator-identifier" "^7.16.7" - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/helper-module-transforms@^7.9.0": - version "7.9.0" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz#43b34dfe15961918707d247327431388e9fe96e5" - integrity sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" - "@babel/helper-simple-access" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/template" "^7.8.6" - "@babel/types" "^7.9.0" - lodash "^4.17.13" - -"@babel/helper-optimise-call-expression@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" - integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-optimise-call-expression@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz#f27395a8619e0665b3f0364cddb41c25d71b499c" - integrity sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-optimise-call-expression@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz#7ed071813d09c75298ef4f208956006b6111ecb9" - integrity sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== - -"@babel/helper-plugin-utils@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz#5ac822ce97eec46741ab70a517971e443a70c5a9" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== - -"@babel/helper-replace-supers@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.0.tgz#6034b7b51943094cb41627848cb219cb02be1d24" - integrity sha512-Segd5me1+Pz+rmN/NFBOplMbZG3SqRJOBlY+mA0SxAv6rjj7zJqr1AVr3SfzUVTLCv7ZLU5FycOM/SBGuLPbZw== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.13.0" - "@babel/helper-optimise-call-expression" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helper-replace-supers@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.14.5.tgz#0ecc0b03c41cd567b4024ea016134c28414abb94" - integrity sha512-3i1Qe9/8x/hCHINujn+iuHy+mMRLoc77b2nI9TB0zjH1hvn9qGlXjWlggdwUcju36PkPCy/lpM7LLUdcTyH4Ow== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.14.5" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helper-replace-supers@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz#ace07708f5bf746bf2e6ba99572cce79b5d4e7f4" - integrity sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.15.0" - "@babel/helper-optimise-call-expression" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helper-replace-supers@^7.8.6": - version "7.9.6" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" - integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== - dependencies: - "@babel/helper-member-expression-to-functions" "^7.8.3" - "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - -"@babel/helper-simple-access@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" - integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-simple-access@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.5.tgz#66ea85cf53ba0b4e588ba77fc813f53abcaa41c4" - integrity sha512-nfBN9xvmCt6nrMZjfhkl7i0oTV3yxR4/FztsbOASyTvVcoYd0TRHh7eMLdlEcCqobydC0LAF3LtC92Iwxo0wyw== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-simple-access@^7.14.8": - version "7.14.8" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz#82e1fec0644a7e775c74d305f212c39f8fe73924" - integrity sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg== - dependencies: - "@babel/types" "^7.14.8" - -"@babel/helper-simple-access@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz#d656654b9ea08dbb9659b69d61063ccd343ff0f7" - integrity sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-simple-access@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz#7f8109928b4dab4654076986af575231deb639ae" - integrity sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/helper-split-export-declaration@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" - integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== - dependencies: - "@babel/types" "^7.12.13" - -"@babel/helper-split-export-declaration@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz#22b23a54ef51c2b7605d851930c1976dd0bc693a" - integrity sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA== - dependencies: - "@babel/types" "^7.14.5" - -"@babel/helper-split-export-declaration@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz#0b648c0c42da9d3920d85ad585f2778620b8726b" - integrity sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw== - dependencies: - "@babel/types" "^7.16.7" - -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== - dependencies: - "@babel/types" "^7.8.3" - -"@babel/helper-validator-identifier@^7.12.11": - version "7.12.11" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" - integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== - -"@babel/helper-validator-identifier@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.5.tgz#d0f0e277c512e0c938277faa85a3968c9a44c0e8" - integrity sha512-5lsetuxCLilmVGyiLEfoHBRX8UCFD+1m2x3Rj97WrW3V7H3u4RWRXA4evMjImCsin2J2YT0QaVDGf+z8ondbAg== - -"@babel/helper-validator-identifier@^7.14.9": - version "7.14.9" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz#6654d171b2024f6d8ee151bf2509699919131d48" - integrity sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g== - -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - -"@babel/helper-validator-identifier@^7.9.5": - version "7.9.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" - integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== - -"@babel/helper-validator-option@^7.12.17": - version "7.12.17" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" - integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== - -"@babel/helper-validator-option@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz#6e72a1fff18d5dfcb878e1e62f1a021c4b72d5a3" - integrity sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow== - -"@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== - -"@babel/helpers@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.0.tgz#7647ae57377b4f0408bf4f8a7af01c42e41badc0" - integrity sha512-aan1MeFPxFacZeSz6Ld7YZo5aPuqnKlD7+HZY75xQsueczFccP9A7V05+oe0XpLwHK3oLorPe9eaAUljL7WEaQ== - dependencies: - "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.0" - -"@babel/helpers@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.5.tgz#4870f8d9a6fdbbd65e5674a3558b4ff7fef0d9b2" - integrity sha512-xtcWOuN9VL6nApgVHtq3PPcQv5qFBJzoSZzJ/2c0QK/IP/gxVcoWSNQwFEGvmbQsuS9rhYqjILDGGXcTkA705Q== - dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/helpers@^7.14.8": - version "7.15.3" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz#c96838b752b95dcd525b4e741ed40bb1dc2a1357" - integrity sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g== - dependencies: - "@babel/template" "^7.14.5" - "@babel/traverse" "^7.15.0" - "@babel/types" "^7.15.0" - -"@babel/helpers@^7.17.2": - version "7.17.2" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.2.tgz#23f0a0746c8e287773ccd27c14be428891f63417" - integrity sha512-0Qu7RLR1dILozr/6M0xgj+DFPmi6Bnulgm9M8BVa9ZCWxDqlSnqt3cf8IDPB5m45sVXUZ0kuQAgUrdSFFH79fQ== - dependencies: - "@babel/template" "^7.16.7" - "@babel/traverse" "^7.17.0" - "@babel/types" "^7.17.0" - -"@babel/helpers@^7.9.6": - version "7.9.6" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" - integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== - dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.6" - "@babel/types" "^7.9.6" - -"@babel/highlight@^7.10.4", "@babel/highlight@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz#6861a52f03966405001f6aa534a01a24d99e8cd9" - integrity sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.1.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": - version "7.9.6" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" - integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== - -"@babel/parser@^7.12.13", "@babel/parser@^7.13.0", "@babel/parser@^7.13.4": - version "7.13.9" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.13.9.tgz#ca34cb95e1c2dd126863a84465ae8ef66114be99" - integrity sha512-nEUfRiARCcaVo3ny3ZQjURjHQZUo/JkEw7rLlSZy/psWGnvwXFtPcr6jb7Yb41DVW5LTe6KRq9LGleRNsg1Frw== - -"@babel/parser@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.14.5.tgz#4cd2f346261061b2518873ffecdf1612cb032829" - integrity sha512-TM8C+xtH/9n1qzX+JNHi7AN2zHMTiPUtspO0ZdHflW8KaskkALhMmuMHb4bCmNdv9VAPzJX3/bXqkVLnAvsPfg== - -"@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.0": - version "7.17.0" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.17.0.tgz#f0ac33eddbe214e4105363bb17c3341c5ffcc43c" - integrity sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw== - -"@babel/parser@^7.15.0": - version "7.15.3" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz#3416d9bea748052cfcb63dbcc27368105b1ed862" - integrity sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA== - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-bigint@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" - integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.8.3.tgz#6cb933a8872c8d359bfde69bbeaae5162fd1e8f7" - integrity sha512-UcAyQWg2bAN647Q+O811tG9MrJ38Z10jjhQdKNAL8fsyPzE3cCN/uT+f55cFVY4aGO4jqJAvmqsuY3GQDwAoXg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-meta@^7.8.3": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-logical-assignment-operators@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.8.3.tgz#3995d7d7ffff432f6ddc742b47e730c054599897" - integrity sha512-Zpg2Sgc++37kuFl6ppq2Q7Awc6E6AIW671x5PY8E/f7MCIyPPGK/EoeZXvvY3P42exZ3Q4/t3YOzP/HiN79jDg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.8.3.tgz#0e3fb63e09bea1b11e96467271c8308007e7c41f" - integrity sha512-H7dCMAdN83PcCmqmkHB5dtp+Xa9a6LKSvA2hiFBC/5alSHxM5VgWZXFqDi0YFe8XNGT6iCa+z4V4zSt/PdZ7Dw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-top-level-await@^7.8.3": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" - integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-typescript@^7.7.2": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/template@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" - integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/parser" "^7.12.13" - "@babel/types" "^7.12.13" - -"@babel/template@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz#a9bc9d8b33354ff6e55a9c60d1109200a68974f4" - integrity sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/template@^7.3.3", "@babel/template@^7.8.3", "@babel/template@^7.8.6": - version "7.8.6" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz#86b22af15f828dfb086474f964dcc3e39c43ce2b" - integrity sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.6" - "@babel/types" "^7.8.6" - -"@babel/traverse@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.0.tgz#6d95752475f86ee7ded06536de309a65fc8966cc" - integrity sha512-xys5xi5JEhzC3RzEmSGrs/b3pJW/o87SypZ+G/PhaE7uqVQNv/jlmVIBXuoh5atqQ434LfXV+sf23Oxj0bchJQ== - dependencies: - "@babel/code-frame" "^7.12.13" - "@babel/generator" "^7.13.0" - "@babel/helper-function-name" "^7.12.13" - "@babel/helper-split-export-declaration" "^7.12.13" - "@babel/parser" "^7.13.0" - "@babel/types" "^7.13.0" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.19" - -"@babel/traverse@^7.14.5", "@babel/traverse@^7.7.2": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.14.5.tgz#c111b0f58afab4fea3d3385a406f692748c59870" - integrity sha512-G3BiS15vevepdmFqmUc9X+64y0viZYygubAMO8SvBmKARuF6CPSZtH4Ng9vi/lrWlZFGe3FWdXNy835akH8Glg== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.14.5" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.14.5" - "@babel/types" "^7.14.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz#4cca838fd1b2a03283c1f38e141f639d60b3fc98" - integrity sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw== - dependencies: - "@babel/code-frame" "^7.14.5" - "@babel/generator" "^7.15.0" - "@babel/helper-function-name" "^7.14.5" - "@babel/helper-hoist-variables" "^7.14.5" - "@babel/helper-split-export-declaration" "^7.14.5" - "@babel/parser" "^7.15.0" - "@babel/types" "^7.15.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.16.7", "@babel/traverse@^7.17.0": - version "7.17.0" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.0.tgz#3143e5066796408ccc880a33ecd3184f3e75cd30" - integrity sha512-fpFIXvqD6kC7c7PUNnZ0Z8cQXlarCLtCUpt2S1Dx7PjoRtCFffvOkHHSom+m5HIxMZn5bIBVb71lhabcmjEsqg== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.17.0" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.17.0" - "@babel/types" "^7.17.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.9.6": - version "7.9.6" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" - integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.6" - "@babel/helper-function-name" "^7.9.5" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.6" - "@babel/types" "^7.9.6" - debug "^4.1.0" - globals "^11.1.0" - lodash "^4.17.13" - -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": - version "7.9.6" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" - integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== - dependencies: - "@babel/helper-validator-identifier" "^7.9.5" - lodash "^4.17.13" - to-fast-properties "^2.0.0" - -"@babel/types@^7.12.13", "@babel/types@^7.13.0": - version "7.13.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.13.0.tgz#74424d2816f0171b4100f0ab34e9a374efdf7f80" - integrity sha512-hE+HE8rnG1Z6Wzo+MhaKE5lM5eMx71T4EHJgku2E3xIfaULhDcxiiRxUYgwX8qwP1BBSlag+TdGOt6JAidIZTA== - dependencies: - "@babel/helper-validator-identifier" "^7.12.11" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - -"@babel/types@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" - integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== - dependencies: - "@babel/helper-validator-identifier" "^7.14.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.14.8", "@babel/types@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz#61af11f2286c4e9c69ca8deb5f4375a73c72dcbd" - integrity sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ== - dependencies: - "@babel/helper-validator-identifier" "^7.14.9" - to-fast-properties "^2.0.0" - -"@babel/types@^7.16.7", "@babel/types@^7.17.0": - version "7.17.0" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz#a826e368bccb6b3d84acd76acad5c0d87342390b" - integrity sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@bcoe/v8-coverage@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" - integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== - -"@commitlint/cli@^16.2.3": - version "16.2.3" - resolved "https://registry.npmjs.org/@commitlint/cli/-/cli-16.2.3.tgz#6c250ce7a660a08a3ac35dd2ec5039421fb831df" - integrity sha512-VsJBQLvhhlOgEfxs/Z5liYuK0dXqLE5hz1VJzLBxiOxG31kL/X5Q4OvK292BmO7IGZcm1yJE3XQPWSiFaEHbWA== - dependencies: - "@commitlint/format" "^16.2.1" - "@commitlint/lint" "^16.2.1" - "@commitlint/load" "^16.2.3" - "@commitlint/read" "^16.2.1" - "@commitlint/types" "^16.2.1" - lodash "^4.17.19" - resolve-from "5.0.0" - resolve-global "1.0.0" - yargs "^17.0.0" - -"@commitlint/config-conventional@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-16.2.1.tgz#2cf47b505fb259777c063538c8498d8fd9b47779" - integrity sha512-cP9gArx7gnaj4IqmtCIcHdRjTYdRUi6lmGE+lOzGGjGe45qGOS8nyQQNvkNy2Ey2VqoSWuXXkD8zCUh6EHf1Ww== - dependencies: - conventional-changelog-conventionalcommits "^4.3.1" - -"@commitlint/config-validator@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.2.1.tgz#794e769afd4756e4cf1bfd823b6612932e39c56d" - integrity sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw== - dependencies: - "@commitlint/types" "^16.2.1" - ajv "^6.12.6" - -"@commitlint/ensure@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/ensure/-/ensure-16.2.1.tgz#0fc538173f95c1eb2694eeedb79cab478347f16f" - integrity sha512-/h+lBTgf1r5fhbDNHOViLuej38i3rZqTQnBTk+xEg+ehOwQDXUuissQ5GsYXXqI5uGy+261ew++sT4EA3uBJ+A== - dependencies: - "@commitlint/types" "^16.2.1" - lodash "^4.17.19" - -"@commitlint/execute-rule@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-12.1.4.tgz#9973b02e9779adbf1522ae9ac207a4815ec73de1" - integrity sha512-h2S1j8SXyNeABb27q2Ok2vD1WfxJiXvOttKuRA9Or7LN6OQoC/KtT3844CIhhWNteNMu/wE0gkTqGxDVAnJiHg== - -"@commitlint/execute-rule@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz#60be73be4b9af97a41546e7ce59fdd33787c65f8" - integrity sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g== - -"@commitlint/format@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/format/-/format-16.2.1.tgz#6e673f710c799be78e68b2682323e04f75080d07" - integrity sha512-Yyio9bdHWmNDRlEJrxHKglamIk3d6hC0NkEUW6Ti6ipEh2g0BAhy8Od6t4vLhdZRa1I2n+gY13foy+tUgk0i1Q== - dependencies: - "@commitlint/types" "^16.2.1" - chalk "^4.0.0" - -"@commitlint/is-ignored@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-16.2.1.tgz#cc688ec73a3d204b90f8086821a08814da461e5e" - integrity sha512-exl8HRzTIfb1YvDJp2b2HU5z1BT+9tmgxR2XF0YEzkMiCIuEKh+XLeocPr1VcvAKXv3Cmv5X/OfNRp+i+/HIhQ== - dependencies: - "@commitlint/types" "^16.2.1" - semver "7.3.5" - -"@commitlint/lint@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/lint/-/lint-16.2.1.tgz#c773f082cd4f69cb7807b805b691d2a52c732f97" - integrity sha512-fNINQ3X2ZqsCkNB3Z0Z8ElmhewqrS3gy2wgBTx97BkcjOWiyPAGwDJ752hwrsUnWAVBRztgw826n37xPzxsOgg== - dependencies: - "@commitlint/is-ignored" "^16.2.1" - "@commitlint/parse" "^16.2.1" - "@commitlint/rules" "^16.2.1" - "@commitlint/types" "^16.2.1" - -"@commitlint/load@>6.1.1": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-12.1.4.tgz#e3c2dbc0e7d8d928f57a6878bd7219909fc0acab" - integrity sha512-Keszi0IOjRzKfxT+qES/n+KZyLrxy79RQz8wWgssCboYjKEp+wC+fLCgbiMCYjI5k31CIzIOq/16J7Ycr0C0EA== - dependencies: - "@commitlint/execute-rule" "^12.1.4" - "@commitlint/resolve-extends" "^12.1.4" - "@commitlint/types" "^12.1.4" - chalk "^4.0.0" - cosmiconfig "^7.0.0" - lodash "^4.17.19" - resolve-from "^5.0.0" - -"@commitlint/load@^16.2.3": - version "16.2.3" - resolved "https://registry.npmjs.org/@commitlint/load/-/load-16.2.3.tgz#7b2e85af25a6f736f080ba08e7165738cedf8c8f" - integrity sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw== - dependencies: - "@commitlint/config-validator" "^16.2.1" - "@commitlint/execute-rule" "^16.2.1" - "@commitlint/resolve-extends" "^16.2.1" - "@commitlint/types" "^16.2.1" - "@types/node" ">=12" - chalk "^4.0.0" - cosmiconfig "^7.0.0" - cosmiconfig-typescript-loader "^1.0.0" - lodash "^4.17.19" - resolve-from "^5.0.0" - typescript "^4.4.3" - -"@commitlint/message@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/message/-/message-16.2.1.tgz#bc6a0fa446a746ac2ca78cf372e4cec48daf620d" - integrity sha512-2eWX/47rftViYg7a3axYDdrgwKv32mxbycBJT6OQY/MJM7SUfYNYYvbMFOQFaA4xIVZt7t2Alyqslbl6blVwWw== - -"@commitlint/parse@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/parse/-/parse-16.2.1.tgz#50b359cb711ec566d2ee236a8e4c6baca07b77c0" - integrity sha512-2NP2dDQNL378VZYioLrgGVZhWdnJO4nAxQl5LXwYb08nEcN+cgxHN1dJV8OLJ5uxlGJtDeR8UZZ1mnQ1gSAD/g== - dependencies: - "@commitlint/types" "^16.2.1" - conventional-changelog-angular "^5.0.11" - conventional-commits-parser "^3.2.2" - -"@commitlint/read@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/read/-/read-16.2.1.tgz#e0539205d77cdb6879b560f95e5fb251e0c6f562" - integrity sha512-tViXGuaxLTrw2r7PiYMQOFA2fueZxnnt0lkOWqKyxT+n2XdEMGYcI9ID5ndJKXnfPGPppD0w/IItKsIXlZ+alw== - dependencies: - "@commitlint/top-level" "^16.2.1" - "@commitlint/types" "^16.2.1" - fs-extra "^10.0.0" - git-raw-commits "^2.0.0" - -"@commitlint/resolve-extends@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-12.1.4.tgz#e758ed7dcdf942618b9f603a7c28a640f6a0802a" - integrity sha512-R9CoUtsXLd6KSCfsZly04grsH6JVnWFmVtWgWs1KdDpdV+G3TSs37tColMFqglpkx3dsWu8dsPD56+D9YnJfqg== - dependencies: - import-fresh "^3.0.0" - lodash "^4.17.19" - resolve-from "^5.0.0" - resolve-global "^1.0.0" - -"@commitlint/resolve-extends@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz#2f7833a5a3a7aa79f508e59fcb0f1d33c45ed360" - integrity sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg== - dependencies: - "@commitlint/config-validator" "^16.2.1" - "@commitlint/types" "^16.2.1" - import-fresh "^3.0.0" - lodash "^4.17.19" - resolve-from "^5.0.0" - resolve-global "^1.0.0" - -"@commitlint/rules@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/rules/-/rules-16.2.1.tgz#7264aa1c754e1c212aeceb27e5eb380cfa7bb233" - integrity sha512-ZFezJXQaBBso+BOTre/+1dGCuCzlWVaeLiVRGypI53qVgPMzQqZhkCcrxBFeqB87qeyzr4A4EoG++IvITwwpIw== - dependencies: - "@commitlint/ensure" "^16.2.1" - "@commitlint/message" "^16.2.1" - "@commitlint/to-lines" "^16.2.1" - "@commitlint/types" "^16.2.1" - execa "^5.0.0" - -"@commitlint/to-lines@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-16.2.1.tgz#42d000f34dc0406f514991e86237fdab5e8affd0" - integrity sha512-9/VjpYj5j1QeY3eiog1zQWY6axsdWAc0AonUUfyZ7B0MVcRI0R56YsHAfzF6uK/g/WwPZaoe4Lb1QCyDVnpVaQ== - -"@commitlint/top-level@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/top-level/-/top-level-16.2.1.tgz#bdaa53ab3d8970e0288879f1a342a8c2dfe01583" - integrity sha512-lS6GSieHW9y6ePL73ied71Z9bOKyK+Ib9hTkRsB8oZFAyQZcyRwq2w6nIa6Fngir1QW51oKzzaXfJL94qwImyw== - dependencies: - find-up "^5.0.0" - -"@commitlint/types@^12.1.4": - version "12.1.4" - resolved "https://registry.npmjs.org/@commitlint/types/-/types-12.1.4.tgz#9618a5dc8991fb58e6de6ed89d7bf712fa74ba7e" - integrity sha512-KRIjdnWNUx6ywz+SJvjmNCbQKcKP6KArhjZhY2l+CWKxak0d77SOjggkMwFTiSgLODOwmuLTbarR2ZfWPiPMlw== - dependencies: - chalk "^4.0.0" - -"@commitlint/types@^16.2.1": - version "16.2.1" - resolved "https://registry.npmjs.org/@commitlint/types/-/types-16.2.1.tgz#f25d373b88b01e51fc3fa44488101361945a61bd" - integrity sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA== - dependencies: - chalk "^4.0.0" - -"@cspotcode/source-map-consumer@0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz#33bf4b7b39c178821606f669bbc447a6a629786b" - integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg== - -"@cspotcode/source-map-support@0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz#4789840aa859e46d2f3173727ab707c66bf344f5" - integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA== - dependencies: - "@cspotcode/source-map-consumer" "0.8.0" - -"@discoveryjs/json-ext@^0.5.0": - version "0.5.2" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" - integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== - -"@eslint/eslintrc@^0.4.3": - version "0.4.3" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" - integrity sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw== - dependencies: - ajv "^6.12.4" - debug "^4.1.1" - espree "^7.3.0" - globals "^13.9.0" - ignore "^4.0.6" - import-fresh "^3.2.1" - js-yaml "^3.13.1" - minimatch "^3.0.4" - strip-json-comments "^3.1.1" - -"@gar/promisify@^1.1.3": - version "1.1.3" - resolved "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" - integrity sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw== - -"@humanwhocodes/config-array@^0.5.0": - version "0.5.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" - integrity sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg== - dependencies: - "@humanwhocodes/object-schema" "^1.2.0" - debug "^4.1.1" - minimatch "^3.0.4" - -"@humanwhocodes/object-schema@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz#87de7af9c231826fdd68ac7258f77c429e0e5fcf" - integrity sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w== - -"@hutson/parse-repository-url@^3.0.0": - version "3.0.2" - resolved "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz#98c23c950a3d9b6c8f0daed06da6c3af06981340" - integrity sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== - -"@isaacs/cliui@^8.0.2": - version "8.0.2" - resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" - integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== - dependencies: - string-width "^5.1.2" - string-width-cjs "npm:string-width@^4.2.0" - strip-ansi "^7.0.1" - strip-ansi-cjs "npm:strip-ansi@^6.0.1" - wrap-ansi "^8.1.0" - wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" - -"@isaacs/string-locale-compare@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" - integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== - -"@istanbuljs/load-nyc-config@^1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.0.0.tgz#10602de5570baea82f8afbfa2630b24e7a8cfe5b" - integrity sha512-ZR0rq/f/E4f4XcgnDvtMWXCUJpi8eO0rssVhmztsZqLIEFA9UUP9zmpE0VxlM+kv/E1ul2I876Fwil2ayptDVg== - dependencies: - camelcase "^5.3.1" - find-up "^4.1.0" - js-yaml "^3.13.1" - resolve-from "^5.0.0" - -"@istanbuljs/schema@^0.1.2": - version "0.1.2" - resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz#26520bf09abe4a5644cd5414e37125a8954241dd" - integrity sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw== - -"@jest/console@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba" - integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - -"@jest/core@^27.3.1", "@jest/core@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz#267ac5f704e09dc52de2922cbf3af9edcd64b626" - integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/reporters" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.8.1" - exit "^0.1.2" - graceful-fs "^4.2.9" - jest-changed-files "^27.5.1" - jest-config "^27.5.1" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-resolve-dependencies "^27.5.1" - jest-runner "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - jest-watcher "^27.5.1" - micromatch "^4.0.4" - rimraf "^3.0.0" - slash "^3.0.0" - strip-ansi "^6.0.0" - -"@jest/environment@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz#d7425820511fe7158abbecc010140c3fd3be9c74" - integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== - dependencies: - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - -"@jest/fake-timers@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz#76979745ce0579c8a94a4678af7a748eda8ada74" - integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== - dependencies: - "@jest/types" "^27.5.1" - "@sinonjs/fake-timers" "^8.0.1" - "@types/node" "*" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -"@jest/globals@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz#7ac06ce57ab966566c7963431cef458434601b2b" - integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/types" "^27.5.1" - expect "^27.5.1" - -"@jest/reporters@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz#ceda7be96170b03c923c37987b64015812ffec04" - integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== - dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-haste-map "^27.5.1" - jest-resolve "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - slash "^3.0.0" - source-map "^0.6.0" - string-length "^4.0.1" - terminal-link "^2.0.0" - v8-to-istanbul "^8.1.0" - -"@jest/schemas@^29.4.3": - version "29.4.3" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz#39cf1b8469afc40b6f5a2baaa146e332c4151788" - integrity sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg== - dependencies: - "@sinclair/typebox" "^0.25.16" - -"@jest/source-map@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz#6608391e465add4205eae073b55e7f279e04e8cf" - integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== - dependencies: - callsites "^3.0.0" - graceful-fs "^4.2.9" - source-map "^0.6.0" - -"@jest/test-result@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz#56a6585fa80f7cdab72b8c5fc2e871d03832f5bb" - integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== - dependencies: - "@jest/console" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-sequencer@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz#4057e0e9cea4439e544c6353c6affe58d095745b" - integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== - dependencies: - "@jest/test-result" "^27.5.1" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-runtime "^27.5.1" - -"@jest/transform@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz#6c3501dcc00c4c08915f292a600ece5ecfe1f409" - integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== - dependencies: - "@babel/core" "^7.1.0" - "@jest/types" "^27.5.1" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-regex-util "^27.5.1" - jest-util "^27.5.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - source-map "^0.6.1" - write-file-atomic "^3.0.0" - -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/source-map@^0.3.2": - version "0.3.2" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb" - integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/trace-mapping@^0.3.0": - version "0.3.4" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.4.tgz#f6a0832dffd5b8a6aaa633b7d9f8e8e94c83a0c3" - integrity sha512-vFv9ttIedivx0ux3QSjhgtCVjPZd5l46ZOMDSCwnH1yUO2e964gO8LZGyv2QkqcgR6TnBU1v+1IFqmeoG+0UJQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/trace-mapping@^0.3.17": - version "0.3.18" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz#25783b2086daf6ff1dcb53c9249ae480e4dd4cd6" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.14" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" - integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@kwsites/file-exists@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99" - integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw== - dependencies: - debug "^4.1.1" - -"@kwsites/promise-deferred@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919" - integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw== - -"@lerna/child-process@6.6.2": - version "6.6.2" - resolved "https://registry.npmjs.org/@lerna/child-process/-/child-process-6.6.2.tgz#5d803c8dee81a4e013dc428292e77b365cba876c" - integrity sha512-QyKIWEnKQFnYu2ey+SAAm1A5xjzJLJJj3bhIZd3QKyXKKjaJ0hlxam/OsWSltxTNbcyH1jRJjC6Cxv31usv0Ag== - dependencies: - chalk "^4.1.0" - execa "^5.0.0" - strong-log-transformer "^2.1.0" - -"@lerna/create@6.6.2": - version "6.6.2" - resolved "https://registry.npmjs.org/@lerna/create/-/create-6.6.2.tgz#39a36d80cddb355340c297ed785aa76f4498177f" - integrity sha512-xQ+1Y7D+9etvUlE+unhG/TwmM6XBzGIdFBaNoW8D8kyOa9M2Jf3vdEtAxVa7mhRz66CENfhL/+I/QkVaa7pwbQ== - dependencies: - "@lerna/child-process" "6.6.2" - dedent "^0.7.0" - fs-extra "^9.1.0" - init-package-json "^3.0.2" - npm-package-arg "8.1.1" - p-reduce "^2.1.0" - pacote "15.1.1" - pify "^5.0.0" - semver "^7.3.4" - slash "^3.0.0" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" - yargs-parser "20.2.4" - -"@lerna/legacy-package-management@6.6.2": - version "6.6.2" - resolved "https://registry.npmjs.org/@lerna/legacy-package-management/-/legacy-package-management-6.6.2.tgz#411c395e72e563ab98f255df77e4068627a85bb0" - integrity sha512-0hZxUPKnHwehUO2xC4ldtdX9bW0W1UosxebDIQlZL2STnZnA2IFmIk2lJVUyFW+cmTPQzV93jfS0i69T9Z+teg== - dependencies: - "@npmcli/arborist" "6.2.3" - "@npmcli/run-script" "4.1.7" - "@nrwl/devkit" ">=15.5.2 < 16" - "@octokit/rest" "19.0.3" - byte-size "7.0.0" - chalk "4.1.0" - clone-deep "4.0.1" - cmd-shim "5.0.0" - columnify "1.6.0" - config-chain "1.1.12" - conventional-changelog-core "4.2.4" - conventional-recommended-bump "6.1.0" - cosmiconfig "7.0.0" - dedent "0.7.0" - dot-prop "6.0.1" - execa "5.0.0" - file-url "3.0.0" - find-up "5.0.0" - fs-extra "9.1.0" - get-port "5.1.1" - get-stream "6.0.0" - git-url-parse "13.1.0" - glob-parent "5.1.2" - globby "11.1.0" - graceful-fs "4.2.10" - has-unicode "2.0.1" - inquirer "8.2.4" - is-ci "2.0.0" - is-stream "2.0.0" - libnpmpublish "7.1.4" - load-json-file "6.2.0" - make-dir "3.1.0" - minimatch "3.0.5" - multimatch "5.0.0" - node-fetch "2.6.7" - npm-package-arg "8.1.1" - npm-packlist "5.1.1" - npm-registry-fetch "14.0.3" - npmlog "6.0.2" - p-map "4.0.0" - p-map-series "2.1.0" - p-queue "6.6.2" - p-waterfall "2.1.1" - pacote "15.1.1" - pify "5.0.0" - pretty-format "29.4.3" - read-cmd-shim "3.0.0" - read-package-json "5.0.1" - resolve-from "5.0.0" - semver "7.3.8" - signal-exit "3.0.7" - slash "3.0.0" - ssri "9.0.1" - strong-log-transformer "2.1.0" - tar "6.1.11" - temp-dir "1.0.0" - tempy "1.0.0" - upath "2.0.1" - uuid "8.3.2" - write-file-atomic "4.0.1" - write-pkg "4.0.0" - yargs "16.2.0" - -"@microsoft/api-documenter@^7.13.54": - version "7.13.54" - resolved "https://registry.npmjs.org/@microsoft/api-documenter/-/api-documenter-7.13.54.tgz#d6eacf912250e57c36589650b84443868cdc2a09" - integrity sha512-Ar1e2xcQzGhl3W6z2I6a5cS+a5yXMbZP4cThzwrOR+Vc4rfgQnIQnuZWYPVKdU5UejCgLvUwc8LDMPisUleJQQ== - dependencies: - "@microsoft/api-extractor-model" "7.13.9" - "@microsoft/tsdoc" "0.13.2" - "@rushstack/node-core-library" "3.41.0" - "@rushstack/ts-command-line" "4.9.1" - colors "~1.2.1" - js-yaml "~3.13.1" - resolve "~1.17.0" - -"@microsoft/api-extractor-model@7.13.17": - version "7.13.17" - resolved "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.13.17.tgz#ea77c206984f62ee1d538ef2164e21c0e70a006e" - integrity sha512-XKP2NsUm2asriB6DshODfSRxYXwSBnA2VA51dVgxJnUE0OnBSZTc2rwzN6mDUJT72JGN081QG99eWA2SutOjIg== - dependencies: - "@microsoft/tsdoc" "0.13.2" - "@microsoft/tsdoc-config" "~0.15.2" - "@rushstack/node-core-library" "3.44.0" - -"@microsoft/api-extractor-model@7.13.9": - version "7.13.9" - resolved "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.13.9.tgz#018fb37ac0147595832e13db17509f6adafbad9c" - integrity sha512-t/XKTr8MlHRWgDr1fkyCzTQRR5XICf/WzIFs8yw1JLU8Olw99M3by4/dtpOZNskfqoW+J8NwOxovduU2csi4Ww== - dependencies: - "@microsoft/tsdoc" "0.13.2" - "@microsoft/tsdoc-config" "~0.15.2" - "@rushstack/node-core-library" "3.41.0" - -"@microsoft/api-extractor@^7.18.11": - version "7.18.20" - resolved "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.18.20.tgz#ab65df94ed5bc6aab53612fc0a6a93cbdeef1610" - integrity sha512-JBstlWs5/MC1IiXSMAwOUnX1hV/IcCl75xF6OUhR2LB7ckZWcsKIbhLecjHC+TZRQsRqVGA3u+DJgB7BIWWYcA== - dependencies: - "@microsoft/api-extractor-model" "7.13.17" - "@microsoft/tsdoc" "0.13.2" - "@microsoft/tsdoc-config" "~0.15.2" - "@rushstack/node-core-library" "3.44.0" - "@rushstack/rig-package" "0.3.5" - "@rushstack/ts-command-line" "4.10.4" - colors "~1.2.1" - lodash "~4.17.15" - resolve "~1.17.0" - semver "~7.3.0" - source-map "~0.6.1" - typescript "~4.4.2" - -"@microsoft/tsdoc-config@~0.15.2": - version "0.15.2" - resolved "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.15.2.tgz#eb353c93f3b62ab74bdc9ab6f4a82bcf80140f14" - integrity sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA== - dependencies: - "@microsoft/tsdoc" "0.13.2" - ajv "~6.12.6" - jju "~1.4.0" - resolve "~1.19.0" - -"@microsoft/tsdoc@0.13.2": - version "0.13.2" - resolved "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.13.2.tgz#3b0efb6d3903bd49edb073696f60e90df08efb26" - integrity sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg== - -"@nodelib/fs.scandir@2.1.3": - version "2.1.3" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz#3a582bdb53804c6ba6d146579c46e52130cf4a3b" - integrity sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw== - dependencies: - "@nodelib/fs.stat" "2.0.3" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.3", "@nodelib/fs.stat@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz#34dc5f4cabbc720f4e60f75a747e7ecd6c175bd3" - integrity sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.4" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz#011b9202a70a6366e436ca5c065844528ab04976" - integrity sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ== - dependencies: - "@nodelib/fs.scandir" "2.1.3" - fastq "^1.6.0" - -"@npmcli/arborist@6.2.3": - version "6.2.3" - resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-6.2.3.tgz#31f8aed2588341864d3811151d929c01308f8e71" - integrity sha512-lpGOC2ilSJXcc2zfW9QtukcCTcMbl3fVI0z4wvFB2AFIl0C+Q6Wv7ccrpdrQa8rvJ1ZVuc6qkX7HVTyKlzGqKA== - dependencies: - "@isaacs/string-locale-compare" "^1.1.0" - "@npmcli/fs" "^3.1.0" - "@npmcli/installed-package-contents" "^2.0.0" - "@npmcli/map-workspaces" "^3.0.2" - "@npmcli/metavuln-calculator" "^5.0.0" - "@npmcli/name-from-folder" "^2.0.0" - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/package-json" "^3.0.0" - "@npmcli/query" "^3.0.0" - "@npmcli/run-script" "^6.0.0" - bin-links "^4.0.1" - cacache "^17.0.4" - common-ancestor-path "^1.0.1" - hosted-git-info "^6.1.1" - json-parse-even-better-errors "^3.0.0" - json-stringify-nice "^1.1.4" - minimatch "^6.1.6" - nopt "^7.0.0" - npm-install-checks "^6.0.0" - npm-package-arg "^10.1.0" - npm-pick-manifest "^8.0.1" - npm-registry-fetch "^14.0.3" - npmlog "^7.0.1" - pacote "^15.0.8" - parse-conflict-json "^3.0.0" - proc-log "^3.0.0" - promise-all-reject-late "^1.0.0" - promise-call-limit "^1.0.1" - read-package-json-fast "^3.0.2" - semver "^7.3.7" - ssri "^10.0.1" - treeverse "^3.0.0" - walk-up-path "^1.0.0" - -"@npmcli/fs@^2.1.0": - version "2.1.2" - resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz#a9e2541a4a2fec2e69c29b35e6060973da79b865" - integrity sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ== - dependencies: - "@gar/promisify" "^1.1.3" - semver "^7.3.5" - -"@npmcli/fs@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" - integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== - dependencies: - semver "^7.3.5" - -"@npmcli/git@^4.0.0": - version "4.0.4" - resolved "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz#cdf74f21b1d440c0756fb28159d935129d9daa33" - integrity sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg== - dependencies: - "@npmcli/promise-spawn" "^6.0.0" - lru-cache "^7.4.4" - npm-pick-manifest "^8.0.0" - proc-log "^3.0.0" - promise-inflight "^1.0.1" - promise-retry "^2.0.1" - semver "^7.3.5" - which "^3.0.0" - -"@npmcli/installed-package-contents@^2.0.0", "@npmcli/installed-package-contents@^2.0.1": - version "2.0.2" - resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" - integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== - dependencies: - npm-bundled "^3.0.0" - npm-normalize-package-bin "^3.0.0" - -"@npmcli/map-workspaces@^3.0.2": - version "3.0.4" - resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" - integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== - dependencies: - "@npmcli/name-from-folder" "^2.0.0" - glob "^10.2.2" - minimatch "^9.0.0" - read-package-json-fast "^3.0.0" - -"@npmcli/metavuln-calculator@^5.0.0": - version "5.0.1" - resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" - integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== - dependencies: - cacache "^17.0.0" - json-parse-even-better-errors "^3.0.0" - pacote "^15.0.0" - semver "^7.3.5" - -"@npmcli/move-file@^2.0.0": - version "2.0.1" - resolved "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz#26f6bdc379d87f75e55739bab89db525b06100e4" - integrity sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ== - dependencies: - mkdirp "^1.0.4" - rimraf "^3.0.2" - -"@npmcli/name-from-folder@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" - integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== - -"@npmcli/node-gyp@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-2.0.0.tgz#8c20e53e34e9078d18815c1d2dda6f2420d75e35" - integrity sha512-doNI35wIe3bBaEgrlPfdJPaCpUR89pJWep4Hq3aRdh6gKazIVWfs0jHttvSSoq47ZXgC7h73kDsUl8AoIQUB+A== - -"@npmcli/node-gyp@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" - integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== - -"@npmcli/package-json@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-3.0.0.tgz#c9219a197e1be8dbf43c4ef8767a72277c0533b6" - integrity sha512-NnuPuM97xfiCpbTEJYtEuKz6CFbpUHtaT0+5via5pQeI25omvQDFbp1GcGJ/c4zvL/WX0qbde6YiLgfZbWFgvg== - dependencies: - json-parse-even-better-errors "^3.0.0" - -"@npmcli/promise-spawn@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-3.0.0.tgz#53283b5f18f855c6925f23c24e67c911501ef573" - integrity sha512-s9SgS+p3a9Eohe68cSI3fi+hpcZUmXq5P7w0kMlAsWVtR7XbK3ptkZqKT2cK1zLDObJ3sR+8P59sJE0w/KTL1g== - dependencies: - infer-owner "^1.0.4" - -"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": - version "6.0.2" - resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" - integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== - dependencies: - which "^3.0.0" - -"@npmcli/query@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@npmcli/query/-/query-3.0.0.tgz#51a0dfb85811e04f244171f164b6bc83b36113a7" - integrity sha512-MFNDSJNgsLZIEBVZ0Q9w9K7o07j5N4o4yjtdz2uEpuCZlXGMuPENiRaFYk0vRqAA64qVuUQwC05g27fRtfUgnA== - dependencies: - postcss-selector-parser "^6.0.10" - -"@npmcli/run-script@4.1.7": - version "4.1.7" - resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-4.1.7.tgz#b1a2f57568eb738e45e9ea3123fb054b400a86f7" - integrity sha512-WXr/MyM4tpKA4BotB81NccGAv8B48lNH0gRoILucbcAhTQXLCoi6HflMV3KdXubIqvP9SuLsFn68Z7r4jl+ppw== - dependencies: - "@npmcli/node-gyp" "^2.0.0" - "@npmcli/promise-spawn" "^3.0.0" - node-gyp "^9.0.0" - read-package-json-fast "^2.0.3" - which "^2.0.2" - -"@npmcli/run-script@^6.0.0": - version "6.0.2" - resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" - integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== - dependencies: - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/promise-spawn" "^6.0.0" - node-gyp "^9.0.0" - read-package-json-fast "^3.0.0" - which "^3.0.0" - -"@nrwl/cli@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/cli/-/cli-15.9.4.tgz#63b600dff1cdc126f234d16978a888f72c22a00c" - integrity sha512-FoiGFCLpb/r4HXCM3KYqT0xteP+MRV6bIHjz3bdPHIDLmBNQQnRRaV2K47jtJ6zjh1eOU5UHKyDtDDYf80Idpw== - dependencies: - nx "15.9.4" - -"@nrwl/devkit@>=15.5.2 < 16": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/devkit/-/devkit-15.9.4.tgz#3f0a43a9637fcd0a46c06df2a9c36012b27f006b" - integrity sha512-mUX1kXTuPMdTzFxIzH+MsSNvdppOmstPDOEtiGFZJTuJ625ki0HhNJILO3N2mJ7MeMrLqIlAiNdvelQaObxYsQ== - dependencies: - ejs "^3.1.7" - ignore "^5.0.4" - semver "7.3.4" - tmp "~0.2.1" - tslib "^2.3.0" - -"@nrwl/nx-darwin-arm64@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-darwin-arm64/-/nx-darwin-arm64-15.9.4.tgz#e5a2f39d42a60397a01140a251f894788f5d1fda" - integrity sha512-XnvrnT9BJsgThY/4xUcYtE077ERq/img8CkRj7MOOBNOh0/nVcR4LGbBKDHtwE3HPk0ikyS/SxRyNa9msvi3QQ== - -"@nrwl/nx-darwin-x64@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-darwin-x64/-/nx-darwin-x64-15.9.4.tgz#97a810d4ff6b4bf395a43e4740890c0def2372da" - integrity sha512-WKSfSlpVMLchpXkax0geeUNyhvNxwO7qUz/s0/HJWBekt8fizwKDwDj1gP7fOu+YWb/tHiSscbR1km8PtdjhQw== - -"@nrwl/nx-linux-arm-gnueabihf@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-15.9.4.tgz#b8dd23b8c755b7e640d744945ab2dec3fd3eda65" - integrity sha512-a/b4PP7lP/Cgrh0LjC4O2YTt5pyf4DQTGtuE8qlo8o486UiofCtk4QGJX72q80s23L0ejCaKY2ULKx/3zMLjuA== - -"@nrwl/nx-linux-arm64-gnu@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-15.9.4.tgz#5bc150c2bdb2e0a2eaf8721b3c5fdb2eb93f8739" - integrity sha512-ibBV8fMhSfLVd/2WzcDuUm32BoZsattuKkvMmOoyU6Pzoznc3AqyDjJR4xCIoAn5Rf+Nu1oeQONr5FAtb1Ugow== - -"@nrwl/nx-linux-arm64-musl@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-linux-arm64-musl/-/nx-linux-arm64-musl-15.9.4.tgz#df2f18f813828000dc52f1b7668339947b1a0862" - integrity sha512-iIjvVYd7+uM4jVD461+PvU5XTALgSvJOODUaMRGOoDl0KlMuTe6pQZlw0eXjl5rcTd6paKaVFWT5j6awr8kj7w== - -"@nrwl/nx-linux-x64-gnu@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-linux-x64-gnu/-/nx-linux-x64-gnu-15.9.4.tgz#55547b07e6aeb0c36a43e05bd07c15b013f2de9f" - integrity sha512-q4OyH72mdrE4KellBWtwpr5EwfxHKNoFP9//7FAILO68ROh0rpMd7YQMlTB7T04UEUHjKEEsFGTlVXIee3Viwg== - -"@nrwl/nx-linux-x64-musl@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-linux-x64-musl/-/nx-linux-x64-musl-15.9.4.tgz#29cd644736f643566d9c0e1a1171c49a62a08c09" - integrity sha512-67+/XNMR1CgLPyeGX8jqSG6l8yYD0iiwUgcu1Vaxq6N05WwnqVisIW8XzLSRUtKt4WyVQgOWk3aspImpMVOG3Q== - -"@nrwl/nx-win32-arm64-msvc@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-15.9.4.tgz#55a38bf5dc201e9088729fb03e505dc63caf8b3a" - integrity sha512-2rEsq3eOGVCYpYJn2tTJkOGNJm/U8rP/FmqtZXYa6VJv/00XP3Gl00IXFEDaYV6rZo7SWqLxtEPUbjK5LwPzZA== - -"@nrwl/nx-win32-x64-msvc@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/nx-win32-x64-msvc/-/nx-win32-x64-msvc-15.9.4.tgz#56bb859bfe47d08d14f8d5822d9a31d9098d95a9" - integrity sha512-bogVju4Z/hy1jbppqaTNbmV1R4Kg0R5fKxXAXC2LaL7FL0dup31wPumdV+mXttXBNOBDjV8V/Oz1ZqdmxpOJUw== - -"@nrwl/tao@15.9.4": - version "15.9.4" - resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-15.9.4.tgz#5e384af06d1fb68e326eda2c6a5d8f99ce1583b8" - integrity sha512-m90iz8UsXx1rgPm1dxsBQjSrCViWYZIrp8bpwjSCW24j3kifyilYSXGuKaRwZwUn7eNmH/kZcI9/8qeGIPF4Sg== - dependencies: - nx "15.9.4" - -"@octokit/auth-token@^3.0.0": - version "3.0.3" - resolved "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.3.tgz#ce7e48a3166731f26068d7a7a7996b5da58cbe0c" - integrity sha512-/aFM2M4HVDBT/jjDBa84sJniv1t9Gm/rLkalaz9htOm+L+8JMj1k9w0CkUdcxNyNxZPlTxKPVko+m1VlM58ZVA== - dependencies: - "@octokit/types" "^9.0.0" - -"@octokit/core@^4.0.0": - version "4.2.0" - resolved "https://registry.npmjs.org/@octokit/core/-/core-4.2.0.tgz#8c253ba9605aca605bc46187c34fcccae6a96648" - integrity sha512-AgvDRUg3COpR82P7PBdGZF/NNqGmtMq2NiPqeSsDIeCfYFOZ9gddqWNQHnFdEUf+YwOj4aZYmJnlPp7OXmDIDg== - dependencies: - "@octokit/auth-token" "^3.0.0" - "@octokit/graphql" "^5.0.0" - "@octokit/request" "^6.0.0" - "@octokit/request-error" "^3.0.0" - "@octokit/types" "^9.0.0" - before-after-hook "^2.2.0" - universal-user-agent "^6.0.0" - -"@octokit/endpoint@^7.0.0": - version "7.0.5" - resolved "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.5.tgz#2bb2a911c12c50f10014183f5d596ce30ac67dd1" - integrity sha512-LG4o4HMY1Xoaec87IqQ41TQ+glvIeTKqfjkCEmt5AIwDZJwQeVZFIEYXrYY6yLwK+pAScb9Gj4q+Nz2qSw1roA== - dependencies: - "@octokit/types" "^9.0.0" - is-plain-object "^5.0.0" - universal-user-agent "^6.0.0" - -"@octokit/graphql@^5.0.0": - version "5.0.5" - resolved "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.5.tgz#a4cb3ea73f83b861893a6370ee82abb36e81afd2" - integrity sha512-Qwfvh3xdqKtIznjX9lz2D458r7dJPP8l6r4GQkIdWQouZwHQK0mVT88uwiU2bdTU2OtT1uOlKpRciUWldpG0yQ== - dependencies: - "@octokit/request" "^6.0.0" - "@octokit/types" "^9.0.0" - universal-user-agent "^6.0.0" - -"@octokit/openapi-types@^12.11.0": - version "12.11.0" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz#da5638d64f2b919bca89ce6602d059f1b52d3ef0" - integrity sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ== - -"@octokit/openapi-types@^14.0.0": - version "14.0.0" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz#949c5019028c93f189abbc2fb42f333290f7134a" - integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw== - -"@octokit/openapi-types@^17.1.1": - version "17.1.1" - resolved "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-17.1.1.tgz#b046979537d4209954206d29fbf9fe6893c5acec" - integrity sha512-/X7Gh/qWiWaooJmUnYD48SYy72fyrk2ceisOSe89JojK7r0j8YrTwYpDi76kI+c6QiqX1KSgdoBTMJvktsDkYw== - -"@octokit/plugin-enterprise-rest@6.0.1": - version "6.0.1" - resolved "https://registry.npmjs.org/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" - integrity sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== - -"@octokit/plugin-paginate-rest@^3.0.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-3.1.0.tgz#86f8be759ce2d6d7c879a31490fd2f7410b731f0" - integrity sha512-+cfc40pMzWcLkoDcLb1KXqjX0jTGYXjKuQdFQDc6UAknISJHnZTiBqld6HDwRJvD4DsouDKrWXNbNV0lE/3AXA== - dependencies: - "@octokit/types" "^6.41.0" - -"@octokit/plugin-request-log@^1.0.4": - version "1.0.4" - resolved "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" - integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== - -"@octokit/plugin-rest-endpoint-methods@^6.0.0": - version "6.8.1" - resolved "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.8.1.tgz#97391fda88949eb15f68dc291957ccbe1d3e8ad1" - integrity sha512-QrlaTm8Lyc/TbU7BL/8bO49vp+RZ6W3McxxmmQTgYxf2sWkO8ZKuj4dLhPNJD6VCUW1hetCmeIM0m6FTVpDiEg== - dependencies: - "@octokit/types" "^8.1.1" - deprecation "^2.3.1" - -"@octokit/request-error@^3.0.0": - version "3.0.3" - resolved "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" - integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== - dependencies: - "@octokit/types" "^9.0.0" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request@^6.0.0": - version "6.2.3" - resolved "https://registry.npmjs.org/@octokit/request/-/request-6.2.3.tgz#76d5d6d44da5c8d406620a4c285d280ae310bdb4" - integrity sha512-TNAodj5yNzrrZ/VxP+H5HiYaZep0H3GU0O7PaF+fhDrt8FPrnkei9Aal/txsN/1P7V3CPiThG0tIvpPDYUsyAA== - dependencies: - "@octokit/endpoint" "^7.0.0" - "@octokit/request-error" "^3.0.0" - "@octokit/types" "^9.0.0" - is-plain-object "^5.0.0" - node-fetch "^2.6.7" - universal-user-agent "^6.0.0" - -"@octokit/rest@19.0.3": - version "19.0.3" - resolved "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.3.tgz#b9a4e8dc8d53e030d611c053153ee6045f080f02" - integrity sha512-5arkTsnnRT7/sbI4fqgSJ35KiFaN7zQm0uQiQtivNQLI8RQx8EHwJCajcTUwmaCMNDg7tdCvqAnc7uvHHPxrtQ== - dependencies: - "@octokit/core" "^4.0.0" - "@octokit/plugin-paginate-rest" "^3.0.0" - "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^6.0.0" - -"@octokit/types@^6.41.0": - version "6.41.0" - resolved "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz#e58ef78d78596d2fb7df9c6259802464b5f84a04" - integrity sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg== - dependencies: - "@octokit/openapi-types" "^12.11.0" - -"@octokit/types@^8.1.1": - version "8.2.1" - resolved "https://registry.npmjs.org/@octokit/types/-/types-8.2.1.tgz#a6de091ae68b5541f8d4fcf9a12e32836d4648aa" - integrity sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw== - dependencies: - "@octokit/openapi-types" "^14.0.0" - -"@octokit/types@^9.0.0": - version "9.2.1" - resolved "https://registry.npmjs.org/@octokit/types/-/types-9.2.1.tgz#34ab724b66ffbe210604593127bb47fd044abbc7" - integrity sha512-Vx4keMiD/CAiwVFasLcH0xBSVbKIHebIZke9i7ZbUWGNN4vJFWSYH6Nvga7UY9NIJCGa6x3QG849XTbi5wYmkA== - dependencies: - "@octokit/openapi-types" "^17.1.1" - -"@parcel/watcher@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz#f300fef4cc38008ff4b8c29d92588eced3ce014b" - integrity sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg== - dependencies: - node-addon-api "^3.2.1" - node-gyp-build "^4.3.0" - -"@phenomnomnominal/commitlint-plugin@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@phenomnomnominal/commitlint-plugin/-/commitlint-plugin-1.1.1.tgz#ea96cfc07488efba06d4bd028ebeb14d92da6b85" - integrity sha512-r5eWiv3SScWGe1a790sHczz4XIjuZ9hFWNu4JCUuZ/5K8LkvfiN8fA+AyoqPd4/mGIgw/6rKDNgi0K0ddVrlig== - -"@phenomnomnominal/debug@^0.2.5": - version "0.2.5" - resolved "https://registry.npmjs.org/@phenomnomnominal/debug/-/debug-0.2.5.tgz#cf7931acd4fa1782b47641b67d5cd49e5ae8c844" - integrity sha512-5yAKsIqcvKUiTYfsEXTt6wiNW2jWVEpa6ej8RSPSRV681av1APBK+2BpEIdOo9DAmq2bwq45Ry3zi/wxBjndaQ== - dependencies: - callsite "^1.0.0" - esprima "^4.0.1" - esquery "^1.3.1" - tslib "^2.0.3" - -"@phenomnomnominal/tsquery@^4.1.1": - version "4.2.0" - resolved "https://registry.npmjs.org/@phenomnomnominal/tsquery/-/tsquery-4.2.0.tgz#7742ff4af12ce673b0b601ba5515c934f1876b14" - integrity sha512-hR2U3uVcrrdkuG30ItQ+uFDs4ncZAybxWG0OjTE8ptPzVoU7GVeXpy+vMU8zX9EbmjGeITPw/su5HjYQyAH8bA== - dependencies: - esquery "^1.0.1" - -"@phenomnomnominal/tstemplate@^0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@phenomnomnominal/tstemplate/-/tstemplate-0.1.0.tgz#125b2617fa8cead47433bbf34ba7ef4e30a7c0f2" - integrity sha512-/v+GIVNFHAz4+nQtgy9e5ZAXK3xj6TbP5s9JTpnFuqkcLB+gB2lJ6x/nsDhkKhzR6o4REuzhsYoWYnXqKC/UnQ== - -"@pkgjs/parseargs@^0.11.0": - version "0.11.0" - resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" - integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== - -"@pkgr/utils@^2.3.1": - version "2.4.2" - resolved "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" - -"@rollup/plugin-commonjs@^22.0.0": - version "22.0.0" - resolved "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-22.0.0.tgz#f4d87016e2fbf187a593ab9f46626fe05b59e8bd" - integrity sha512-Ktvf2j+bAO+30awhbYoCaXpBcyPmJbaEUYClQns/+6SNCYFURbvBiNbWgHITEsIgDDWCDUclWRKEuf8cwZCFoQ== - dependencies: - "@rollup/pluginutils" "^3.1.0" - commondir "^1.0.1" - estree-walker "^2.0.1" - glob "^7.1.6" - is-reference "^1.2.1" - magic-string "^0.25.7" - resolve "^1.17.0" - -"@rollup/plugin-json@^4.1.0": - version "4.1.0" - resolved "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz#54e09867ae6963c593844d8bd7a9c718294496f3" - integrity sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw== - dependencies: - "@rollup/pluginutils" "^3.0.8" - -"@rollup/plugin-node-resolve@^13.3.0": - version "13.3.0" - resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-13.3.0.tgz#da1c5c5ce8316cef96a2f823d111c1e4e498801c" - integrity sha512-Lus8rbUo1eEcnS4yTFKLZrVumLPY+YayBdWXgFSHYhTT2iJbMhoaaBL3xl5NCdeRytErGr8tZ0L71BMRmnlwSw== - dependencies: - "@rollup/pluginutils" "^3.1.0" - "@types/resolve" "1.17.1" - deepmerge "^4.2.2" - is-builtin-module "^3.1.0" - is-module "^1.0.0" - resolve "^1.19.0" - -"@rollup/plugin-replace@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-4.0.0.tgz#e34c457d6a285f0213359740b43f39d969b38a67" - integrity sha512-+rumQFiaNac9y64OHtkHGmdjm7us9bo1PlbgQfdihQtuNxzjpaB064HbRnewUOggLQxVCCyINfStkgmBeQpv1g== - dependencies: - "@rollup/pluginutils" "^3.1.0" - magic-string "^0.25.7" - -"@rollup/plugin-typescript@^8.3.2": - version "8.3.2" - resolved "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-8.3.2.tgz#e1b719e2ed3e752bbc092001656c48378f2d15f0" - integrity sha512-MtgyR5LNHZr3GyN0tM7gNO9D0CS+Y+vflS4v/PHmrX17JCkHUYKvQ5jN5o3cz1YKllM3duXUqu3yOHwMPUxhDg== - dependencies: - "@rollup/pluginutils" "^3.1.0" - resolve "^1.17.0" - -"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b" - integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== - dependencies: - "@types/estree" "0.0.39" - estree-walker "^1.0.1" - picomatch "^2.2.2" - -"@rushstack/node-core-library@3.41.0": - version "3.41.0" - resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.41.0.tgz#36f79ecf1a3c9b417690d95bbfcdf40390bf5f51" - integrity sha512-JxdmqR+SHU04jTDaZhltMZL3/XTz2ZZM47DTN+FSPUGUVp6WmxLlvJnT5FoHrOZWUjL/FoIlZUdUPTSXjTjIcg== - dependencies: - "@types/node" "12.20.24" - colors "~1.2.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.17.0" - semver "~7.3.0" - timsort "~0.3.0" - z-schema "~3.18.3" - -"@rushstack/node-core-library@3.44.0": - version "3.44.0" - resolved "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-3.44.0.tgz#481c30a5b5fbaf6eb06f95334b704fe6e1b35b44" - integrity sha512-J+w5efSJjitZoxgtBfU4al0FUx2VIcxpPFUxjIvk7Os2hlGV0VxXLUQWIWdiSL6OGxMSksDlHC9/SHcvBARuvg== - dependencies: - "@types/node" "12.20.24" - colors "~1.2.1" - fs-extra "~7.0.1" - import-lazy "~4.0.0" - jju "~1.4.0" - resolve "~1.17.0" - semver "~7.3.0" - timsort "~0.3.0" - z-schema "~3.18.3" - -"@rushstack/rig-package@0.3.5": - version "0.3.5" - resolved "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.3.5.tgz#7ddab0994647837bab8fdef26f990f1774d82e78" - integrity sha512-CvqWw+E81U5lRBN/lUj7Ngr/XQa/PPb2jAS5QcLP7WL+IMUl+3+Cc2qYrsDoB4zke81kz+usWGmBQpBzGMLmAA== - dependencies: - resolve "~1.17.0" - strip-json-comments "~3.1.1" - -"@rushstack/ts-command-line@4.10.4": - version "4.10.4" - resolved "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.10.4.tgz#05142b74e5cb207d3dd9b935c82f80d7fcb68042" - integrity sha512-4T5ao4UgDb6LmiRj4GumvG3VT/p6RSMgl7TN7S58ifaAGN2GeTNBajFCDdJs9QQP0d/4tA5p0SFzT7Ps5Byirg== - dependencies: - "@types/argparse" "1.0.38" - argparse "~1.0.9" - colors "~1.2.1" - string-argv "~0.3.1" - -"@rushstack/ts-command-line@4.9.1": - version "4.9.1" - resolved "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-4.9.1.tgz#9fe594a408c7ef1b67f57b41ba931ecd3f420e92" - integrity sha512-zzoWB6OqVbMjnxlxbAUqbZqDWITUSHqwFCx7JbH5CVrjR9kcsB4NeWkN1I8GcR92beiOGvO3yPlB2NRo5Ugh+A== - dependencies: - "@types/argparse" "1.0.38" - argparse "~1.0.9" - colors "~1.2.1" - string-argv "~0.3.1" - -"@sigstore/protobuf-specs@^0.1.0": - version "0.1.0" - resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz#957cb64ea2f5ce527cc9cf02a096baeb0d2b99b4" - integrity sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ== - -"@sinclair/typebox@^0.25.16": - version "0.25.24" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz#8c7688559979f7079aacaf31aa881c3aa410b718" - integrity sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ== - -"@sinonjs/commons@^1.7.0": - version "1.7.2" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz#505f55c74e0272b43f6c52d81946bed7058fc0e2" - integrity sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw== - dependencies: - type-detect "4.0.8" - -"@sinonjs/fake-timers@^8.0.1": - version "8.1.0" - resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz#3fdc2b6cb58935b21bfb8d1625eb1300484316e7" - integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== - dependencies: - "@sinonjs/commons" "^1.7.0" - -"@stylelint/postcss-css-in-js@^0.37.2": - version "0.37.2" - resolved "https://registry.npmjs.org/@stylelint/postcss-css-in-js/-/postcss-css-in-js-0.37.2.tgz#7e5a84ad181f4234a2480803422a47b8749af3d2" - integrity sha512-nEhsFoJurt8oUmieT8qy4nk81WRHmJynmVwn/Vts08PL9fhgIsMhk1GId5yAN643OzqEEb5S/6At2TZW7pqPDA== - dependencies: - "@babel/core" ">=7.9.0" - -"@stylelint/postcss-markdown@^0.36.2": - version "0.36.2" - resolved "https://registry.npmjs.org/@stylelint/postcss-markdown/-/postcss-markdown-0.36.2.tgz#0a540c4692f8dcdfc13c8e352c17e7bfee2bb391" - integrity sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ== - dependencies: - remark "^13.0.0" - unist-util-find-all-after "^3.0.2" - -"@tootallnate/once@1": - version "1.1.2" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" - integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== - -"@tootallnate/once@2": - version "2.0.0" - resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" - integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== - -"@tsconfig/node10@^1.0.7": - version "1.0.8" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz#c1e4e80d6f964fbecb3359c43bd48b40f7cadad9" - integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg== - -"@tsconfig/node12@^1.0.7": - version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz#62c1f6dee2ebd9aead80dc3afa56810e58e1a04c" - integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw== - -"@tsconfig/node14@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz#95f2d167ffb9b8d2068b0b235302fafd4df711f2" - integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg== - -"@tsconfig/node16@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" - integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== - -"@tufjs/canonical-json@1.0.0": - version "1.0.0" - resolved "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" - integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== - -"@tufjs/models@1.0.4": - version "1.0.4" - resolved "https://registry.npmjs.org/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" - integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== - dependencies: - "@tufjs/canonical-json" "1.0.0" - minimatch "^9.0.0" - -"@types/argparse@1.0.38": - version "1.0.38" - resolved "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" - integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== - -"@types/babel__code-frame@^7.0.1": - version "7.0.3" - resolved "https://registry.npmjs.org/@types/babel__code-frame/-/babel__code-frame-7.0.3.tgz#eda94e1b7c9326700a4b69c485ebbc9498a0b63f" - integrity sha512-2TN6oiwtNjOezilFVl77zwdNPwQWaDBBCCWWxyo1ctiO3vAtd7H/aB/CBJdw9+kqq3+latD0SXoedIuHySSZWw== - -"@types/babel__core@^7.0.0": - version "7.1.9" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.9.tgz#77e59d438522a6fb898fa43dc3455c6e72f3963d" - integrity sha512-sY2RsIJ5rpER1u3/aQ8OFSI7qGIy8o1NEEbgb2UaJcvOtXOMpd39ko723NBpjQFg9SIX7TXtjejZVGeIMLhoOw== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__core@^7.1.14": - version "7.1.14" - resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" - integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - "@types/babel__generator" "*" - "@types/babel__template" "*" - "@types/babel__traverse" "*" - -"@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== - dependencies: - "@babel/types" "^7.0.0" - -"@types/babel__template@*": - version "7.0.2" - resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== - dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" - -"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18" - integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q== - dependencies: - "@babel/types" "^7.3.0" - -"@types/babel__traverse@^7.0.4": - version "7.0.15" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.15.tgz#db9e4238931eb69ef8aab0ad6523d4d4caa39d03" - integrity sha512-Pzh9O3sTK8V6I1olsXpCfj2k/ygO2q1X0vhhnDrEQyYLHZesWz+zMZMVcwXLCYf0U36EtmyYaFGPfXlTtDHe3A== - dependencies: - "@babel/types" "^7.3.0" - -"@types/callsite@^1.0.32": - version "1.0.32" - resolved "https://registry.npmjs.org/@types/callsite/-/callsite-1.0.32.tgz#597fffd77dd148a01d97f23ce2de0d5554b7000c" - integrity sha512-cYpP9vbWPRlwAoejiH+KvH7RYW9klpVt2Da5rYhnb6K4p9jXt1J2uLSLOds0QmfD/dbnCByUtBCs8s7DSuMczQ== - -"@types/color-name@^1.1.1": - version "1.1.1" - resolved "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" - integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ== - -"@types/dedent@^0.7.0": - version "0.7.0" - resolved "https://registry.npmjs.org/@types/dedent/-/dedent-0.7.0.tgz#155f339ca404e6dd90b9ce46a3f78fd69ca9b050" - integrity sha512-EGlKlgMhnLt/cM4DbUSafFdrkeJoC9Mvnj0PUCU7tFmTjMjNRT957kXCx0wYm3JuEq4o4ZsS5vG+NlkM2DMd2A== - -"@types/eslint-scope@^3.7.3": - version "3.7.3" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz#125b88504b61e3c8bc6f870882003253005c3224" - integrity sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*", "@types/eslint@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-7.28.0.tgz#7e41f2481d301c68e14f483fe10b017753ce8d5a" - integrity sha512-07XlgzX0YJUn4iG1ocY4IX9DzKSmMGUs6ESKlxWhZRaa0fatIWaHWUVapcuGa8r5HFnTqzj+4OCjd5f7EZ/i/A== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*": - version "0.0.50" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz#1e0caa9364d3fccd2931c3ed96fdbeaa5d4cca83" - integrity sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw== - -"@types/estree@0.0.39": - version "0.0.39" - resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f" - integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== - -"@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/fs-extra@^9.0.1": - version "9.0.12" - resolved "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.12.tgz#9b8f27973df8a7a3920e8461517ebf8a7d4fdfaf" - integrity sha512-I+bsBr67CurCGnSenZZ7v94gd3tc3+Aj2taxMT4yu4ABLuOgOjeFxX3dokG24ztSRg5tnT00sL8BszO7gSMoIw== - dependencies: - "@types/node" "*" - -"@types/glob@^7.1.1": - version "7.2.0" - resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" - integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/graceful-fs@^4.1.2", "@types/graceful-fs@^4.1.3": - version "4.1.5" - resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" - integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== - -"@types/istanbul-lib-coverage@2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-coverage@^2.0.1": - version "2.0.2" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" - integrity sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/jest-cli@^24.3.0": - version "24.3.0" - resolved "https://registry.npmjs.org/@types/jest-cli/-/jest-cli-24.3.0.tgz#f8201a0d81e52747850e2217e1af636228b4ab36" - integrity sha512-1Rt38hBjSUhedce8G+0h1uNS7t/EtcsAHJzvp7w/mm0aSlt9B52WaQ5EM3dUb4BmDhobaIqJzuoGxG3FeHav4Q== - dependencies: - jest-cli "*" - -"@types/jest@^27.0.1": - version "27.4.0" - resolved "https://registry.npmjs.org/@types/jest/-/jest-27.4.0.tgz#037ab8b872067cae842a320841693080f9cb84ed" - integrity sha512-gHl8XuC1RZ8H2j5sHv/JqsaxXkDDM9iDOgu0Wp8sjs4u/snb2PVehyWXJPr+ORA0RPpgw231mnutWI1+0hgjIQ== - dependencies: - jest-diff "^27.0.0" - pretty-format "^27.0.0" - -"@types/json-schema@*", "@types/json-schema@^7.0.7": - version "7.0.7" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== - -"@types/json-schema@^7.0.8": - version "7.0.11" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== - -"@types/json-schema@^7.0.9": - version "7.0.10" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.10.tgz#9b05b7896166cd00e9cbd59864853abf65d9ac23" - integrity sha512-BLO9bBq59vW3fxCpD4o0N4U+DXsvwvIcl+jofw0frQo/GrBFC+/jRZj1E7kgp6dvTyNmA4y6JCV5Id/r3mNP5A== - -"@types/json5@^0.0.29": - version "0.0.29" - resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" - integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== - -"@types/lodash.debounce@^4.0.6": - version "4.0.6" - resolved "https://registry.npmjs.org/@types/lodash.debounce/-/lodash.debounce-4.0.6.tgz#c5a2326cd3efc46566c47e4c0aa248dc0ee57d60" - integrity sha512-4WTmnnhCfDvvuLMaF3KV4Qfki93KebocUF45msxhYyjMttZDQYzHkO639ohhk8+oco2cluAFL3t5+Jn4mleylQ== - dependencies: - "@types/lodash" "*" - -"@types/lodash@*": - version "4.14.170" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.170.tgz#0d67711d4bf7f4ca5147e9091b847479b87925d6" - integrity sha512-bpcvu/MKHHeYX+qeEN8GE7DIravODWdACVA1ctevD8CN24RhPZIKMn9ntfAsrvLfSX3cR5RrBKAbYm9bGs0A+Q== - -"@types/mdast@^3.0.0": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.3.tgz#2d7d671b1cd1ea3deb306ea75036c2a0407d2deb" - integrity sha512-SXPBMnFVQg1s00dlMCc/jCdvPqdE4mXaMMCeRlxLDmTAEoegHT53xKtkDnzDTOcmMHUfcjyf36/YYZ6SxRdnsw== - dependencies: - "@types/unist" "*" - -"@types/minimatch@*", "@types/minimatch@^3.0.5": - version "3.0.5" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" - integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== - -"@types/minimatch@^3.0.3": - version "3.0.3" - resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= - -"@types/node@*", "@types/node@>=12", "@types/node@^17.0.23": - version "17.0.23" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz#3b41a6e643589ac6442bdbd7a4a3ded62f33f7da" - integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw== - -"@types/node@12.20.24": - version "12.20.24" - resolved "https://registry.npmjs.org/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" - integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== - -"@types/normalize-package-data@^2.4.0": - version "2.4.0" - resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" - integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/prettier@^2.1.5", "@types/prettier@^2.3.2": - version "2.4.4" - resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.4.tgz#5d9b63132df54d8909fce1c3f8ca260fdd693e17" - integrity sha512-ReVR2rLTV1kvtlWFyuot+d1pkpG2Fw/XKE3PDAdj57rbM97ttSp9JZ2UsP+2EHTylra9cUf6JA7tGwW1INzUrA== - -"@types/prop-types@*": - version "15.7.3" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7" - integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== - -"@types/react@^16.14.26": - version "16.14.26" - resolved "https://registry.npmjs.org/@types/react/-/react-16.14.26.tgz#82540a240ba7207ebe87d9579051bc19c9ef7605" - integrity sha512-c/5CYyciOO4XdFcNhZW1O2woVx86k4T+DO2RorHZL7EhitkNQgSD/SgpdZJAUJa/qjVgOmTM44gHkAdZSXeQuQ== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/resolve@1.17.1": - version "1.17.1" - resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" - integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - version "0.16.1" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.1.tgz#18845205e86ff0038517aab7a18a62a6b9f71275" - integrity sha512-EaCxbanVeyxDRTQBkdLb3Bvl/HK7PBK6UJjsSixB0iHKoWxE5uu2Q/DgtpOhPIojN0Zl1whvOd7PoHs2P0s5eA== - -"@types/stack-utils@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" - integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== - -"@types/stylelint@^13.13.1": - version "13.13.3" - resolved "https://registry.npmjs.org/@types/stylelint/-/stylelint-13.13.3.tgz#29ba9b7179e5632b12853252da191443607d32fc" - integrity sha512-xvYwobi9L69FXbJTimKYRNHyMwtmcJxMd1woI3U822rkW/f7wcZ6fsV1DqYPT+sNaO0qUtngiBhTQfMeItUvUA== - dependencies: - globby "11.x.x" - postcss "7.x.x" - -"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2": - version "2.0.3" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" - integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== - -"@types/vscode@^1.62.0": - version "1.65.0" - resolved "https://registry.npmjs.org/@types/vscode/-/vscode-1.65.0.tgz#042dd8d93c32ac62cb826cd0fa12376069d1f448" - integrity sha512-wQhExnh2nEzpjDMSKhUvnNmz3ucpd3E+R7wJkOhBNK3No6fG3VUdmVmMOKD0A8NDZDDDiQcLNxe3oGmX5SjJ5w== - -"@types/yargs-parser@*": - version "20.2.1" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" - integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== - -"@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== - dependencies: - "@types/yargs-parser" "*" - -"@types/yoga-layout@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@types/yoga-layout/-/yoga-layout-1.9.2.tgz#efaf9e991a7390dc081a0b679185979a83a9639a" - integrity sha512-S9q47ByT2pPvD65IvrWp7qppVMpk9WGMbVq9wbWZOHg6tnXSD4vyhao6nOSBwwfDdV2p3Kx9evA9vI+XWTfDvw== - -"@typescript-eslint/eslint-plugin@^5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.16.0.tgz#78f246dd8d1b528fc5bfca99a8a64d4023a3d86d" - integrity sha512-SJoba1edXvQRMmNI505Uo4XmGbxCK9ARQpkvOd00anxzri9RNQk0DDCxD+LIl+jYhkzOJiOMMKYEHnHEODjdCw== - dependencies: - "@typescript-eslint/scope-manager" "5.16.0" - "@typescript-eslint/type-utils" "5.16.0" - "@typescript-eslint/utils" "5.16.0" - debug "^4.3.2" - functional-red-black-tree "^1.0.1" - ignore "^5.1.8" - regexpp "^3.2.0" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/experimental-utils@^4.0.1": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.27.0.tgz#78192a616472d199f084eab8f10f962c0757cd1c" - integrity sha512-n5NlbnmzT2MXlyT+Y0Jf0gsmAQzCnQSWXKy4RGSXVStjDvS5we9IWbh7qRVKdGcxT0WYlgcCYUK/HRg7xFhvjQ== - dependencies: - "@types/json-schema" "^7.0.7" - "@typescript-eslint/scope-manager" "4.27.0" - "@typescript-eslint/types" "4.27.0" - "@typescript-eslint/typescript-estree" "4.27.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/parser@^5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.16.0.tgz#e4de1bde4b4dad5b6124d3da227347616ed55508" - integrity sha512-fkDq86F0zl8FicnJtdXakFs4lnuebH6ZADDw6CYQv0UZeIjHvmEw87m9/29nk2Dv5Lmdp0zQ3zDQhiMWQf/GbA== - dependencies: - "@typescript-eslint/scope-manager" "5.16.0" - "@typescript-eslint/types" "5.16.0" - "@typescript-eslint/typescript-estree" "5.16.0" - debug "^4.3.2" - -"@typescript-eslint/scope-manager@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.27.0.tgz#b0b1de2b35aaf7f532e89c8e81d0fa298cae327d" - integrity sha512-DY73jK6SEH6UDdzc6maF19AHQJBFVRf6fgAXHPXCGEmpqD4vYgPEzqpFz1lf/daSbOcMpPPj9tyXXDPW2XReAw== - dependencies: - "@typescript-eslint/types" "4.27.0" - "@typescript-eslint/visitor-keys" "4.27.0" - -"@typescript-eslint/scope-manager@5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.16.0.tgz#7e7909d64bd0c4d8aef629cdc764b9d3e1d3a69a" - integrity sha512-P+Yab2Hovg8NekLIR/mOElCDPyGgFZKhGoZA901Yax6WR6HVeGLbsqJkZ+Cvk5nts/dAlFKm8PfL43UZnWdpIQ== - dependencies: - "@typescript-eslint/types" "5.16.0" - "@typescript-eslint/visitor-keys" "5.16.0" - -"@typescript-eslint/type-utils@5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.16.0.tgz#b482bdde1d7d7c0c7080f7f2f67ea9580b9e0692" - integrity sha512-SKygICv54CCRl1Vq5ewwQUJV/8padIWvPgCxlWPGO/OgQLCijY9G7lDu6H+mqfQtbzDNlVjzVWQmeqbLMBLEwQ== - dependencies: - "@typescript-eslint/utils" "5.16.0" - debug "^4.3.2" - tsutils "^3.21.0" - -"@typescript-eslint/types@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.27.0.tgz#712b408519ed699baff69086bc59cd2fc13df8d8" - integrity sha512-I4ps3SCPFCKclRcvnsVA/7sWzh7naaM/b4pBO2hVxnM3wrU51Lveybdw5WoIktU/V4KfXrTt94V9b065b/0+wA== - -"@typescript-eslint/types@5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.16.0.tgz#5827b011982950ed350f075eaecb7f47d3c643ee" - integrity sha512-oUorOwLj/3/3p/HFwrp6m/J2VfbLC8gjW5X3awpQJ/bSG+YRGFS4dpsvtQ8T2VNveV+LflQHjlLvB6v0R87z4g== - -"@typescript-eslint/typescript-estree@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.27.0.tgz#189a7b9f1d0717d5cccdcc17247692dedf7a09da" - integrity sha512-KH03GUsUj41sRLLEy2JHstnezgpS5VNhrJouRdmh6yNdQ+yl8w5LrSwBkExM+jWwCJa7Ct2c8yl8NdtNRyQO6g== - dependencies: - "@typescript-eslint/types" "4.27.0" - "@typescript-eslint/visitor-keys" "4.27.0" - debug "^4.3.1" - globby "^11.0.3" - is-glob "^4.0.1" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/typescript-estree@5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.16.0.tgz#32259459ec62f5feddca66adc695342f30101f61" - integrity sha512-SE4VfbLWUZl9MR+ngLSARptUv2E8brY0luCdgmUevU6arZRY/KxYoLI/3V/yxaURR8tLRN7bmZtJdgmzLHI6pQ== - dependencies: - "@typescript-eslint/types" "5.16.0" - "@typescript-eslint/visitor-keys" "5.16.0" - debug "^4.3.2" - globby "^11.0.4" - is-glob "^4.0.3" - semver "^7.3.5" - tsutils "^3.21.0" - -"@typescript-eslint/utils@5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.16.0.tgz#42218b459d6d66418a4eb199a382bdc261650679" - integrity sha512-iYej2ER6AwmejLWMWzJIHy3nPJeGDuCqf8Jnb+jAQVoPpmWzwQOfa9hWVB8GIQE5gsCv/rfN4T+AYb/V06WseQ== - dependencies: - "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.16.0" - "@typescript-eslint/types" "5.16.0" - "@typescript-eslint/typescript-estree" "5.16.0" - eslint-scope "^5.1.1" - eslint-utils "^3.0.0" - -"@typescript-eslint/visitor-keys@4.27.0": - version "4.27.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.27.0.tgz#f56138b993ec822793e7ebcfac6ffdce0a60cb81" - integrity sha512-es0GRYNZp0ieckZ938cEANfEhsfHrzuLrePukLKtY3/KPXcq1Xd555Mno9/GOgXhKzn0QfkDLVgqWO3dGY80bg== - dependencies: - "@typescript-eslint/types" "4.27.0" - eslint-visitor-keys "^2.0.0" - -"@typescript-eslint/visitor-keys@5.16.0": - version "5.16.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.16.0.tgz#f27dc3b943e6317264c7492e390c6844cd4efbbb" - integrity sha512-jqxO8msp5vZDhikTwq9ubyMHqZ67UIvawohr4qF3KhlpL7gzSjOd+8471H3nh5LyABkaI85laEKKU8SnGUK5/g== - dependencies: - "@typescript-eslint/types" "5.16.0" - eslint-visitor-keys "^3.0.0" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz#db046555d3c413f8966ca50a95176a0e2c642e24" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz#dacbcb95aff135c8260f77fa3b4c5fea600a6431" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz#6132f68c4acd59dcd141c44b18cbebbd9f2fa768" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz#b66d73c43e296fd5e88006f18524feb0f2c7c093" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz#cbce5e7e0c1bd32cf4905ae444ef64cea919f1b5" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz#bb2ebdb3b83aa26d9baad4c46d4315283acd51e9" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz#ff97f3863c55ee7f580fd5c41a381e9def4aa577" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz#bb665c91d0b14fffceb0e38298c329af043c6e3a" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz#70e60e5e82f9ac81118bc25381a0b283893240d7" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz#90f8bc34c561595fe156603be7253cdbcd0fab5a" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz#c72fa8220524c9b416249f3d94c2958dfe70ceab" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz#fb5283e0e8b4551cc4e9c3c0d7184a65faf7c268" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz#d9a22d651248422ca498b09aa3232a81041487c2" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz#bb85378c527df824004812bbdb784eea539174a1" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz#a7bf8dd7e362aeb1668ff43f35cb849f188eff20" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webpack-cli/configtest@^2.1.0": - version "2.1.0" - resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz#b59b33377b1b896a9a7357cfc643b39c1524b1e6" - integrity sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w== - -"@webpack-cli/info@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz#eed745799c910d20081e06e5177c2b2569f166c0" - integrity sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA== - -"@webpack-cli/serve@^2.0.4": - version "2.0.4" - resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz#3982ee6f8b42845437fc4d391e93ac5d9da52f0f" - integrity sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A== - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -"@yarnpkg/lockfile@^1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" - integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== - -"@yarnpkg/parsers@^3.0.0-rc.18": - version "3.0.0-rc.43" - resolved "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.43.tgz#2bf720ec6444e3f002f40dce734c262e9f3d888a" - integrity sha512-AhFF3mIDfA+jEwQv2WMHmiYhOvmdbh2qhUkDVQfiqzQtUwS4BgoWwom5NpSPg4Ix5vOul+w1690Bt21CkVLpgg== - dependencies: - js-yaml "^3.10.0" - tslib "^2.4.0" - -"@zkochan/js-yaml@0.0.6": - version "0.0.6" - resolved "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz#975f0b306e705e28b8068a07737fa46d3fc04826" - integrity sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg== - dependencies: - argparse "^2.0.1" - -JSONStream@^1.0.4: - version "1.3.5" - resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" - integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== - dependencies: - jsonparse "^1.2.0" - through ">=2.2.7 <3" - -abab@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== - -abab@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" - integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== - -abbrev@^1.0.0: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -abbrev@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" - integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== - -abort-controller@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" - integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== - dependencies: - event-target-shim "^5.0.0" - -acorn-globals@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45" - integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== - dependencies: - acorn "^7.1.1" - acorn-walk "^7.1.1" - -acorn-import-assertions@^1.7.6: - version "1.7.6" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.7.6.tgz#580e3ffcae6770eebeec76c3b9723201e9d01f78" - integrity sha512-FlVvVFA1TX6l3lp8VjDnYYq7R1nyW6x3svAt4nDgrWQ9SBaSh9CnbwgSUTasgfNfOG5HlM1ehugCvM+hjo56LA== - -acorn-jsx@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz#fc8661e11b7ac1539c47dbfea2e72b3af34d267b" - integrity sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng== - -acorn-node@^1.6.1: - version "1.8.2" - resolved "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz#114c95d64539e53dede23de8b9d96df7c7ae2af8" - integrity sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A== - dependencies: - acorn "^7.0.0" - acorn-walk "^7.0.0" - xtend "^4.0.2" - -acorn-walk@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc" - integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== - -acorn-walk@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz#345f0dffad5c735e7373d2fec9a1023e6a44b83e" - integrity sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ== - -acorn-walk@^8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz#3ddab7f84e4a7e2313f6c414c5b7dac85f4e3ebc" - integrity sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w== - -acorn@^7.0.0, acorn@^7.1.1, acorn@^7.4.0: - version "7.4.1" - resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" - integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== - -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0: - version "8.8.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8" - integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w== - -acorn@^8.7.1: - version "8.8.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" - integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== - -add-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" - integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= - -agent-base@6, agent-base@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" - integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== - dependencies: - debug "4" - -agentkeepalive@^4.2.1: - version "4.3.0" - resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz#bb999ff07412653c1803b3ced35e50729830a255" - integrity sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg== - dependencies: - debug "^4.1.0" - depd "^2.0.0" - humanize-ms "^1.2.1" - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6, ajv@~6.12.6: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - -ajv@^8.0.1: - version "8.3.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.3.0.tgz#25ee7348e32cdc4a1dbb38256bf6bdc451dd577c" - integrity sha512-RYE7B5An83d7eWnDR8kbdaIFqmKCNsP16ay1hDbJEU+sa0e3H9SebskCt0Uufem6cfAVu7Col6ubcn/W+Sm8/Q== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -ansi-colors@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" - integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== - -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.0: - version "4.3.2" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-regex@^5.0.0, ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz#90ae75c424d008d2624c5bf29ead3177ebfcf359" - integrity sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA== - dependencies: - "@types/color-name" "^1.1.1" - color-convert "^2.0.1" - -ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" - integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== - -ansi-styles@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" - integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@^3.0.3, anymatch@~3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" - integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -"aproba@^1.0.3 || ^2.0.0", aproba@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== - -are-we-there-yet@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" - integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== - dependencies: - delegates "^1.0.0" - readable-stream "^3.6.0" - -are-we-there-yet@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-4.0.0.tgz#3ff397dc14f08b52dd8b2a64d3cee154ab8760d2" - integrity sha512-nSXlV+u3vtVjRgihdTzbfWYzxPWGo424zPgQbHD0ZqIla3jqYAewDcvee0Ua2hjS5IfTAmjGlx1Jf0PKwjZDEw== - dependencies: - delegates "^1.0.0" - readable-stream "^4.1.0" - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -argparse@^1.0.7, argparse@~1.0.9: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== - dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" - -array-differ@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" - integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== - -array-ify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" - integrity sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4= - -array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" - is-string "^1.0.7" - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -array.prototype.flat@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz#ffc6576a7ca3efc2f46a143b9d1dda9b4b3cf5e2" - integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - -arraybuffer.prototype.slice@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz#9b5ea3868a6eebc30273da577eb888381c0044bb" - integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== - dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" - is-shared-array-buffer "^1.0.2" - -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - -arrify@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" - integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" - integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== - -async@^3.2.3: - version "3.2.4" - resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" - integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -auto-bind@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/auto-bind/-/auto-bind-4.0.0.tgz#e3589fc6c2da8f7ca43ba9f84fa52a744fc997fb" - integrity sha512-Hdw8qdNiqdJ8LqT0iK0sVzkFbzg6fhnQqqfWhBDxcHZvU75+B+ayzTy8x+k5Ix0Y92XOhOUlx74ps+bA6BeYMQ== - -autoprefixer@^9.8.6: - version "9.8.6" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz#3b73594ca1bf9266320c5acf1588d74dea74210f" - integrity sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg== - dependencies: - browserslist "^4.12.0" - caniuse-lite "^1.0.30001109" - colorette "^1.2.1" - normalize-range "^0.1.2" - num2fraction "^1.2.2" - postcss "^7.0.32" - postcss-value-parser "^4.1.0" - -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== - -axios@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz#38a7bf1224cd308de271146038b551d725f0be1f" - integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== - dependencies: - follow-redirects "^1.15.0" - form-data "^4.0.0" - proxy-from-env "^1.1.0" - -babel-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz#a1bf8d61928edfefd21da27eb86a695bfd691444" - integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== - dependencies: - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-plugin-istanbul@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" - integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@istanbuljs/load-nyc-config" "^1.0.0" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-instrument "^5.0.4" - test-exclude "^6.0.0" - -babel-plugin-jest-hoist@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz#9be98ecf28c331eb9f5df9c72d6f89deb8181c2e" - integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.0.0" - "@types/babel__traverse" "^7.0.6" - -babel-preset-current-node-syntax@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.0.tgz#cf5feef29551253471cfa82fc8e0f5063df07a77" - integrity sha512-mGkvkpocWJes1CmMKtgGUwCeeq0pOhALyymozzDWYomHTbDLwueDYG6p4TK1YOeYHCzBzYPsWkgTto10JubI1Q== - dependencies: - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-bigint" "^7.8.3" - "@babel/plugin-syntax-class-properties" "^7.8.3" - "@babel/plugin-syntax-import-meta" "^7.8.3" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.8.3" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-top-level-await" "^7.8.3" - -babel-preset-jest@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz#91f10f58034cb7989cb4f962b69fa6eef6a6bc81" - integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== - dependencies: - babel-plugin-jest-hoist "^27.5.1" - babel-preset-current-node-syntax "^1.0.0" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -balanced-match@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz#dc70f920d78db8b858535795867bf48f820633d9" - integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.npmjs.org/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -before-after-hook@^2.2.0: - version "2.2.3" - resolved "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" - integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== - -big-integer@^1.6.17: - version "1.6.48" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" - integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== - -big-integer@^1.6.44: - version "1.6.51" - resolved "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" - integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== - -bin-links@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/bin-links/-/bin-links-4.0.1.tgz#afeb0549e642f61ff889b58ea2f8dca78fb9d8d3" - integrity sha512-bmFEM39CyX336ZGGRsGPlc6jZHriIoHacOQcTt72MktIjpPhZoP4te2jOyUXF3BLILmJ8aNLncoPVeIIFlrDeA== - dependencies: - cmd-shim "^6.0.0" - npm-normalize-package-bin "^3.0.0" - read-cmd-shim "^4.0.0" - write-file-atomic "^5.0.0" - -binary-extensions@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz#23c0df14f6a88077f5f986c0d167ec03c3d5537c" - integrity sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow== - -binary@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" - integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= - dependencies: - buffers "~0.1.1" - chainsaw "~0.1.0" - -bl@^4.0.3, bl@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@~3.4.1: - version "3.4.7" - resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" - integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= - -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -braces@^3.0.1, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -browser-process-hrtime@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" - integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== - -browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.6: - version "4.16.6" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" - integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== - dependencies: - caniuse-lite "^1.0.30001219" - colorette "^1.2.2" - electron-to-chromium "^1.3.723" - escalade "^3.1.1" - node-releases "^1.1.71" - -browserslist@^4.17.5: - version "4.19.1" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz#4ac0435b35ab655896c31d53018b6dd5e9e4c9a3" - integrity sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A== - dependencies: - caniuse-lite "^1.0.30001286" - electron-to-chromium "^1.4.17" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -bs-logger@0.x: - version "0.2.6" - resolved "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" - integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== - dependencies: - fast-json-stable-stringify "2.x" - -bser@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" - integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== - dependencies: - node-int64 "^0.4.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer-indexof-polyfill@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" - integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== - -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" - integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= - -builtin-modules@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz#cae62812b89801e9656336e46223e030386be7b6" - integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== - -builtins@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" - integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= - -builtins@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" - integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== - dependencies: - semver "^7.0.0" - -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - -byte-size@7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/byte-size/-/byte-size-7.0.0.tgz#36528cd1ca87d39bd9abd51f5715dc93b6ceb032" - integrity sha512-NNiBxKgxybMBtWdmvx7ZITJi4ZG+CYUgwOSZTfqB1qogkRHrhbQE/R2r5Fh94X+InN5MCYz6SvB/ejHMj/HbsQ== - -cacache@^16.1.0: - version "16.1.3" - resolved "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz#a02b9f34ecfaf9a78c9f4bc16fceb94d5d67a38e" - integrity sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ== - dependencies: - "@npmcli/fs" "^2.1.0" - "@npmcli/move-file" "^2.0.0" - chownr "^2.0.0" - fs-minipass "^2.1.0" - glob "^8.0.1" - infer-owner "^1.0.4" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - mkdirp "^1.0.4" - p-map "^4.0.0" - promise-inflight "^1.0.1" - rimraf "^3.0.2" - ssri "^9.0.0" - tar "^6.1.11" - unique-filename "^2.0.0" - -cacache@^17.0.0, cacache@^17.0.4: - version "17.1.0" - resolved "https://registry.npmjs.org/cacache/-/cacache-17.1.0.tgz#b7286ef941dafe55b461cdcdceda71cacc1eb98d" - integrity sha512-hXpFU+Z3AfVmNuiLve1qxWHMq0RSIt5gjCKAHi/M6DktwFwDdAXAtunl1i4WSKaaVcU9IsRvXFg42jTHigcC6Q== - dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" - glob "^10.2.2" - lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-collect "^1.0.2" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" - unique-filename "^3.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -cachedir@2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.2.0.tgz#19afa4305e05d79e417566882e0c8f960f62ff0e" - integrity sha512-VvxA0xhNqIIfg0V9AmJkDg91DaJwryutH5rVEZAhcNi4iJFj9f+QxmAjgK1LT9I8OgToX27fypX6/MeCXVbBjQ== - -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - -callsite@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" - integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA= - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - -camelcase@^5.0.0, camelcase@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -camelcase@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" - integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== - -camelcase@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809" - integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== - -caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219: - version "1.0.30001233" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001233.tgz#b7cb4a377a4b12ed240d2fa5c792951a06e5f2c4" - integrity sha512-BmkbxLfStqiPA7IEzQpIk0UFZFf3A4E6fzjPJ6OR+bFC2L8ES9J8zGA/asoi47p8XDVkev+WJo2I2Nc8c/34Yg== - -caniuse-lite@^1.0.30001286: - version "1.0.30001310" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001310.tgz#da02cd07432c9eece6992689d1b84ca18139eea8" - integrity sha512-cb9xTV8k9HTIUA3GnPUJCk0meUnrHL5gy5QePfDjxHyNBcnzPzrHFv5GqfP7ue5b1ZyzZL0RJboD6hQlPXjhjg== - -canonical-path@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz#fcb470c23958def85081856be7a86e904f180d1d" - integrity sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg== - -chainsaw@~0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" - integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= - dependencies: - traverse ">=0.3.0 <0.4" - -chalk@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" - integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^2.0.0, chalk@^2.4.1, chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -char-regex@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" - integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz#94bc1845dce70a5bb9d2ecc748725661293d8fc1" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz#e12c3939b7eaf4e5b15e7ad4c5e28e1d48c5b16b" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - -chokidar@^3.0.0, chokidar@^3.3.1: - version "3.5.2" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" - integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chownr@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" - integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== - -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz#2876cb948a498797b5236f0095bc057d0dca38b6" - integrity sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A== - -ci-info@^3.6.1, ci-info@^3.7.0: - version "3.8.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz#81408265a5380c929f0bc665d62256628ce9ef91" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -cjs-module-lexer@^1.0.0: - version "1.2.1" - resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.1.tgz#2fd46d9906a126965aa541345c499aaa18e8cd73" - integrity sha512-jVamGdJPDeuQilKhvVn1h3knuMOZzr8QDnpk+M9aMlCaMkTDd6fBWPhiDqFvFZ07pL0liqabAiuy8SY4jGHeaw== - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-cursor@3.1.0, cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-spinners@2.6.1: - version "2.6.1" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz#adc954ebe281c37a6319bfa401e6dd2488ffb70d" - integrity sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== - -cli-spinners@^2.5.0: - version "2.9.0" - resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" - integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== - -cli-truncate@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz#c39e28bf05edcde5be3b98992a22deed5a2b93c7" - integrity sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg== - dependencies: - slice-ansi "^3.0.0" - string-width "^4.2.0" - -cli-truncate@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz#3f23ab12535e3d73e839bb43e73c9de487db1389" - integrity sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA== - dependencies: - slice-ansi "^5.0.0" - string-width "^5.0.0" - -cli-width@^2.0.0: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== - -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@4.0.1, clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-regexp@^2.1.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" - integrity sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q== - dependencies: - is-regexp "^2.0.0" - -clone@^1.0.2: - version "1.0.4" - resolved "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" - integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= - -cmd-shim@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" - integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== - dependencies: - mkdirp-infer-owner "^2.0.0" - -cmd-shim@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.1.tgz#a65878080548e1dca760b3aea1e21ed05194da9d" - integrity sha512-S9iI9y0nKR4hwEQsVWpyxld/6kRfGepGfzff83FcaiEBpmvlbA2nnGe7Cylgrx2f/p1P5S5wpRm9oL8z1PbS3Q== - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - -code-excerpt@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz#fcfb6748c03dba8431c19f5474747fad3f250f10" - integrity sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw== - dependencies: - convert-to-spaces "^1.0.1" - -collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== - -colorette@^1.2.1, colorette@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" - integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== - -colorette@^2.0.14, colorette@^2.0.16: - version "2.0.16" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" - integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== - -colors@~1.2.1: - version "1.2.5" - resolved "https://registry.npmjs.org/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" - integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== - -columnify@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz#6989531713c9008bb29735e61e37acf5bd553cf3" - integrity sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== - dependencies: - strip-ansi "^6.0.1" - wcwidth "^1.0.0" - -combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -comlink@^4.4.1: - version "4.4.1" - resolved "https://registry.npmjs.org/comlink/-/comlink-4.4.1.tgz#e568b8e86410b809e8600eb2cf40c189371ef981" - integrity sha512-+1dlx0aY5Jo1vHy/tSsIGpSkN4tS9rZSW8FIhG0JH/crs9wwweswIo/POr451r7bZww3hFbPAKnTpimzL/mm4Q== - -commander@^10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" - integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== - -commander@^2.20.0, commander@^2.7.1: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commitizen@^4.0.3: - version "4.1.2" - resolved "https://registry.npmjs.org/commitizen/-/commitizen-4.1.2.tgz#6095eb825fd3f0d3611df88e6803c69b23307e9a" - integrity sha512-LBxTQKHbVgroMz9ohpm86N+GfJobonGyvDc3zBGdZazbwCLz2tqLa48Rf2TnAdKx7/06W1i1R3SXUt5QW97qVQ== - dependencies: - cachedir "2.2.0" - cz-conventional-changelog "3.2.0" - dedent "0.7.0" - detect-indent "6.0.0" - find-node-modules "2.0.0" - find-root "1.1.0" - fs-extra "8.1.0" - glob "7.1.4" - inquirer "6.5.0" - is-utf8 "^0.2.1" - lodash "4.17.15" - minimist "1.2.5" - strip-bom "4.0.0" - strip-json-comments "3.0.1" - -common-ancestor-path@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" - integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -compare-func@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz#fb65e75edbddfd2e568554e8b5b05fff7a51fcb3" - integrity sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== - dependencies: - array-ify "^1.0.0" - dot-prop "^5.1.0" - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz#414cf5af790a48c60ab9be4527d56d5e41133cb1" - integrity sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.0.2" - typedarray "^0.0.6" - -config-chain@1.1.12: - version "1.1.12" - resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa" - integrity sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA== - dependencies: - ini "^1.3.4" - proto-list "~1.2.1" - -console-control-strings@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== - -conventional-changelog-angular@5.0.12, conventional-changelog-angular@^5.0.11: - version "5.0.12" - resolved "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.12.tgz#c979b8b921cbfe26402eb3da5bbfda02d865a2b9" - integrity sha512-5GLsbnkR/7A89RyHLvvoExbiGbd9xKdKqDTrArnPbOqBqG/2wIosu0fHwpeIRI8Tl94MhVNBXcLJZl92ZQ5USw== - dependencies: - compare-func "^2.0.0" - q "^1.5.1" - -conventional-changelog-conventionalcommits@^4.3.1: - version "4.4.0" - resolved "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.4.0.tgz#8d96687141c9bbd725a89b95c04966d364194cd4" - integrity sha512-ybvx76jTh08tpaYrYn/yd0uJNLt5yMrb1BphDe4WBredMlvPisvMghfpnJb6RmRNcqXeuhR6LfGZGewbkRm9yA== - dependencies: - compare-func "^2.0.0" - lodash "^4.17.15" - q "^1.5.1" - -conventional-changelog-core@4.2.4: - version "4.2.4" - resolved "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz#e50d047e8ebacf63fac3dc67bf918177001e1e9f" - integrity sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg== - dependencies: - add-stream "^1.0.0" - conventional-changelog-writer "^5.0.0" - conventional-commits-parser "^3.2.0" - dateformat "^3.0.0" - get-pkg-repo "^4.0.0" - git-raw-commits "^2.0.8" - git-remote-origin-url "^2.0.0" - git-semver-tags "^4.1.1" - lodash "^4.17.15" - normalize-package-data "^3.0.0" - q "^1.5.1" - read-pkg "^3.0.0" - read-pkg-up "^3.0.0" - through2 "^4.0.0" - -conventional-changelog-preset-loader@^2.3.4: - version "2.3.4" - resolved "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" - integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== - -conventional-changelog-writer@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz#e0757072f045fe03d91da6343c843029e702f359" - integrity sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ== - dependencies: - conventional-commits-filter "^2.0.7" - dateformat "^3.0.0" - handlebars "^4.7.7" - json-stringify-safe "^5.0.1" - lodash "^4.17.15" - meow "^8.0.0" - semver "^6.0.0" - split "^1.0.0" - through2 "^4.0.0" - -conventional-commit-types@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/conventional-commit-types/-/conventional-commit-types-3.0.0.tgz#7c9214e58eae93e85dd66dbfbafe7e4fffa2365b" - integrity sha512-SmmCYnOniSsAa9GqWOeLqc179lfr5TRu5b4QFDkbsrJ5TZjPJx85wtOr3zn+1dbeNiXDKGPbZ72IKbPhLXh/Lg== - -conventional-commits-filter@^2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz#f8d9b4f182fce00c9af7139da49365b136c8a0b3" - integrity sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA== - dependencies: - lodash.ismatch "^4.4.0" - modify-values "^1.0.0" - -conventional-commits-parser@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.1.tgz#ba44f0b3b6588da2ee9fd8da508ebff50d116ce2" - integrity sha512-OG9kQtmMZBJD/32NEw5IhN5+HnBqVjy03eC+I71I0oQRFA5rOgA4OtPOYG7mz1GkCfCNxn3gKIX8EiHJYuf1cA== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - trim-off-newlines "^1.0.0" - -conventional-commits-parser@^3.2.2: - version "3.2.4" - resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" - integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== - dependencies: - JSONStream "^1.0.4" - is-text-path "^1.0.1" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -conventional-recommended-bump@6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" - integrity sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw== - dependencies: - concat-stream "^2.0.0" - conventional-changelog-preset-loader "^2.3.4" - conventional-commits-filter "^2.0.7" - conventional-commits-parser "^3.2.0" - git-raw-commits "^2.0.8" - git-semver-tags "^4.1.1" - meow "^8.0.0" - q "^1.5.1" - -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: - version "1.7.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA== - dependencies: - safe-buffer "~5.1.1" - -convert-source-map@^1.5.1: - version "1.8.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz#f3373c32d21b4d780dd8004514684fb791ca4369" - integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA== - dependencies: - safe-buffer "~5.1.1" - -convert-to-spaces@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz#7e3e48bbe6d997b1417ddca2868204b4d3d85715" - integrity sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU= - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cosmiconfig-typescript-loader@^1.0.0: - version "1.0.9" - resolved "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz#69c523f7e8c3d9f27f563d02bbeadaf2f27212d3" - integrity sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g== - dependencies: - cosmiconfig "^7" - ts-node "^10.7.0" - -cosmiconfig@7.0.0, cosmiconfig@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.0.tgz#ef9b44d773959cae63ddecd122de23853b60f8d3" - integrity sha512-pondGvTuVYDk++upghXJabWzL6Kxu6f26ljFw64Swq9v6sQPUL3EUlVDV56diOjpCayKihL6hVe8exIACU4XcA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^7: - version "7.0.1" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz#714d756522cace867867ccb4474c5d01bbae5d6d" - integrity sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssom@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10" - integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== - -cssom@~0.3.6: - version "0.3.8" - resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a" - integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== - -cssstyle@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852" - integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== - dependencies: - cssom "~0.3.6" - -csstype@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.0.3.tgz#2b410bbeba38ba9633353aff34b05d9755d065f8" - integrity sha512-jPl+wbWPOWJ7SXsWyqGRk3lGecbar0Cb0OvZF/r/ZU011R4YqiRehgkQ9p4eQfo9DSDLqLL3wHwfxeJiuIsNag== - -cz-conventional-changelog@3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.2.0.tgz#6aef1f892d64113343d7e455529089ac9f20e477" - integrity sha512-yAYxeGpVi27hqIilG1nh4A9Bnx4J3Ov+eXy4koL3drrR+IO9GaWPsKjik20ht608Asqi8TQPf0mczhEeyAtMzg== - dependencies: - chalk "^2.4.1" - commitizen "^4.0.3" - conventional-commit-types "^3.0.0" - lodash.map "^4.5.1" - longest "^2.0.1" - word-wrap "^1.0.3" - optionalDependencies: - "@commitlint/load" ">6.1.1" - -cz-conventional-changelog@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/cz-conventional-changelog/-/cz-conventional-changelog-3.3.0.tgz#9246947c90404149b3fe2cf7ee91acad3b7d22d2" - integrity sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw== - dependencies: - chalk "^2.4.1" - commitizen "^4.0.3" - conventional-commit-types "^3.0.0" - lodash.map "^4.5.1" - longest "^2.0.1" - word-wrap "^1.0.3" - optionalDependencies: - "@commitlint/load" ">6.1.1" - -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== - -data-urls@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b" - integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== - dependencies: - abab "^2.0.3" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.0.0" - -dateformat@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" - integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== - -debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -decamelize-keys@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" - integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0, decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decimal.js@^10.2.1: - version "10.2.1" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3" - integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw== - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -dedent@0.7.0, dedent@^0.7.0: - version "0.7.0" - resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" - integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw= - -deep-is@^0.1.3, deep-is@~0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - -deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== - -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - -defaults@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= - dependencies: - clone "^1.0.2" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== - dependencies: - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -defined@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" - integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= - -del@^6.0.0: - version "6.1.1" - resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -depd@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -dependency-check@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/dependency-check/-/dependency-check-4.1.0.tgz#d45405cabb50298f8674fe28ab594c8a5530edff" - integrity sha512-nlw+PvhVQwg0gSNNlVUiuRv0765gah9pZEXdQlIFzeSnD85Eex0uM0bkrAWrHdeTzuMGZnR9daxkup/AqqgqzA== - dependencies: - debug "^4.0.0" - detective "^5.0.2" - globby "^10.0.1" - is-relative "^1.0.0" - micromatch "^4.0.2" - minimist "^1.2.0" - pkg-up "^3.1.0" - read-package-json "^2.0.10" - resolve "^1.1.7" - -dependency-graph@^0.11.0: - version "0.11.0" - resolved "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz#ac0ce7ed68a54da22165a85e97a01d53f5eb2e27" - integrity sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg== - -deprecation@^2.0.0, deprecation@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" - integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-indent@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" - integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== - -detect-indent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" - integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50= - -detect-newline@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -detective@^5.0.2: - version "5.2.0" - resolved "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz#feb2a77e85b904ecdea459ad897cc90a99bd2a7b" - integrity sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg== - dependencies: - acorn-node "^1.6.1" - defined "^1.0.0" - minimist "^1.1.1" - -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -djb2a@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/djb2a/-/djb2a-1.2.0.tgz#a441d5f49b90b78aac52d2c44f5a6c49b3d1724b" - integrity sha512-rXrJYOPCGvHPYw8R2u/zczFTG3xXNqklrtT17vTPm8n/4a16PKEhrfgMwJ9Zyuz96PJwZzHuK2ChQO/SSChuKA== - -doctrine@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== - dependencies: - esutils "^2.0.2" - -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - -dom-serializer@0: - version "0.2.2" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51" - integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== - dependencies: - domelementtype "^2.0.1" - entities "^2.0.0" - -domelementtype@1, domelementtype@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" - integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== - -domelementtype@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== - -domexception@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" - integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== - dependencies: - webidl-conversions "^5.0.0" - -domhandler@^2.3.0: - version "2.4.2" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803" - integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA== - dependencies: - domelementtype "1" - -domutils@^1.5.1: - version "1.7.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" - integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== - dependencies: - dom-serializer "0" - domelementtype "1" - -dot-prop@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" - integrity sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA== - dependencies: - is-obj "^2.0.0" - -dot-prop@^5.1.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -dotenv@~10.0.0: - version "10.0.0" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" - integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== - -duplexer2@~0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" - integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= - dependencies: - readable-stream "^2.0.2" - -duplexer@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - integrity sha1-rOb/gIwc5mtX0ev5eXessCM0z8E= - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ejs@^3.1.7: - version "3.1.9" - resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" - integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== - dependencies: - jake "^10.8.5" - -electron-to-chromium@^1.3.723: - version "1.3.745" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.745.tgz#b54c2baa0e01658288d6835d9f19727fd480de63" - integrity sha512-ZZCx4CS3kYT3BREYiIXocDqlNPT56KfdTS1Ogo4yvxRriBqiEXCDTLIQZT/zNVtby91xTWMMxW2NBiXh8bpLHw== - -electron-to-chromium@^1.4.17: - version "1.4.67" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.67.tgz#699e59d6959d05f87865e12b3055bbcf492bbbee" - integrity sha512-A6a2jEPLueEDfb7kvh7/E94RKKnIb01qL+4I7RFxtajmo+G9F5Ei7HgY5PRbQ4RDrh6DGDW66P0hD5XI2nRAcg== - -emittery@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860" - integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -encoding@^0.1.13: - version "0.1.13" - resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" - integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== - dependencies: - iconv-lite "^0.6.2" - -end-of-stream@^1.4.1: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.0.0: - version "5.8.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.0.tgz#d9deae58f9d3773b6a111a5a46831da5be5c9ac0" - integrity sha512-Sl3KRpJA8OpprrtaIswVki3cWPiPKxXuFxJXBp+zNb6s6VwNWwFRUdtmzd2ReUut8n+sCPx7QCtQ7w5wfJhSgQ== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enhanced-resolve@^5.12.0: - version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enhanced-resolve@^5.14.0: - version "5.14.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz#0b6c676c8a3266c99fa281e4433a706f5c0c61c4" - integrity sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -enquirer@^2.3.5, enquirer@~2.3.6: - version "2.3.6" - resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== - dependencies: - ansi-colors "^4.1.1" - -entities@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" - integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -env-paths@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" - integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== - -envinfo@^7.7.3: - version "7.7.3" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz#4b2d8622e3e7366afb8091b23ed95569ea0208cc" - integrity sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA== - -envinfo@^7.7.4: - version "7.7.4" - resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" - integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== - -err-code@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" - integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.22.1" - resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz#8b4e5fc5cefd7f1660f0f8e1a52900dfbc9d9ccc" - integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== - dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.1" - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - es-set-tostringtag "^2.0.1" - es-to-primitive "^1.2.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.2.1" - get-symbol-description "^1.0.0" - globalthis "^1.0.3" - gopd "^1.0.1" - has "^1.0.3" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" - has-symbols "^1.0.3" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" - is-callable "^1.2.7" - is-negative-zero "^2.0.2" - is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" - is-string "^1.0.7" - is-typed-array "^1.1.10" - is-weakref "^1.0.2" - object-inspect "^1.12.3" - object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.0" - safe-array-concat "^1.0.0" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.7" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" - unbox-primitive "^1.0.2" - which-typed-array "^1.1.10" - -es-module-lexer@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz#ba303831f63e6a394983fde2f97ad77b22324527" - integrity sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg== - -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== - dependencies: - has "^1.0.3" - -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -escape-string-regexp@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" - integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== - dependencies: - esprima "^4.0.1" - estraverse "^5.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.6.1" - -eslint-config-prettier@^8.1.0: - version "8.5.0" - resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== - -eslint-import-resolver-node@^0.3.7: - version "0.3.7" - resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz#83b375187d412324a1963d84fa664377a23eb4d7" - integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== - dependencies: - debug "^3.2.7" - is-core-module "^2.11.0" - resolve "^1.22.1" - -eslint-import-resolver-typescript@^3.5.5: - version "3.5.5" - resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d" - integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw== - dependencies: - debug "^4.3.4" - enhanced-resolve "^5.12.0" - eslint-module-utils "^2.7.4" - get-tsconfig "^4.5.0" - globby "^13.1.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - synckit "^0.8.5" - -eslint-module-utils@^2.7.4: - version "2.8.0" - resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== - dependencies: - debug "^3.2.7" - -eslint-plugin-eslint-comments@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz#9e1cd7b4413526abb313933071d7aba05ca12ffa" - integrity sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ== - dependencies: - escape-string-regexp "^1.0.5" - ignore "^5.0.5" - -eslint-plugin-import@^2.27.5: - version "2.27.5" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz#876a6d03f52608a3e5bb439c2550588e51dd6c65" - integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== - dependencies: - array-includes "^3.1.6" - array.prototype.flat "^1.3.1" - array.prototype.flatmap "^1.3.1" - debug "^3.2.7" - doctrine "^2.1.0" - eslint-import-resolver-node "^0.3.7" - eslint-module-utils "^2.7.4" - has "^1.0.3" - is-core-module "^2.11.0" - is-glob "^4.0.3" - minimatch "^3.1.2" - object.values "^1.1.6" - resolve "^1.22.1" - semver "^6.3.0" - tsconfig-paths "^3.14.1" - -eslint-plugin-jest@^24.4.0: - version "24.4.0" - resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz#fa4b614dbd46a98b652d830377971f097bda9262" - integrity sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg== - dependencies: - "@typescript-eslint/experimental-utils" "^4.0.1" - -eslint-plugin-prettier@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.0.0.tgz#8b99d1e4b8b24a762472b4567992023619cb98e0" - integrity sha512-98MqmCJ7vJodoQK359bqQWaxOE0CS8paAz/GgjaZLyex4TTk3g9HugoO89EqWCrFiOqn9EVvcoo7gZzONCWVwQ== - dependencies: - prettier-linter-helpers "^1.0.0" - -eslint-plugin-require-extensions@^0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/eslint-plugin-require-extensions/-/eslint-plugin-require-extensions-0.1.3.tgz#394aeab433f996797a6ceba0a3f75640d4846bc8" - integrity sha512-T3c1PZ9PIdI3hjV8LdunfYI8gj017UQjzAnCrxuo3wAjneDbTPHdE3oNWInOjMA+z/aBkUtlW5vC0YepYMZIug== - -eslint-scope@5.1.1, eslint-scope@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -eslint-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz#d2de5e03424e707dc10c74068ddedae708741b27" - integrity sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg== - dependencies: - eslint-visitor-keys "^1.1.0" - -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^1.1.0, eslint-visitor-keys@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz#30ebd1ef7c2fdff01c3a4f151044af25fab0523e" - integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ== - -eslint-visitor-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" - integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== - -eslint-visitor-keys@^3.0.0: - version "3.3.0" - resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== - -eslint@>=7.0.0, eslint@^7.32.0: - version "7.32.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" - integrity sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA== - dependencies: - "@babel/code-frame" "7.12.11" - "@eslint/eslintrc" "^0.4.3" - "@humanwhocodes/config-array" "^0.5.0" - ajv "^6.10.0" - chalk "^4.0.0" - cross-spawn "^7.0.2" - debug "^4.0.1" - doctrine "^3.0.0" - enquirer "^2.3.5" - escape-string-regexp "^4.0.0" - eslint-scope "^5.1.1" - eslint-utils "^2.1.0" - eslint-visitor-keys "^2.0.0" - espree "^7.3.1" - esquery "^1.4.0" - esutils "^2.0.2" - fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.1.2" - globals "^13.6.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" - lodash.merge "^4.6.2" - minimatch "^3.0.4" - natural-compare "^1.4.0" - optionator "^0.9.1" - progress "^2.0.0" - regexpp "^3.1.0" - semver "^7.2.1" - strip-ansi "^6.0.0" - strip-json-comments "^3.1.0" - table "^6.0.9" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - -espree@^7.3.0, espree@^7.3.1: - version "7.3.1" - resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" - integrity sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g== - dependencies: - acorn "^7.4.0" - acorn-jsx "^5.3.1" - eslint-visitor-keys "^1.3.0" - -esprima@^4.0.0, esprima@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esquery@^1.0.1, esquery@^1.3.1, esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== - dependencies: - estraverse "^5.1.0" - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" - integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== - -estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== - -estree-walker@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" - integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -event-target-shim@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" - integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== - -eventemitter3@^4.0.4: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" - integrity sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg== - -events@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" - integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^5.0.0, execa@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -execa@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" - integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.1" - human-signals "^4.3.0" - is-stream "^3.0.0" - merge-stream "^2.0.0" - npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^3.0.7" - strip-final-newline "^3.0.0" - -execall@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" - integrity sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow== - dependencies: - clone-regexp "^2.1.0" - -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -expect@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz#83ce59f1e5bdf5f9d2b94b61d2050db48f3fef74" - integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== - dependencies: - "@jest/types" "^27.5.1" - jest-get-type "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== - -fast-glob@3.2.7, fast-glob@^3.0.3: - version "3.2.7" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz#fd6cb7a2d7e9aa7a7846111e85a196d6b2f766a1" - integrity sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q== - 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.4" - -fast-glob@^3.1.1, fast-glob@^3.2.5: - version "3.2.5" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-glob@^3.2.9: - version "3.2.11" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" - integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== - 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.4" - -fast-glob@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz#7c40cb491e1e2ed5664749e87bfb516dbe8727c0" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== - 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.4" - -fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - -fast-memoize@^2.5.2: - version "2.5.2" - resolved "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e" - integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw== - -fastest-levenshtein@^1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" - integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== - -fastq@^1.6.0: - version "1.8.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz#550e1f9f59bbc65fe185cb6a9b4d95357107f481" - integrity sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q== - dependencies: - reusify "^1.0.4" - -fb-watchman@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" - integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg== - dependencies: - bser "2.1.1" - -figures@3.2.0, figures@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== - dependencies: - flat-cache "^3.0.4" - -file-url@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/file-url/-/file-url-3.0.0.tgz#247a586a746ce9f7a8ed05560290968afc262a77" - integrity sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA== - -filelist@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" - integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== - dependencies: - minimatch "^5.0.1" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -find-node-modules@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/find-node-modules/-/find-node-modules-2.0.0.tgz#5db1fb9e668a3d451db3d618cd167cdd59e41b69" - integrity sha512-8MWIBRgJi/WpjjfVXumjPKCtmQ10B+fjx6zmSA+770GMJirLhWIzg8l763rhjl9xaeaHbnxPNRQKq2mgMhr+aw== - dependencies: - findup-sync "^3.0.0" - merge "^1.2.1" - -find-root@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@5.0.0, find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -find-up@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0, find-up@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-yarn-workspace-root@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" - integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== - dependencies: - micromatch "^4.0.2" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== - dependencies: - flatted "^3.1.0" - rimraf "^3.0.2" - -flat@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" - integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== - -flatted@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" - integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== - -follow-redirects@^1.15.0: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -for-each@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" - integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== - dependencies: - is-callable "^1.1.3" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -foreground-child@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" - integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== - dependencies: - cross-spawn "^7.0.0" - signal-exit "^4.0.1" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -form-data@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-extra@8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" - integrity sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-extra@9.1.0, fs-extra@^9.0.0, fs-extra@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^10.0.0: - version "10.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz#27de43b4320e833f6867cc044bfce29fdf0ef3b8" - integrity sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^11.1.0: - version "11.1.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" - integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@~7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" - integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - -fs-minipass@^2.0.0, fs-minipass@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" - integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== - dependencies: - minipass "^3.0.0" - -fs-minipass@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz#5b383858efa8c1eb8c33b39e994f7e8555b8b3a3" - integrity sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== - dependencies: - minipass "^5.0.0" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^2.3.2, fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -fstream@^1.0.12: - version "1.0.12" - resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" - integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== - -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" - -functional-red-black-tree@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" - integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= - -functions-have-names@^1.2.2, functions-have-names@^1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" - integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== - -gauge@^4.0.3: - version "4.0.4" - resolved "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" - integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^3.0.7" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - -gauge@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" - integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== - dependencies: - aproba "^1.0.3 || ^2.0.0" - color-support "^1.1.3" - console-control-strings "^1.1.0" - has-unicode "^2.0.1" - signal-exit "^4.0.1" - string-width "^4.2.3" - strip-ansi "^6.0.1" - wide-align "^1.1.5" - -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== - -gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz#d295644fed4505fc9cde952c37ee12b477a83d82" - integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-proto "^1.0.1" - has-symbols "^1.0.3" - -get-pkg-repo@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz#75973e1c8050c73f48190c52047c4cee3acbf385" - integrity sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== - dependencies: - "@hutson/parse-repository-url" "^3.0.0" - hosted-git-info "^4.0.0" - through2 "^2.0.0" - yargs "^16.2.0" - -get-port@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" - integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== - -get-stdin@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" - integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== - -get-stream@6.0.0, get-stream@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" - integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== - -get-stream@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" - -get-tsconfig@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.6.2.tgz#831879a5e6c2aa24fe79b60340e2233a1e0f472e" - integrity sha512-E5XrT4CbbXcXWy+1jChlZmrmCwd5KGx502kDCXJJ7y898TtWW9FwoG5HfOLVRKmlmDGkWN2HM9Ho+/Y8F0sJDg== - dependencies: - resolve-pkg-maps "^1.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -git-raw-commits@^2.0.0: - version "2.0.7" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.7.tgz#02e9357727a9755efa8e14dd5e59b381c29068fb" - integrity sha512-SkwrTqrDxw8y0G1uGJ9Zw13F7qu3LF8V4BifyDeiJCxSnjRGZD9SaoMiMqUvvXMXh6S3sOQ1DsBN7L2fMUZW/g== - dependencies: - dargs "^7.0.0" - lodash.template "^4.0.2" - meow "^7.0.0" - split2 "^2.0.0" - through2 "^3.0.0" - -git-raw-commits@^2.0.8: - version "2.0.10" - resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.10.tgz#e2255ed9563b1c9c3ea6bd05806410290297bbc1" - integrity sha512-sHhX5lsbG9SOO6yXdlwgEMQ/ljIn7qMpAbJZCGfXX2fq5T8M5SrDnpYk9/4HswTildcIqatsWa91vty6VhWSaQ== - dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" - -git-remote-origin-url@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" - integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= - dependencies: - gitconfiglocal "^1.0.0" - pify "^2.3.0" - -git-semver-tags@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz#63191bcd809b0ec3e151ba4751c16c444e5b5780" - integrity sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA== - dependencies: - meow "^8.0.0" - semver "^6.0.0" - -git-up@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz#bace30786e36f56ea341b6f69adfd83286337467" - integrity sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== - dependencies: - is-ssh "^1.4.0" - parse-url "^8.1.0" - -git-url-parse@13.1.0: - version "13.1.0" - resolved "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz#07e136b5baa08d59fabdf0e33170de425adf07b4" - integrity sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA== - dependencies: - git-up "^7.0.0" - -gitconfiglocal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" - integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= - dependencies: - ini "^1.3.2" - -glob-parent@5.1.2, glob-parent@^5.1.0, glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@7.1.4: - version "7.1.4" - resolved "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" - integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^10.2.2: - version "10.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-10.2.3.tgz#aa6765963fe6c5936d5c2e00943e7af06302a1a7" - integrity sha512-Kb4rfmBVE3eQTAimgmeqc2LwSnN0wIOkkUL6HmxEFxNJ4fHghYHVbFba/HcGcRjE6s9KoMNK3rSOwkL4PioZjg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^2.0.3" - minimatch "^9.0.0" - minipass "^5.0.0" - path-scurry "^1.7.0" - -glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: - version "7.2.0" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -glob@^9.2.0: - version "9.3.5" - resolved "https://registry.npmjs.org/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" - integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== - dependencies: - fs.realpath "^1.0.0" - minimatch "^8.0.2" - minipass "^4.2.4" - path-scurry "^1.6.1" - -global-dirs@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globals@^13.6.0: - version "13.6.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.6.0.tgz#d77138e53738567bb96a3916ff6f6b487af20ef7" - integrity sha512-YFKCX0SiPg7l5oKYCJ2zZGxcXprVXHcSnVuvzrT3oSENQonVLqM5pf9fN5dLGZGyCjhw8TN8Btwe/jKnZ0pjvQ== - dependencies: - type-fest "^0.20.2" - -globals@^13.9.0: - version "13.11.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" - integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== - dependencies: - type-fest "^0.20.2" - -globalthis@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" - integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== - dependencies: - define-properties "^1.1.3" - -globby@11.1.0, globby@^11.0.1, globby@^11.0.4: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@11.x.x, globby@^11.0.3: - version "11.0.3" - resolved "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" - integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.1.1" - ignore "^5.1.4" - merge2 "^1.3.0" - slash "^3.0.0" - -globby@^10.0.1: - version "10.0.2" - resolved "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" - integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -globby@^13.1.3: - version "13.2.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -globjoin@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" - integrity sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM= - -gonzales-pe@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz#fe9dec5f3c557eead09ff868c65826be54d067b3" - integrity sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== - dependencies: - minimist "^1.2.5" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -graceful-fs@4.2.10: - version "4.2.10" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.8, graceful-fs@^4.2.9: - version "4.2.9" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" - integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== - -graceful-fs@^4.2.6: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - -has-bigints@^1.0.1, has-bigints@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" - integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== - dependencies: - get-intrinsic "^1.1.1" - -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== - -has-symbols@^1.0.2, has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== - dependencies: - has-symbols "^1.0.2" - -has-unicode@2.0.1, has-unicode@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -has@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^3.0.6: - version "3.0.8" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.8.tgz#6e35d4cc87af2c5f816e4cb9ce350ba87a3f370d" - integrity sha512-aXpmwoOhRBrw6X3j0h5RloK4x1OzsxMPyxqIHyNfSe2pypkVTZFpEiRoSipPEPlMrh0HW/XsjkJ5WgnCirpNUw== - dependencies: - lru-cache "^6.0.0" - -hosted-git-info@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - -hosted-git-info@^5.0.0: - version "5.2.1" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-5.2.1.tgz#0ba1c97178ef91f3ab30842ae63d6a272341156f" - integrity sha512-xIcQYMnhcx2Nr4JTjsFmwwnr9vldugPy9uVm0o87bjqqWMv9GaqsTeT+i99wTl0mk1uLxJtHxLb8kymqTENQsw== - dependencies: - lru-cache "^7.5.1" - -hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" - integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== - dependencies: - lru-cache "^7.5.1" - -html-encoding-sniffer@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" - integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== - dependencies: - whatwg-encoding "^1.0.5" - -html-escaper@^2.0.0: - version "2.0.2" - resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" - integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== - -html-tags@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz#7b5e6f7e665e9fb41f30007ed9e0d41e97fb2140" - integrity sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg== - -htmlparser2@^3.10.0: - version "3.10.1" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f" - integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ== - dependencies: - domelementtype "^1.3.1" - domhandler "^2.3.0" - domutils "^1.5.1" - entities "^1.1.1" - inherits "^2.0.1" - readable-stream "^3.1.1" - -http-cache-semantics@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== - -http-cache-semantics@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-proxy-agent@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" - integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== - dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - -http-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" - integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== - dependencies: - "@tootallnate/once" "2" - agent-base "6" - debug "4" - -https-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2" - integrity sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA== - dependencies: - agent-base "6" - debug "4" - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -human-signals@^4.3.0: - version "4.3.1" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" - integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== - -humanize-ms@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" - integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= - dependencies: - ms "^2.0.0" - -husky@^7.0.4: - version "7.0.4" - resolved "https://registry.npmjs.org/husky/-/husky-7.0.4.tgz#242048245dc49c8fb1bf0cc7cfb98dd722531535" - integrity sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ== - -iconv-lite@0.4.24, iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" - integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -ieee754@^1.1.13, ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore-walk@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-5.0.1.tgz#5f199e23e1288f518d90358d461387788a154776" - integrity sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw== - dependencies: - minimatch "^5.0.1" - -ignore-walk@^6.0.0: - version "6.0.3" - resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" - integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== - dependencies: - minimatch "^9.0.0" - -ignore@^4.0.6: - version "4.0.6" - resolved "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" - integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== - -ignore@^5.0.4, ignore@^5.0.5, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -ignore@^5.1.1: - version "5.1.9" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" - integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== - -ignore@^5.1.4, ignore@^5.1.8: - version "5.1.8" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -ignore@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" - integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== - -import-fresh@^3.0.0, import-fresh@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" - integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^4.0.0, import-lazy@~4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" - integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== - -import-local@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" - integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA== - dependencies: - pkg-dir "^4.2.0" - resolve-cwd "^3.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infer-owner@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^1.3.2, ini@^1.3.4, ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -init-package-json@3.0.2, init-package-json@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-3.0.2.tgz#f5bc9bac93f2bdc005778bc2271be642fecfcd69" - integrity sha512-YhlQPEjNFqlGdzrBfDNRLhvoSgX7iQRgSxgsNknRQ9ITXFT7UMfVMWhBTOh2Y+25lRnGrv5Xz8yZwQ3ACR6T3A== - dependencies: - npm-package-arg "^9.0.1" - promzard "^0.3.0" - read "^1.0.7" - read-package-json "^5.0.0" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - validate-npm-package-name "^4.0.0" - -ink-text-input@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/ink-text-input/-/ink-text-input-4.0.2.tgz#59b41604058b29bc2b8c1335838c213076308205" - integrity sha512-euuugcNExOx5E+qNM1c+pDF7V8yw/xzCRWEfFk1KjQT9CYtaVAYre13YbMFsYPkGD26dvX6XAffUgkwXme/p5Q== - dependencies: - chalk "^4.1.0" - type-fest "^0.15.1" - -ink@^3.0.9: - version "3.2.0" - resolved "https://registry.npmjs.org/ink/-/ink-3.2.0.tgz#434793630dc57d611c8fe8fffa1db6b56f1a16bb" - integrity sha512-firNp1q3xxTzoItj/eOOSZQnYSlyrWks5llCTVX37nJ59K3eXbQ8PtzCguqo8YI19EELo5QxaKnJd4VxzhU8tg== - dependencies: - ansi-escapes "^4.2.1" - auto-bind "4.0.0" - chalk "^4.1.0" - cli-boxes "^2.2.0" - cli-cursor "^3.1.0" - cli-truncate "^2.1.0" - code-excerpt "^3.0.0" - indent-string "^4.0.0" - is-ci "^2.0.0" - lodash "^4.17.20" - patch-console "^1.0.0" - react-devtools-core "^4.19.1" - react-reconciler "^0.26.2" - scheduler "^0.20.2" - signal-exit "^3.0.2" - slice-ansi "^3.0.0" - stack-utils "^2.0.2" - string-width "^4.2.2" - type-fest "^0.12.0" - widest-line "^3.1.0" - wrap-ansi "^6.2.0" - ws "^7.5.5" - yoga-layout-prebuilt "^1.9.6" - -inquirer@6.5.0: - version "6.5.0" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.0.tgz#2303317efc9a4ea7ec2e2df6f86569b734accf42" - integrity sha512-scfHejeG/lVZSpvCXpsB4j/wQNPM5JC8kiElOI0OUTwmc1RTpXr4H32/HOlQHcZiYl2z2VElwuCVDRG8vFmbnA== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - -inquirer@8.2.4: - version "8.2.4" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.4.tgz#ddbfe86ca2f67649a67daa6f1051c128f684f0b4" - integrity sha512-nn4F01dxU8VeKfq192IjLsxu0/OmMZ4Lg3xKAns148rCaXP6ntAoEkVYZThWjwON8AlzdZZi6oqnhNbxUG9hVg== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - -inquirer@^8.2.4: - version "8.2.5" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz#d8654a7542c35a9b9e069d27e2df4858784d54f8" - integrity sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.1" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.21" - mute-stream "0.0.8" - ora "^5.4.1" - run-async "^2.4.0" - rxjs "^7.5.5" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - wrap-ansi "^7.0.0" - -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== - dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" - side-channel "^1.0.4" - -interpret@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" - integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== - -ip@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" - integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz#7eb9a2431f855f6b1ef1a78e326df515696c4dbf" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - -is-bigint@^1.0.1: - version "1.0.4" - resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" - integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== - dependencies: - has-bigints "^1.0.1" - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-boolean-object@^1.1.0: - version "1.1.2" - resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" - integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-builtin-module@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.1.0.tgz#6fdb24313b1c03b75f8b9711c0feb8c30b903b00" - integrity sha512-OV7JjAgOTfAFJmHZLvpSTb4qi0nIILDV1gWPYDnDJUTNFM5aGlRAhk4QcT8i7TuAleeEV5Fdkqn3t4mS+Q11fg== - dependencies: - builtin-modules "^3.0.0" - -is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" - integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== - -is-ci@2.0.0, is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.1.0: - version "2.6.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz#d7553b2526fe59b92ba3e40c8df757ec8a709e19" - integrity sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ== - dependencies: - has "^1.0.3" - -is-core-module@^2.11.0: - version "2.12.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz#0c0b6885b6f80011c71541ce15c8d66cf5a4f9fd" - integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== - dependencies: - has "^1.0.3" - -is-core-module@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ== - dependencies: - has "^1.0.3" - -is-core-module@^2.8.1: - version "2.9.0" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-date-object@^1.0.1: - version "1.0.5" - resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" - integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== - dependencies: - has-tostringtag "^1.0.0" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz#fae3167c729e7463f8461ce512b080a49268aa88" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - -is-generator-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" - integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-glob@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - -is-interactive@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" - integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== - -is-lambda@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" - integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU= - -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= - -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== - -is-number-object@^1.0.4: - version "1.0.7" - resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" - integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== - dependencies: - has-tostringtag "^1.0.0" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^1.0.0, is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" - integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== - -is-potential-custom-element-name@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" - integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== - -is-reference@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" - integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== - dependencies: - "@types/estree" "*" - -is-regex@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" - integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== - dependencies: - call-bind "^1.0.2" - has-tostringtag "^1.0.0" - -is-regexp@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" - integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== - -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== - dependencies: - call-bind "^1.0.2" - -is-ssh@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz#4f8220601d2839d8fa624b3106f8e8884f01b8b2" - integrity sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== - dependencies: - protocols "^2.0.1" - -is-stream@2.0.0, is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -is-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac" - integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA== - -is-string@^1.0.5, is-string@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" - integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== - dependencies: - has-tostringtag "^1.0.0" - -is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" - integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== - dependencies: - has-symbols "^1.0.2" - -is-text-path@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" - integrity sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4= - dependencies: - text-extensions "^1.0.0" - -is-typed-array@^1.1.10, is-typed-array@^1.1.9: - version "1.1.10" - resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz#36a5b5cb4189b575d1a3e4b08536bfb485801e3f" - integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-unicode-supported@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" - integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== - -is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-weakref@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" - integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== - dependencies: - call-bind "^1.0.2" - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^2.1.1, is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isarray@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" - integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -istanbul-lib-coverage@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec" - integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg== - -istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== - -istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz#7b49198b657b27a730b8e9cb601f1e1bff24c59a" - integrity sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q== - dependencies: - "@babel/core" "^7.12.3" - "@babel/parser" "^7.14.7" - "@istanbuljs/schema" "^0.1.2" - istanbul-lib-coverage "^3.2.0" - semver "^6.3.0" - -istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== - dependencies: - istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" - supports-color "^7.1.0" - -istanbul-lib-source-maps@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9" - integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg== - dependencies: - debug "^4.1.1" - istanbul-lib-coverage "^3.0.0" - source-map "^0.6.1" - -istanbul-reports@^3.1.3: - version "3.1.4" - resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz#1b6f068ecbc6c331040aab5741991273e609e40c" - integrity sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw== - dependencies: - html-escaper "^2.0.0" - istanbul-lib-report "^3.0.0" - -jackspeak@^2.0.3: - version "2.2.0" - resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-2.2.0.tgz#497cbaedc902ec3f31d5d61be804d2364ff9ddad" - integrity sha512-r5XBrqIJfwRIjRt/Xr5fv9Wh09qyhHfKnYddDlpM+ibRR20qrYActpCAgU6U+d53EOEjzkvxPMVHSlgR7leXrQ== - dependencies: - "@isaacs/cliui" "^8.0.2" - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" - -jake@^10.8.5: - version "10.8.5" - resolved "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" - integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== - dependencies: - async "^3.2.3" - chalk "^4.0.2" - filelist "^1.0.1" - minimatch "^3.0.4" - -jest-changed-files@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz#a348aed00ec9bf671cc58a66fcbe7c3dfd6a68f5" - integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== - dependencies: - "@jest/types" "^27.5.1" - execa "^5.0.0" - throat "^6.0.1" - -jest-circus@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz#37a5a4459b7bf4406e53d637b49d22c65d125ecc" - integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - throat "^6.0.1" - -jest-cli@*, jest-cli@^27.3.1, jest-cli@^27.4.3: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz#278794a6e6458ea8029547e6c6cbf673bd30b145" - integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== - dependencies: - "@jest/core" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - exit "^0.1.2" - graceful-fs "^4.2.9" - import-local "^3.0.2" - jest-config "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - prompts "^2.0.1" - yargs "^16.2.0" - -jest-config@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz#5c387de33dca3f99ad6357ddeccd91bf3a0e4a41" - integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== - dependencies: - "@babel/core" "^7.8.0" - "@jest/test-sequencer" "^27.5.1" - "@jest/types" "^27.5.1" - babel-jest "^27.5.1" - chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.1" - graceful-fs "^4.2.9" - jest-circus "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-get-type "^27.5.1" - jest-jasmine2 "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runner "^27.5.1" - jest-util "^27.5.1" - jest-validate "^27.5.1" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^27.5.1" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@^27.0.0, jest-diff@^27.0.6, jest-diff@^27.1.0, jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-docblock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz#14092f364a42c6108d42c33c8cf30e058e25f6c0" - integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== - dependencies: - detect-newline "^3.0.0" - -jest-each@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz#5bc87016f45ed9507fed6e4702a5b468a5b2c44e" - integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - jest-get-type "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - -jest-environment-jsdom@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz#ea9ccd1fc610209655a77898f86b2b559516a546" - integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - jsdom "^16.6.0" - -jest-environment-node@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz#dedc2cfe52fab6b8f5714b4808aefa85357a365e" - integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - jest-mock "^27.5.1" - jest-util "^27.5.1" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== - -jest-haste-map@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz#9fd8bd7e7b4fa502d9c6164c5640512b4e811e7f" - integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== - dependencies: - "@jest/types" "^27.5.1" - "@types/graceful-fs" "^4.1.2" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^27.5.1" - jest-serializer "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - micromatch "^4.0.4" - walker "^1.0.7" - optionalDependencies: - fsevents "^2.3.2" - -jest-jasmine2@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz#a037b0034ef49a9f3d71c4375a796f3b230d1ac4" - integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - expect "^27.5.1" - is-generator-fn "^2.0.0" - jest-each "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-runtime "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - pretty-format "^27.5.1" - throat "^6.0.1" - -jest-leak-detector@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz#6ec9d54c3579dd6e3e66d70e3498adf80fde3fb8" - integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== - dependencies: - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-matcher-utils@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-message-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz#bdda72806da10d9ed6425e12afff38cd1458b6cf" - integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^27.5.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^27.5.1" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-mock@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz#19948336d49ef4d9c52021d34ac7b5f36ff967d6" - integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - -jest-pnp-resolver@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" - integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== - -jest-regex-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz#4da143f7e9fd1e542d4aa69617b38e4a78365b95" - integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== - -jest-resolve-dependencies@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz#d811ecc8305e731cc86dd79741ee98fed06f1da8" - integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== - dependencies: - "@jest/types" "^27.5.1" - jest-regex-util "^27.5.1" - jest-snapshot "^27.5.1" - -jest-resolve@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz#a2f1c5a0796ec18fe9eb1536ac3814c23617b384" - integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== - dependencies: - "@jest/types" "^27.5.1" - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-pnp-resolver "^1.2.2" - jest-util "^27.5.1" - jest-validate "^27.5.1" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz#071b27c1fa30d90540805c5645a0ec167c7b62e5" - integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== - dependencies: - "@jest/console" "^27.5.1" - "@jest/environment" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.8.1" - graceful-fs "^4.2.9" - jest-docblock "^27.5.1" - jest-environment-jsdom "^27.5.1" - jest-environment-node "^27.5.1" - jest-haste-map "^27.5.1" - jest-leak-detector "^27.5.1" - jest-message-util "^27.5.1" - jest-resolve "^27.5.1" - jest-runtime "^27.5.1" - jest-util "^27.5.1" - jest-worker "^27.5.1" - source-map-support "^0.5.6" - throat "^6.0.1" - -jest-runtime@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz#4896003d7a334f7e8e4a53ba93fb9bcd3db0a1af" - integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== - dependencies: - "@jest/environment" "^27.5.1" - "@jest/fake-timers" "^27.5.1" - "@jest/globals" "^27.5.1" - "@jest/source-map" "^27.5.1" - "@jest/test-result" "^27.5.1" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^27.5.1" - jest-message-util "^27.5.1" - jest-mock "^27.5.1" - jest-regex-util "^27.5.1" - jest-resolve "^27.5.1" - jest-snapshot "^27.5.1" - jest-util "^27.5.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-serializer@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz#81438410a30ea66fd57ff730835123dea1fb1f64" - integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== - dependencies: - "@types/node" "*" - graceful-fs "^4.2.9" - -jest-snapshot@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz#b668d50d23d38054a51b42c4039cab59ae6eb6a1" - integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== - dependencies: - "@babel/core" "^7.7.2" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.0.0" - "@jest/transform" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/babel__traverse" "^7.0.4" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" - chalk "^4.0.0" - expect "^27.5.1" - graceful-fs "^4.2.9" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - jest-haste-map "^27.5.1" - jest-matcher-utils "^27.5.1" - jest-message-util "^27.5.1" - jest-util "^27.5.1" - natural-compare "^1.4.0" - pretty-format "^27.5.1" - semver "^7.3.2" - -jest-util@^27.0.0, jest-util@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz#3ba9771e8e31a0b85da48fe0b0891fb86c01c2f9" - integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== - dependencies: - "@jest/types" "^27.5.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz#9197d54dc0bdb52260b8db40b46ae668e04df067" - integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== - dependencies: - "@jest/types" "^27.5.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^27.5.1" - leven "^3.1.0" - pretty-format "^27.5.1" - -jest-watcher@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz#71bd85fb9bde3a2c2ec4dc353437971c43c642a2" - integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== - dependencies: - "@jest/test-result" "^27.5.1" - "@jest/types" "^27.5.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - jest-util "^27.5.1" - string-length "^4.0.1" - -jest-worker@^27.4.5, jest-worker@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest@^27.0.4: - version "27.3.1" - resolved "https://registry.npmjs.org/jest/-/jest-27.3.1.tgz#b5bab64e8f56b6f7e275ba1836898b0d9f1e5c8a" - integrity sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng== - dependencies: - "@jest/core" "^27.3.1" - import-local "^3.0.2" - jest-cli "^27.3.1" - -jju@~1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz#a3abe2718af241a2b2904f84a625970f389ae32a" - integrity sha1-o6vicYryQaKykE+EpiWXDzia4yo= - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@4.1.0, js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -js-yaml@^3.10.0: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^3.13.1, js-yaml@~3.13.1: - version "3.13.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" - integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -jsdom@^16.6.0: - version "16.6.0" - resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.6.0.tgz#f79b3786682065492a3da6a60a4695da983805ac" - integrity sha512-Ty1vmF4NHJkolaEmdjtxTfSfkdb8Ywarwf63f+F8/mDD1uLSSWDxDuMiZxiPhwunLrn9LOSVItWj4bLYsLN3Dg== - dependencies: - abab "^2.0.5" - acorn "^8.2.4" - acorn-globals "^6.0.0" - cssom "^0.4.4" - cssstyle "^2.3.0" - data-urls "^2.0.0" - decimal.js "^10.2.1" - domexception "^2.0.1" - escodegen "^2.0.0" - form-data "^3.0.0" - html-encoding-sniffer "^2.0.1" - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.0" - parse5 "6.0.1" - saxes "^5.0.1" - symbol-tree "^3.2.4" - tough-cookie "^4.0.0" - w3c-hr-time "^1.0.2" - w3c-xmlserializer "^2.0.0" - webidl-conversions "^6.1.0" - whatwg-encoding "^1.0.5" - whatwg-mimetype "^2.3.0" - whatwg-url "^8.5.0" - ws "^7.4.5" - xml-name-validator "^3.0.0" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -json-parse-better-errors@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-parse-even-better-errors@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" - integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json-stable-stringify-without-jsonify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" - integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= - -json-stable-stringify@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.2.tgz#e06f23128e0bbe342dc996ed5a19e28b57b580e0" - integrity sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g== - dependencies: - jsonify "^0.0.1" - -json-stringify-nice@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" - integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== - -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - -json5@2.x, json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -json5@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" - integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== - dependencies: - minimist "^1.2.0" - -jsonc-parser@3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz#31ff3f4c2b9793f89c67212627c51c6394f88e76" - integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== - -jsonfile@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" - integrity sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss= - optionalDependencies: - graceful-fs "^4.1.6" - -jsonfile@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz#98966cba214378c8c84b82e085907b40bf614179" - integrity sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg== - dependencies: - universalify "^1.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -jsonify@^0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" - integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== - -jsonparse@^1.2.0, jsonparse@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" - integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= - -just-diff-apply@^5.2.0: - version "5.5.0" - resolved "https://registry.npmjs.org/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" - integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== - -just-diff@^6.0.0: - version "6.0.2" - resolved "https://registry.npmjs.org/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" - integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -klaw-sync@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" - integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== - dependencies: - graceful-fs "^4.1.11" - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -known-css-properties@^0.21.0: - version "0.21.0" - resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.21.0.tgz#15fbd0bbb83447f3ce09d8af247ed47c68ede80d" - integrity sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw== - -lerna@^6.6.2: - version "6.6.2" - resolved "https://registry.npmjs.org/lerna/-/lerna-6.6.2.tgz#ad921f913aca4e7307123a598768b6f15ca5804f" - integrity sha512-W4qrGhcdutkRdHEaDf9eqp7u4JvI+1TwFy5woX6OI8WPe4PYBdxuILAsvhp614fUG41rKSGDKlOh+AWzdSidTg== - dependencies: - "@lerna/child-process" "6.6.2" - "@lerna/create" "6.6.2" - "@lerna/legacy-package-management" "6.6.2" - "@npmcli/arborist" "6.2.3" - "@npmcli/run-script" "4.1.7" - "@nrwl/devkit" ">=15.5.2 < 16" - "@octokit/plugin-enterprise-rest" "6.0.1" - "@octokit/rest" "19.0.3" - byte-size "7.0.0" - chalk "4.1.0" - clone-deep "4.0.1" - cmd-shim "5.0.0" - columnify "1.6.0" - config-chain "1.1.12" - conventional-changelog-angular "5.0.12" - conventional-changelog-core "4.2.4" - conventional-recommended-bump "6.1.0" - cosmiconfig "7.0.0" - dedent "0.7.0" - dot-prop "6.0.1" - envinfo "^7.7.4" - execa "5.0.0" - fs-extra "9.1.0" - get-port "5.1.1" - get-stream "6.0.0" - git-url-parse "13.1.0" - glob-parent "5.1.2" - globby "11.1.0" - graceful-fs "4.2.10" - has-unicode "2.0.1" - import-local "^3.0.2" - init-package-json "3.0.2" - inquirer "^8.2.4" - is-ci "2.0.0" - is-stream "2.0.0" - js-yaml "^4.1.0" - libnpmaccess "^6.0.3" - libnpmpublish "7.1.4" - load-json-file "6.2.0" - make-dir "3.1.0" - minimatch "3.0.5" - multimatch "5.0.0" - node-fetch "2.6.7" - npm-package-arg "8.1.1" - npm-packlist "5.1.1" - npm-registry-fetch "^14.0.3" - npmlog "^6.0.2" - nx ">=15.5.2 < 16" - p-map "4.0.0" - p-map-series "2.1.0" - p-pipe "3.1.0" - p-queue "6.6.2" - p-reduce "2.1.0" - p-waterfall "2.1.1" - pacote "15.1.1" - pify "5.0.0" - read-cmd-shim "3.0.0" - read-package-json "5.0.1" - resolve-from "5.0.0" - rimraf "^4.4.1" - semver "^7.3.8" - signal-exit "3.0.7" - slash "3.0.0" - ssri "9.0.1" - strong-log-transformer "2.1.0" - tar "6.1.11" - temp-dir "1.0.0" - typescript "^3 || ^4" - upath "^2.0.1" - uuid "8.3.2" - validate-npm-package-license "3.0.4" - validate-npm-package-name "4.0.0" - write-file-atomic "4.0.1" - write-pkg "4.0.0" - yargs "16.2.0" - yargs-parser "20.2.4" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -levn@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" - integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== - dependencies: - prelude-ls "^1.2.1" - type-check "~0.4.0" - -levn@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - -libnpmaccess@^6.0.3: - version "6.0.4" - resolved "https://registry.npmjs.org/libnpmaccess/-/libnpmaccess-6.0.4.tgz#2dd158bd8a071817e2207d3b201d37cf1ad6ae6b" - integrity sha512-qZ3wcfIyUoW0+qSFkMBovcTrSGJ3ZeyvpR7d5N9pEYv/kXs8sHP2wiqEIXBKLFrZlmM0kR0RJD7mtfLngtlLag== - dependencies: - aproba "^2.0.0" - minipass "^3.1.1" - npm-package-arg "^9.0.1" - npm-registry-fetch "^13.0.0" - -libnpmpublish@7.1.4: - version "7.1.4" - resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-7.1.4.tgz#a0d138e00e52a0c71ffc82273acf0082fc2dfb36" - integrity sha512-mMntrhVwut5prP4rJ228eEbEyvIzLWhqFuY90j5QeXBCTT2pWSMno7Yo2S2qplPUr02zPurGH4heGLZ+wORczg== - dependencies: - ci-info "^3.6.1" - normalize-package-data "^5.0.0" - npm-package-arg "^10.1.0" - npm-registry-fetch "^14.0.3" - proc-log "^3.0.0" - semver "^7.3.7" - sigstore "^1.4.0" - ssri "^10.0.1" - -lilconfig@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" - integrity sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA== - -lines-and-columns@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" - integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= - -lines-and-columns@^2.0.3, lines-and-columns@~2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz#b2f0badedb556b747020ab8ea7f0373e22efac1b" - integrity sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== - -lint-staged@>=11.1.2: - version "12.3.7" - resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-12.3.7.tgz#ad0e2014302f704f9cf2c0ebdb97ac63d0f17be0" - integrity sha512-/S4D726e2GIsDVWIk1XGvheCaDm1SJRQp8efamZFWJxQMVEbOwSysp7xb49Oo73KYCdy97mIWinhlxcoNqIfIQ== - dependencies: - cli-truncate "^3.1.0" - colorette "^2.0.16" - commander "^8.3.0" - debug "^4.3.3" - execa "^5.1.1" - lilconfig "2.0.4" - listr2 "^4.0.1" - micromatch "^4.0.4" - normalize-path "^3.0.0" - object-inspect "^1.12.0" - pidtree "^0.5.0" - string-argv "^0.3.1" - supports-color "^9.2.1" - yaml "^1.10.2" - -listenercount@~1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" - integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= - -listr2@^4.0.1: - version "4.0.5" - resolved "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz#9dcc50221583e8b4c71c43f9c7dfd0ef546b75d5" - integrity sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA== - dependencies: - cli-truncate "^2.1.0" - colorette "^2.0.16" - log-update "^4.0.0" - p-map "^4.0.0" - rfdc "^1.3.0" - rxjs "^7.5.5" - through "^2.3.8" - wrap-ansi "^7.0.0" - -load-json-file@6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-6.2.0.tgz#5c7770b42cafa97074ca2848707c61662f4251a1" - integrity sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== - dependencies: - graceful-fs "^4.1.15" - parse-json "^5.0.0" - strip-bom "^4.0.0" - type-fest "^0.6.0" - -load-json-file@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" - integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= - dependencies: - graceful-fs "^4.1.2" - parse-json "^4.0.0" - pify "^3.0.0" - strip-bom "^3.0.0" - -loader-runner@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" - integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash.get@^4.0.0: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= - -lodash.ismatch@^4.4.0: - version "4.4.0" - resolved "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" - integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc= - -lodash.map@^4.5.1: - version "4.6.0" - resolved "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" - integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= - -lodash.memoize@4.x: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" - integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= - -lodash.merge@^4.6.2: - version "4.6.2" - resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" - integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== - -lodash.template@^4.0.2: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash.truncate@^4.4.2: - version "4.4.2" - resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" - integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= - -lodash@4.17.15: - version "4.17.15" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0, lodash@~4.17.15: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -log-symbols@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" - integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== - dependencies: - chalk "^4.1.0" - is-unicode-supported "^0.1.0" - -log-update@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz#589ecd352471f2a1c0c570287543a64dfd20e0a1" - integrity sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg== - dependencies: - ansi-escapes "^4.3.0" - cli-cursor "^3.1.0" - slice-ansi "^4.0.0" - wrap-ansi "^6.2.0" - -longest-streak@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4" - integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg== - -longest@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" - integrity sha1-eB4YMpaqlPbU2RbcM10NF676I/g= - -loose-envify@^1.1.0, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: - version "7.18.3" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" - integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== - -lru-cache@^9.1.1: - version "9.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz#c58a93de58630b688de39ad04ef02ef26f1902f1" - integrity sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A== - -magic-string@^0.25.0: - version "0.25.7" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz#3f497d6fd34c669c6798dcb821f2ef31f5445051" - integrity sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA== - dependencies: - sourcemap-codec "^1.4.4" - -magic-string@^0.25.7: - version "0.25.9" - resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" - integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== - dependencies: - sourcemap-codec "^1.4.8" - -make-dir@3.1.0, make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -make-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -make-error@1.x, make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -make-fetch-happen@^10.0.3, make-fetch-happen@^10.0.6: - version "10.2.1" - resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz#f5e3835c5e9817b617f2770870d9492d28678164" - integrity sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^16.1.0" - http-cache-semantics "^4.1.0" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^3.1.6" - minipass-collect "^1.0.2" - minipass-fetch "^2.0.3" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^9.0.0" - -make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.1.0: - version "11.1.1" - resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" - integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== - dependencies: - agentkeepalive "^4.2.1" - cacache "^17.0.0" - http-cache-semantics "^4.1.1" - http-proxy-agent "^5.0.0" - https-proxy-agent "^5.0.0" - is-lambda "^1.0.1" - lru-cache "^7.7.1" - minipass "^5.0.0" - minipass-fetch "^3.0.0" - minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - promise-retry "^2.0.1" - socks-proxy-agent "^7.0.0" - ssri "^10.0.0" - -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw= - dependencies: - tmpl "1.0.x" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - -map-obj@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" - integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -mathml-tag-names@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz#4ddadd67308e780cf16a47685878ee27b736a0a3" - integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== - -mdast-util-from-markdown@^0.8.0: - version "0.8.5" - resolved "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-0.8.5.tgz#d1ef2ca42bc377ecb0463a987910dae89bd9a28c" - integrity sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ== - dependencies: - "@types/mdast" "^3.0.0" - mdast-util-to-string "^2.0.0" - micromark "~2.11.0" - parse-entities "^2.0.0" - unist-util-stringify-position "^2.0.0" - -mdast-util-to-markdown@^0.6.0: - version "0.6.5" - resolved "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-0.6.5.tgz#b33f67ca820d69e6cc527a93d4039249b504bebe" - integrity sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ== - dependencies: - "@types/unist" "^2.0.0" - longest-streak "^2.0.0" - mdast-util-to-string "^2.0.0" - parse-entities "^2.0.0" - repeat-string "^1.0.0" - zwitch "^1.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz#b8cfe6a713e1091cb5b728fc48885a4767f8b97b" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -meow@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" - integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw== - dependencies: - "@types/minimist" "^1.2.0" - arrify "^2.0.1" - camelcase "^6.0.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "^4.0.2" - normalize-package-data "^2.5.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.13.1" - yargs-parser "^18.1.3" - -meow@^8.0.0: - version "8.1.2" - resolved "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -meow@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz#cd9510bc5cac9dee7d03c73ee1f9ad959f4ea364" - integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize "^1.2.0" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.2.3, merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -merge@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz#38bebf80c3220a8a487b6fcfb3941bb11720c145" - integrity sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ== - -micromark@~2.11.0: - version "2.11.4" - resolved "https://registry.npmjs.org/micromark/-/micromark-2.11.4.tgz#d13436138eea826383e822449c9a5c50ee44665a" - integrity sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA== - dependencies: - debug "^4.0.0" - parse-entities "^2.0.0" - -micromatch@^3.0.4: - version "3.1.10" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -micromatch@^4.0.0, micromatch@^4.0.2, micromatch@^4.0.4: - version "4.0.4" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" - integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg== - dependencies: - braces "^3.0.1" - picomatch "^2.2.3" - -mime-db@1.44.0: - version "1.44.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" - integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== - -mime-types@^2.1.12, mime-types@^2.1.27: - version "2.1.27" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" - integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== - dependencies: - mime-db "1.44.0" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-fn@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" - integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== - -min-indent@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" - integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= - -minimatch@3.0.5: - version "3.0.5" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz#4da8f1290ee0f0f8e83d60ca69f8f134068604a3" - integrity sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" - integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^6.1.6: - version "6.2.0" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz#2b70fd13294178c69c04dfc05aebdb97a4e79e42" - integrity sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^8.0.2: - version "8.0.4" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" - integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== - dependencies: - brace-expansion "^2.0.1" - -minimatch@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.0.tgz#bfc8e88a1c40ffd40c172ddac3decb8451503b56" - integrity sha512-0jJj8AvgKqWN05mrwuqi8QYKx1WmYSUoKSxu5Qhs9prezTz10sxAHGNZe9J9cqIJzta8DWsleh2KaVaLl6Ru2w== - dependencies: - brace-expansion "^2.0.1" - -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - -minimist-options@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.0.2.tgz#29c4021373ded40d546186725e57761e4b1984a7" - integrity sha512-seq4hpWkYSUh1y7NXxzucwAN9yVlBc3Upgdjz8vLCP97jG8kaOmzYrVH/m7tQ1NYD1wdtZbSLfdy4zFmRWuc/w== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - -minimist@1.2.5, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== - -minimist@^1.2.6: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -minipass-collect@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" - integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== - dependencies: - minipass "^3.0.0" - -minipass-fetch@^2.0.3: - version "2.1.2" - resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz#95560b50c472d81a3bc76f20ede80eaed76d8add" - integrity sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA== - dependencies: - minipass "^3.1.6" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-fetch@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz#d9df70085609864331b533c960fd4ffaa78d15ce" - integrity sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ== - dependencies: - minipass "^5.0.0" - minipass-sized "^1.0.3" - minizlib "^2.1.2" - optionalDependencies: - encoding "^0.1.13" - -minipass-flush@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" - integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== - dependencies: - minipass "^3.0.0" - -minipass-json-stream@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" - integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== - dependencies: - jsonparse "^1.3.1" - minipass "^3.0.0" - -minipass-pipeline@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" - integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== - dependencies: - minipass "^3.0.0" - -minipass-sized@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" - integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== - dependencies: - minipass "^3.0.0" - -minipass@^3.0.0, minipass@^3.1.1: - version "3.1.3" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" - integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== - dependencies: - yallist "^4.0.0" - -minipass@^3.1.6: - version "3.3.6" - resolved "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" - integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== - dependencies: - yallist "^4.0.0" - -minipass@^4.0.0, minipass@^4.2.4: - version "4.2.8" - resolved "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" - integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== - -minipass@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" - integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== - -minizlib@^2.1.1, minizlib@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" - integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== - dependencies: - minipass "^3.0.0" - yallist "^4.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp-infer-owner@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" - integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== - dependencies: - chownr "^2.0.0" - infer-owner "^1.0.4" - mkdirp "^1.0.3" - -"mkdirp@>=0.5 0": - version "0.5.5" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -mkdirp@^1.0.3, mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -modify-values@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" - integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@2.1.2, ms@^2.0.0: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multimatch@5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" - integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== - dependencies: - "@types/minimatch" "^3.0.3" - array-differ "^3.0.0" - array-union "^2.1.0" - arrify "^2.0.1" - minimatch "^3.0.4" - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -mute-stream@0.0.8, mute-stream@~0.0.4: - version "0.0.8" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -natural-compare@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - -negotiator@^0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.0, neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -node-addon-api@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161" - integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A== - -node-fetch@2.6.7: - version "2.6.7" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== - dependencies: - whatwg-url "^5.0.0" - -node-fetch@^2.6.7: - version "2.6.11" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz#cde7fc71deef3131ef80a738919f999e6edfff25" - integrity sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w== - dependencies: - whatwg-url "^5.0.0" - -node-gyp-build@^4.3.0: - version "4.6.0" - resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055" - integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ== - -node-gyp@^9.0.0: - version "9.3.1" - resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4" - integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg== - dependencies: - env-paths "^2.2.0" - glob "^7.1.4" - graceful-fs "^4.2.6" - make-fetch-happen "^10.0.3" - nopt "^6.0.0" - npmlog "^6.0.0" - rimraf "^3.0.2" - semver "^7.3.5" - tar "^6.1.2" - which "^2.0.2" - -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - -node-releases@^1.1.71: - version "1.1.72" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" - integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== - -node-releases@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - -nopt@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" - integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== - dependencies: - abbrev "^1.0.0" - -nopt@^7.0.0: - version "7.1.0" - resolved "https://registry.npmjs.org/nopt/-/nopt-7.1.0.tgz#91f6a3366182176e72ecab93a09c19b63b485f28" - integrity sha512-ZFPLe9Iu0tnx7oWhFxAo4s7QTn8+NNDDxYNaKLjE7Dp0tbakQ3M1QhQzsnzXHQBTUO3K9BmwaxnyO8Ayn2I95Q== - dependencies: - abbrev "^2.0.0" - -normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.0.tgz#1f8a7c423b3d2e85eb36985eaf81de381d01301a" - integrity sha512-6lUjEI0d3v6kFrtgA/lOx4zHCWULXsFNIjHolnZCKCTLA6m/G625cdn3O7eNmT0iD3jfo6HZ9cdImGZwf21prw== - dependencies: - hosted-git-info "^3.0.6" - resolve "^1.17.0" - semver "^7.3.2" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-4.0.1.tgz#b46b24e0616d06cadf9d5718b29b6d445a82a62c" - integrity sha512-EBk5QKKuocMJhB3BILuKhmaPjI8vNRSpIfO9woLC6NyHVkKKdVEdAO1mrT0ZfxNR1lKwCcTkuZfmGIFdizZ8Pg== - dependencies: - hosted-git-info "^5.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-package-data@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" - integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== - dependencies: - hosted-git-info "^6.0.0" - is-core-module "^2.8.1" - semver "^7.3.5" - validate-npm-package-license "^3.0.4" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" - integrity sha1-LRDAa9/TEuqXd2laTShDlFa3WUI= - -normalize-selector@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/normalize-selector/-/normalize-selector-0.2.0.tgz#d0b145eb691189c63a78d201dc4fdb1293ef0c03" - integrity sha1-0LFF62kRicY6eNIB3E/bEpPvDAM= - -npm-bundled@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" - integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== - dependencies: - npm-normalize-package-bin "^1.0.1" - -npm-bundled@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" - integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== - dependencies: - npm-normalize-package-bin "^3.0.0" - -npm-install-checks@^6.0.0: - version "6.1.1" - resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz#b459b621634d06546664207fde16810815808db1" - integrity sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw== - dependencies: - semver "^7.1.1" - -npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" - integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== - -npm-normalize-package-bin@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz#9447a1adaaf89d8ad0abe24c6c84ad614a675fff" - integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== - -npm-normalize-package-bin@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" - integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== - -npm-package-arg@8.1.1: - version "8.1.1" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.1.tgz#00ebf16ac395c63318e67ce66780a06db6df1b04" - integrity sha512-CsP95FhWQDwNqiYS+Q0mZ7FAEDytDZAkNxQqea6IaAFJTAY9Lhhqyl0irU/6PMc7BGfUmnsbHcqxJD7XuVM/rg== - dependencies: - hosted-git-info "^3.0.6" - semver "^7.0.0" - validate-npm-package-name "^3.0.0" - -npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" - integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== - dependencies: - hosted-git-info "^6.0.0" - proc-log "^3.0.0" - semver "^7.3.5" - validate-npm-package-name "^5.0.0" - -npm-package-arg@^9.0.1: - version "9.1.2" - resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-9.1.2.tgz#fc8acecb00235f42270dda446f36926ddd9ac2bc" - integrity sha512-pzd9rLEx4TfNJkovvlBSLGhq31gGu2QDexFPWT19yCDh0JgnRhlBLNo5759N0AJmBk+kQ9Y/hXoLnlgFD+ukmg== - dependencies: - hosted-git-info "^5.0.0" - proc-log "^2.0.1" - semver "^7.3.5" - validate-npm-package-name "^4.0.0" - -npm-packlist@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-5.1.1.tgz#79bcaf22a26b6c30aa4dd66b976d69cc286800e0" - integrity sha512-UfpSvQ5YKwctmodvPPkK6Fwk603aoVsf8AEbmVKAEECrfvL8SSe1A2YIwrJ6xmTHAITKPwwZsWo7WwEbNk0kxw== - dependencies: - glob "^8.0.1" - ignore-walk "^5.0.1" - npm-bundled "^1.1.2" - npm-normalize-package-bin "^1.0.1" - -npm-packlist@^7.0.0: - version "7.0.4" - resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" - integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== - dependencies: - ignore-walk "^6.0.0" - -npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz#c6acd97d1ad4c5dbb80eac7b386b03ffeb289e5f" - integrity sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA== - dependencies: - npm-install-checks "^6.0.0" - npm-normalize-package-bin "^3.0.0" - npm-package-arg "^10.0.0" - semver "^7.3.5" - -npm-registry-fetch@14.0.3: - version "14.0.3" - resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.3.tgz#8545e321c2b36d2c6fe6e009e77e9f0e527f547b" - integrity sha512-YaeRbVNpnWvsGOjX2wk5s85XJ7l1qQBGAp724h8e2CZFFhMSuw9enom7K1mWVUtvXO1uUSFIAPofQK0pPN0ZcA== - dependencies: - make-fetch-happen "^11.0.0" - minipass "^4.0.0" - minipass-fetch "^3.0.0" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^10.0.0" - proc-log "^3.0.0" - -npm-registry-fetch@^13.0.0: - version "13.3.1" - resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-13.3.1.tgz#bb078b5fa6c52774116ae501ba1af2a33166af7e" - integrity sha512-eukJPi++DKRTjSBRcDZSDDsGqRK3ehbxfFUcgaRd0Yp6kRwOwh2WVn0r+8rMB4nnuzvAk6rQVzl6K5CkYOmnvw== - dependencies: - make-fetch-happen "^10.0.6" - minipass "^3.1.6" - minipass-fetch "^2.0.3" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^9.0.1" - proc-log "^2.0.0" - -npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3: - version "14.0.5" - resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" - integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== - dependencies: - make-fetch-happen "^11.0.0" - minipass "^5.0.0" - minipass-fetch "^3.0.0" - minipass-json-stream "^1.0.1" - minizlib "^2.1.2" - npm-package-arg "^10.0.0" - proc-log "^3.0.0" - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== - dependencies: - path-key "^4.0.0" - -npmlog@6.0.2, npmlog@^6.0.0, npmlog@^6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" - integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== - dependencies: - are-we-there-yet "^3.0.0" - console-control-strings "^1.1.0" - gauge "^4.0.3" - set-blocking "^2.0.0" - -npmlog@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" - integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== - dependencies: - are-we-there-yet "^4.0.0" - console-control-strings "^1.1.0" - gauge "^5.0.0" - set-blocking "^2.0.0" - -num2fraction@^1.2.2: - version "1.2.2" - resolved "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" - integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4= - -nwsapi@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" - integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ== - -nx@15.9.4, "nx@>=15.5.2 < 16": - version "15.9.4" - resolved "https://registry.npmjs.org/nx/-/nx-15.9.4.tgz#1075bc33fe8ee6c6546c21ec6ffcfd2e000946c6" - integrity sha512-P1G4t59UvE/lkHyruLeSOB5ZuNyh01IwU0tTUOi8f9s/NbP7+OQ8MYVwDV74JHTr6mQgjlS+n+4Eox8tVm9itA== - dependencies: - "@nrwl/cli" "15.9.4" - "@nrwl/tao" "15.9.4" - "@parcel/watcher" "2.0.4" - "@yarnpkg/lockfile" "^1.1.0" - "@yarnpkg/parsers" "^3.0.0-rc.18" - "@zkochan/js-yaml" "0.0.6" - axios "^1.0.0" - chalk "^4.1.0" - cli-cursor "3.1.0" - cli-spinners "2.6.1" - cliui "^7.0.2" - dotenv "~10.0.0" - enquirer "~2.3.6" - fast-glob "3.2.7" - figures "3.2.0" - flat "^5.0.2" - fs-extra "^11.1.0" - glob "7.1.4" - ignore "^5.0.4" - js-yaml "4.1.0" - jsonc-parser "3.2.0" - lines-and-columns "~2.0.3" - minimatch "3.0.5" - npm-run-path "^4.0.1" - open "^8.4.0" - semver "7.3.4" - string-width "^4.2.3" - strong-log-transformer "^2.1.0" - tar-stream "~2.2.0" - tmp "~0.2.1" - tsconfig-paths "^4.1.2" - tslib "^2.3.0" - v8-compile-cache "2.3.0" - yargs "^17.6.2" - yargs-parser "21.1.1" - optionalDependencies: - "@nrwl/nx-darwin-arm64" "15.9.4" - "@nrwl/nx-darwin-x64" "15.9.4" - "@nrwl/nx-linux-arm-gnueabihf" "15.9.4" - "@nrwl/nx-linux-arm64-gnu" "15.9.4" - "@nrwl/nx-linux-arm64-musl" "15.9.4" - "@nrwl/nx-linux-x64-gnu" "15.9.4" - "@nrwl/nx-linux-x64-musl" "15.9.4" - "@nrwl/nx-win32-arm64-msvc" "15.9.4" - "@nrwl/nx-win32-x64-msvc" "15.9.4" - -object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-inspect@^1.12.0: - version "1.12.0" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0" - integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== - -object-inspect@^1.12.3, object-inspect@^1.9.0: - version "1.12.3" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz#ba62dffd67ee256c8c086dfae69e016cd1f198b9" - integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -onetime@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5" - integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q== - dependencies: - mimic-fn "^2.1.0" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -onetime@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz#7c24c18ed1fd2e9bca4bd26806a33613c77d34b4" - integrity sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ== - dependencies: - mimic-fn "^4.0.0" - -open@^7.4.2: - version "7.4.2" - resolved "https://registry.npmjs.org/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" - integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== - dependencies: - is-docker "^2.0.0" - is-wsl "^2.1.1" - -open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -open@^9.1.0: - version "9.1.0" - resolved "https://registry.npmjs.org/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - -optionator@^0.8.1: - version "0.8.3" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== - 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.3" - -ora@^5.4.1: - version "5.4.1" - resolved "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz#1b2678426af4ac4a509008e5e4ac9e9959db9e18" - integrity sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== - dependencies: - bl "^4.1.0" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-spinners "^2.5.0" - is-interactive "^1.0.0" - is-unicode-supported "^0.1.0" - log-symbols "^4.1.0" - strip-ansi "^6.0.0" - wcwidth "^1.0.1" - -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz#1664e010af3cadc681baafd3e2a437be7b0fb5fe" - integrity sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map-series@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/p-map-series/-/p-map-series-2.1.0.tgz#7560d4c452d9da0c07e692fdbfe6e2c81a2a91f2" - integrity sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== - -p-map@4.0.0, p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-pipe@3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/p-pipe/-/p-pipe-3.1.0.tgz#48b57c922aa2e1af6a6404cb7c6bf0eb9cc8e60e" - integrity sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== - -p-queue@6.6.2: - version "6.6.2" - resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz#2068a9dcf8e67dd0ec3e7a2bcb76810faa85e426" - integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== - dependencies: - eventemitter3 "^4.0.4" - p-timeout "^3.2.0" - -p-reduce@2.1.0, p-reduce@^2.0.0, p-reduce@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/p-reduce/-/p-reduce-2.1.0.tgz#09408da49507c6c274faa31f28df334bc712b64a" - integrity sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== - -p-timeout@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" - integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== - dependencies: - p-finally "^1.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -p-waterfall@2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/p-waterfall/-/p-waterfall-2.1.1.tgz#63153a774f472ccdc4eb281cdb2967fcf158b2ee" - integrity sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== - dependencies: - p-reduce "^2.0.0" - -pacote@15.1.1: - version "15.1.1" - resolved "https://registry.npmjs.org/pacote/-/pacote-15.1.1.tgz#94d8c6e0605e04d427610b3aacb0357073978348" - integrity sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ== - dependencies: - "@npmcli/git" "^4.0.0" - "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/promise-spawn" "^6.0.1" - "@npmcli/run-script" "^6.0.0" - cacache "^17.0.0" - fs-minipass "^3.0.0" - minipass "^4.0.0" - npm-package-arg "^10.0.0" - npm-packlist "^7.0.0" - npm-pick-manifest "^8.0.0" - npm-registry-fetch "^14.0.0" - proc-log "^3.0.0" - promise-retry "^2.0.1" - read-package-json "^6.0.0" - read-package-json-fast "^3.0.0" - sigstore "^1.0.0" - ssri "^10.0.0" - tar "^6.1.11" - -pacote@^15.0.0, pacote@^15.0.8: - version "15.1.3" - resolved "https://registry.npmjs.org/pacote/-/pacote-15.1.3.tgz#4c0e7fb5e7ab3b27fb3f86514b451ad4c4f64e9d" - integrity sha512-aRts8cZqxiJVDitmAh+3z+FxuO3tLNWEmwDRPEpDDiZJaRz06clP4XX112ynMT5uF0QNoMPajBBHnaStUEPJXA== - dependencies: - "@npmcli/git" "^4.0.0" - "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/promise-spawn" "^6.0.1" - "@npmcli/run-script" "^6.0.0" - cacache "^17.0.0" - fs-minipass "^3.0.0" - minipass "^5.0.0" - npm-package-arg "^10.0.0" - npm-packlist "^7.0.0" - npm-pick-manifest "^8.0.0" - npm-registry-fetch "^14.0.0" - proc-log "^3.0.0" - promise-retry "^2.0.1" - read-package-json "^6.0.0" - read-package-json-fast "^3.0.0" - sigstore "^1.3.0" - ssri "^10.0.0" - tar "^6.1.11" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-conflict-json@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" - integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== - dependencies: - json-parse-even-better-errors "^3.0.0" - just-diff "^6.0.0" - just-diff-apply "^5.2.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz#53c6eb5b9314a1f4ec99fa0fdf7ce01ecda0cbe8" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" - integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= - dependencies: - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - -parse-json@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" - integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-better-errors "^1.0.1" - lines-and-columns "^1.1.6" - -parse-json@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -parse-path@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz#605a2d58d0a749c8594405d8cc3a2bf76d16099b" - integrity sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== - dependencies: - protocols "^2.0.0" - -parse-url@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz#972e0827ed4b57fc85f0ea6b0d839f0d8a57a57d" - integrity sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== - dependencies: - parse-path "^7.0.0" - -parse5@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -patch-console@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/patch-console/-/patch-console-1.0.0.tgz#19b9f028713feb8a3c023702a8cc8cb9f7466f9d" - integrity sha512-nxl9nrnLQmh64iTzMfyylSlRozL7kAXIaxw1fVcLYdyhNkJCRUzirRZTikXGJsg+hc4fqpneTK6iU2H1Q8THSA== - -patch-package@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" - integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== - dependencies: - "@yarnpkg/lockfile" "^1.1.0" - chalk "^4.1.2" - ci-info "^3.7.0" - cross-spawn "^7.0.3" - find-yarn-workspace-root "^2.0.0" - fs-extra "^9.0.0" - json-stable-stringify "^1.0.2" - klaw-sync "^6.0.0" - minimist "^1.2.6" - open "^7.4.2" - rimraf "^2.6.3" - semver "^7.5.3" - slash "^2.0.0" - tmp "^0.0.33" - yaml "^2.2.2" - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-key@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz#295588dc3aee64154f877adb9d780b81c554bf18" - integrity sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ== - -path-parse@^1.0.6, path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-scurry@^1.6.1, path-scurry@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.8.0.tgz#809e09690c63817c76d0183f19a5b21b530ff7d2" - integrity sha512-IjTrKseM404/UAWA8bBbL3Qp6O2wXkanuIE3seCxBH7ctRuvH1QRawy1N3nVDHGkdeZsjOsSe/8AQBL/VQCy2g== - dependencies: - lru-cache "^9.1.1" - minipass "^5.0.0" - -path-type@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" - integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== - dependencies: - pify "^3.0.0" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -picomatch@^2.2.2: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -picomatch@^2.2.3: - version "2.2.3" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d" - integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg== - -pidtree@^0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/pidtree/-/pidtree-0.5.0.tgz#ad5fbc1de78b8a5f99d6fbdd4f6e4eee21d1aca1" - integrity sha512-9nxspIM7OpZuhBxPg73Zvyq7j1QMPMPsGKTqRc2XOaFQauDvoNz9fM1Wdkjmeo7l9GXOZiRs97sPkuayl39wjA== - -pify@5.0.0, pify@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f" - integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== - -pify@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pirates@^4.0.4: - version "4.0.5" - resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== - -pkg-dir@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -postcss-html@^0.36.0: - version "0.36.0" - resolved "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz#b40913f94eaacc2453fd30a1327ad6ee1f88b204" - integrity sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw== - dependencies: - htmlparser2 "^3.10.0" - -postcss-less@^3.1.4: - version "3.1.4" - resolved "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz#369f58642b5928ef898ffbc1a6e93c958304c5ad" - integrity sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA== - dependencies: - postcss "^7.0.14" - -postcss-media-query-parser@^0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz#27b39c6f4d94f81b1a73b8f76351c609e5cef244" - integrity sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ= - -postcss-resolve-nested-selector@^0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz#29ccbc7c37dedfac304e9fff0bf1596b3f6a0e4e" - integrity sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4= - -postcss-safe-parser@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz#a6d4e48f0f37d9f7c11b2a581bf00f8ba4870b96" - integrity sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g== - dependencies: - postcss "^7.0.26" - -postcss-sass@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz#91f0f3447b45ce373227a98b61f8d8f0785285a3" - integrity sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg== - dependencies: - gonzales-pe "^4.3.0" - postcss "^7.0.21" - -postcss-scss@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.1.1.tgz#ec3a75fa29a55e016b90bf3269026c53c1d2b383" - integrity sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA== - dependencies: - postcss "^7.0.6" - -postcss-selector-parser@^6.0.10: - version "6.0.12" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz#2efae5ffab3c8bfb2b7fbf0c426e3bca616c4abb" - integrity sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-selector-parser@^6.0.5: - version "6.0.5" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.5.tgz#042d74e137db83e6f294712096cb413f5aa612c4" - integrity sha512-aFYPoYmXbZ1V6HZaSvat08M97A8HqO6Pjz+PiNpw/DhuRrC72XWAdp3hL6wusDCN31sSmcZyMGa2hZEuX+Xfhg== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-sorting@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-5.0.1.tgz#10d5d0059eea8334dacc820c0121864035bc3f11" - integrity sha512-Y9fUFkIhfrm6i0Ta3n+89j56EFqaNRdUKqXyRp6kvTcSXnmgEjaVowCXH+JBe9+YKWqd4nc28r2sgwnzJalccA== - dependencies: - lodash "^4.17.14" - postcss "^7.0.17" - -postcss-syntax@^0.36.2: - version "0.36.2" - resolved "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz#f08578c7d95834574e5593a82dfbfa8afae3b51c" - integrity sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w== - -postcss-value-parser@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" - integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== - -postcss@7.x.x, postcss@^7.0.14, postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.21, postcss@^7.0.26, postcss@^7.0.31, postcss@^7.0.32, postcss@^7.0.35, postcss@^7.0.6: - version "7.0.36" - resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz#056f8cffa939662a8f5905950c07d5285644dfcb" - integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw== - dependencies: - chalk "^2.4.2" - source-map "^0.6.1" - supports-color "^6.1.0" - -prelude-ls@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" - integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== - -prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - -prettier-linter-helpers@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" - integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== - dependencies: - fast-diff "^1.1.2" - -prettier@^2.2.1, prettier@^2.3.2: - version "2.5.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" - integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== - -pretty-format@29.4.3: - version "29.4.3" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.3.tgz#25500ada21a53c9e8423205cf0337056b201244c" - integrity sha512-cvpcHTc42lcsvOOAzd3XuNWTcvk1Jmnzqeu+WsOuiPmxUJTnkbAcFNsRKvEpBEUFVUgy/GTZLulZDcDEi+CIlA== - dependencies: - "@jest/schemas" "^29.4.3" - ansi-styles "^5.0.0" - react-is "^18.0.0" - -pretty-format@^27.0.0, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" - -proc-log@^2.0.0, proc-log@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" - integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== - -proc-log@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" - integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== - -progress@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" - integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== - -promise-all-reject-late@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" - integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== - -promise-call-limit@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" - integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -promise-retry@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" - integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== - dependencies: - err-code "^2.0.2" - retry "^0.12.0" - -prompts@^2.0.1: - version "2.3.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz#480572d89ecf39566d2bd3fe2c9fccb7c4c0b068" - integrity sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.4" - -promzard@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" - integrity sha1-JqXW7ox97kyxIggwWs+5O6OCqe4= - dependencies: - read "1" - -prop-types@^15.6.2: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -proto-list@~1.2.1: - version "1.2.4" - resolved "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" - integrity sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk= - -protocols@^2.0.0, protocols@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" - integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== - -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - -psl@^1.1.33: - version "1.8.0" - resolved "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== - -punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -q@^1.5.1: - version "1.5.1" - resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" - integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= - -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -react-devtools-core@^4.19.1: - version "4.21.0" - resolved "https://registry.npmjs.org/react-devtools-core/-/react-devtools-core-4.21.0.tgz#a54c9a0fd7261491e616d6c87d1869e011d8521d" - integrity sha512-clGWwJHV5MHwTwYyKc+7FZHwzdbzrD2/AoZSkicUcr6YLc3Za9a9FaLhccWDHfjQ+ron9yzNhDT6Tv+FiPkD3g== - dependencies: - shell-quote "^1.6.1" - ws "^7" - -react-is@^16.13.1: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - -react-is@^18.0.0: - version "18.2.0" - resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" - integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== - -react-reconciler@^0.26.2: - version "0.26.2" - resolved "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.26.2.tgz#bbad0e2d1309423f76cf3c3309ac6c96e05e9d91" - integrity sha512-nK6kgY28HwrMNwDnMui3dvm3rCFjZrcGiuwLc5COUipBK5hWHLOxMJhSnSomirqWwjPBJKV1QcbkI0VJr7Gl1Q== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react@^16.14.0: - version "16.14.0" - resolved "https://registry.npmjs.org/react/-/react-16.14.0.tgz#94d776ddd0aaa37da3eda8fc5b6b18a4c9a3114d" - integrity sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - prop-types "^15.6.2" - -read-cmd-shim@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-3.0.0.tgz#62b8c638225c61e6cc607f8f4b779f3b8238f155" - integrity sha512-KQDVjGqhZk92PPNRj9ZEXEuqg8bUobSKRw+q0YQ3TKI5xkce7bUJobL4Z/OtiEbAAv70yEpYIXp4iQ9L8oPVog== - -read-cmd-shim@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" - integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== - -read-package-json-fast@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz#323ca529630da82cb34b36cc0b996693c98c2b83" - integrity sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ== - dependencies: - json-parse-even-better-errors "^2.3.0" - npm-normalize-package-bin "^1.0.1" - -read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" - integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== - dependencies: - json-parse-even-better-errors "^3.0.0" - npm-normalize-package-bin "^3.0.0" - -read-package-json@5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.1.tgz#1ed685d95ce258954596b13e2e0e76c7d0ab4c26" - integrity sha512-MALHuNgYWdGW3gKzuNMuYtcSSZbGQm94fAp16xt8VsYTLBjUSc55bLMKe6gzpWue0Tfi6CBgwCSdDAqutGDhMg== - dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^1.0.1" - -read-package-json@^2.0.10: - version "2.1.2" - resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz#6992b2b66c7177259feb8eaac73c3acd28b9222a" - integrity sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA== - dependencies: - glob "^7.1.1" - json-parse-even-better-errors "^2.3.0" - normalize-package-data "^2.0.0" - npm-normalize-package-bin "^1.0.0" - -read-package-json@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-5.0.2.tgz#b8779ccfd169f523b67208a89cc912e3f663f3fa" - integrity sha512-BSzugrt4kQ/Z0krro8zhTwV1Kd79ue25IhNN/VtHFy1mG/6Tluyi+msc0UpwaoQzxSHa28mntAjIZY6kEgfR9Q== - dependencies: - glob "^8.0.1" - json-parse-even-better-errors "^2.3.1" - normalize-package-data "^4.0.0" - npm-normalize-package-bin "^2.0.0" - -read-package-json@^6.0.0: - version "6.0.3" - resolved "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.3.tgz#726116b75e00eac2075240995f05681af4ca7122" - integrity sha512-4QbpReW4kxFgeBQ0vPAqh2y8sXEB3D4t3jsXbJKIhBiF80KT6XRo45reqwtftju5J6ru1ax06A2Gb/wM1qCOEQ== - dependencies: - glob "^10.2.2" - json-parse-even-better-errors "^3.0.0" - normalize-package-data "^5.0.0" - npm-normalize-package-bin "^3.0.0" - -read-pkg-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" - integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= - dependencies: - find-up "^2.0.0" - read-pkg "^3.0.0" - -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" - integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= - dependencies: - load-json-file "^4.0.0" - normalize-package-data "^2.3.2" - path-type "^3.0.0" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -read@1, read@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" - integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= - dependencies: - mute-stream "~0.0.4" - -"readable-stream@2 || 3", readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.1.1: - version "3.6.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^2.0.2, readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@^4.1.0: - version "4.4.0" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.0.tgz#55ce132d60a988c460d75c631e9ccf6a7229b468" - integrity sha512-kDMOq0qLtxV9f/SQv522h8cxZBqNZXuXNyjyezmfAAuribMyVXziljpQ/uQhfE1XLg2/TLTW2DsnoE4VAi/krg== - dependencies: - abort-controller "^3.0.0" - buffer "^6.0.3" - events "^3.3.0" - process "^0.11.10" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -rechoir@^0.8.0: - version "0.8.0" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" - integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== - dependencies: - resolve "^1.20.0" - -redent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" - integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== - dependencies: - indent-string "^4.0.0" - strip-indent "^3.0.0" - -reflect-metadata@^0.1.2: - version "0.1.13" - resolved "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" - integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -regexp.prototype.flags@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz#fe7ce25e7e4cca8db37b6634c8a2c7009199b9cb" - integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - functions-have-names "^1.2.3" - -regexpp@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" - integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - -remark-parse@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz#4d20a299665880e4f4af5d90b7c7b8a935853640" - integrity sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw== - dependencies: - mdast-util-from-markdown "^0.8.0" - -remark-stringify@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/remark-stringify/-/remark-stringify-9.0.1.tgz#576d06e910548b0a7191a71f27b33f1218862894" - integrity sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg== - dependencies: - mdast-util-to-markdown "^0.6.0" - -remark@^13.0.0: - version "13.0.0" - resolved "https://registry.npmjs.org/remark/-/remark-13.0.0.tgz#d15d9bf71a402f40287ebe36067b66d54868e425" - integrity sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA== - dependencies: - remark-parse "^9.0.0" - remark-stringify "^9.0.0" - unified "^9.1.0" - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.0.0, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -resolve-cwd@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" - integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== - dependencies: - resolve-from "^5.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-global@1.0.0, resolve-global@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" - integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== - dependencies: - global-dirs "^0.1.1" - -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve.exports@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz#5ce842b94b05146c0e03076985d1d0e7e48c90c9" - integrity sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ== - -resolve@^1.1.7, resolve@^1.10.0, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.3.2: - version "1.20.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - -resolve@^1.19.0: - version "1.22.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== - dependencies: - is-core-module "^2.8.1" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.22.1: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@~1.17.0: - version "1.17.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" - integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== - dependencies: - path-parse "^1.0.6" - -resolve@~1.19.0: - version "1.19.0" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz#1af5bf630409734a067cae29318aac7fa29a267c" - integrity sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg== - dependencies: - is-core-module "^2.1.0" - path-parse "^1.0.6" - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rfdc@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz#d0b7c441ab2720d05dc4cf26e01c89631d9da08b" - integrity sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA== - -rimraf@2, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -rimraf@^3.0.0, rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rimraf@^4.4.1: - version "4.4.1" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" - integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== - dependencies: - glob "^9.2.0" - -rollup@^2.72.1: - version "2.72.1" - resolved "https://registry.npmjs.org/rollup/-/rollup-2.72.1.tgz#861c94790537b10008f0ca0fbc60e631aabdd045" - integrity sha512-NTc5UGy/NWFGpSqF1lFY8z9Adri6uhyMLI6LvPAXdBKoPRFhIIiBUpt+Qg2awixqO3xvzSijjhnb4+QEZwJmxA== - optionalDependencies: - fsevents "~2.3.2" - -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - -run-async@^2.2.0, run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - -run-parallel@^1.1.9: - version "1.1.9" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz#c9dd3a7cf9f4b2c4b6244e173a6ed866e61dd679" - integrity sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q== - -rxjs@^6.4.0: - version "6.5.5" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec" - integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ== - dependencies: - tslib "^1.9.0" - -rxjs@^7.1.0: - version "7.3.0" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz#39fe4f3461dc1e50be1475b2b85a0a88c1e938c6" - integrity sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw== - dependencies: - tslib "~2.1.0" - -rxjs@^7.5.5: - version "7.5.5" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz#2ebad89af0f560f460ad5cc4213219e1f7dd4e9f" - integrity sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw== - dependencies: - tslib "^2.1.0" - -safe-array-concat@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz#2064223cba3c08d2ee05148eedbc563cd6d84060" - integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.0" - has-symbols "^1.0.3" - isarray "^2.0.5" - -safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" - is-regex "^1.1.4" - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -saxes@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" - integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== - dependencies: - xmlchars "^2.2.0" - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@^3.1.1, schema-utils@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz#36c10abca6f7577aeae136c804b0c741edeadc99" - integrity sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.3.4: - version "7.3.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -semver@7.3.5, semver@7.x, semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@~7.3.0: - version "7.3.5" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== - dependencies: - lru-cache "^6.0.0" - -semver@7.3.8: - version "7.3.8" - resolved "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" - integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== - dependencies: - lru-cache "^6.0.0" - -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.7, semver@^7.3.8: - version "7.5.0" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz#ed8c5dc8efb6c629c88b23d41dc9bf40c1d96cd0" - integrity sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.5.3: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -set-blocking@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.6.1: - version "1.7.3" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" - integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@3.0.7, signal-exit@^3.0.7: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -signal-exit@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.2.tgz#ff55bb1d9ff2114c13b400688fa544ac63c36967" - integrity sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q== - -sigstore@^1.0.0, sigstore@^1.3.0, sigstore@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/sigstore/-/sigstore-1.4.0.tgz#2e3a28c08b1b8246744c27cfb179c525c3f164d8" - integrity sha512-N7TRpSbFjY/TrFDg6yGAQSYBrQ5s6qmPiq4pD6fkv1LoyfMsLG0NwZWG2s5q+uttLHgyVyTa0Rogx2P78rN8kQ== - dependencies: - "@sigstore/protobuf-specs" "^0.1.0" - make-fetch-happen "^11.0.1" - tuf-js "^1.1.3" - -simple-git@^3.6.0: - version "3.17.0" - resolved "https://registry.npmjs.org/simple-git/-/simple-git-3.17.0.tgz#1a961fa43f697b4e2391cf34c8a0554ef84fed8e" - integrity sha512-JozI/s8jr3nvLd9yn2jzPVHnhVzt7t7QWfcIoDcqRIGN+f1IINGv52xoZti2kkYfoRhhRvzMSNPfogHMp97rlw== - dependencies: - "@kwsites/file-exists" "^1.1.1" - "@kwsites/promise-deferred" "^1.1.1" - debug "^4.3.4" - -sisteransi@^1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -slash@3.0.0, slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" - integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slice-ansi@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787" - integrity sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" - integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== - dependencies: - ansi-styles "^4.0.0" - astral-regex "^2.0.0" - is-fullwidth-code-point "^3.0.0" - -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz#b73063c57aa96f9cd881654b15294d95d285c42a" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - -smart-buffer@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" - integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -socks-proxy-agent@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" - integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== - dependencies: - agent-base "^6.0.2" - debug "^4.3.3" - socks "^2.6.2" - -socks@^2.6.2: - version "2.7.1" - resolved "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" - integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== - dependencies: - ip "^2.0.0" - smart-buffer "^4.2.0" - -sort-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz#658535584861ec97d730d6cf41822e1f56684128" - integrity sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg= - dependencies: - is-plain-obj "^1.0.0" - -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@^0.5.6, source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.0, source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -source-map@^0.7.3: - version "0.7.3" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" - integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== - -sourcemap-codec@^1.4.4, sourcemap-codec@^1.4.8: - version "1.4.8" - resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" - integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== - -spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== - -specificity@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz#aab5e645012db08ba182e151165738d00887b019" - integrity sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -split2@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" - integrity sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw== - dependencies: - through2 "^2.0.2" - -split2@^3.0.0: - version "3.2.2" - resolved "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - -split@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" - integrity sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - -ssri@9.0.1, ssri@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057" - integrity sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q== - dependencies: - minipass "^3.1.1" - -ssri@^10.0.0, ssri@^10.0.1: - version "10.0.4" - resolved "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz#5a20af378be586df139ddb2dfb3bf992cf0daba6" - integrity sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ== - dependencies: - minipass "^5.0.0" - -stack-utils@^2.0.2, stack-utils@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277" - integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw== - dependencies: - escape-string-regexp "^2.0.0" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -string-argv@^0.3.1, string-argv@~0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" - integrity sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg== - -string-length@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.1.tgz#4a973bf31ef77c4edbceadd6af2611996985f8a1" - integrity sha512-PKyXUd0LK0ePjSOnWn34V2uD6acUWev9uy0Ft05k0E8xRW+SKcA0F7eMr7h5xlzfn+4O3N+55rduYyet3Jk+jw== - dependencies: - char-regex "^1.0.2" - strip-ansi "^6.0.0" - -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5" - integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string.prototype.trim@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz#a68352740859f6893f14ce3ef1bb3037f7a90533" - integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== - dependencies: - ansi-regex "^6.0.1" - -strip-bom@4.0.0, strip-bom@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" - integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== - -strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-final-newline@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz#52894c313fbff318835280aed60ff71ebf12b8fd" - integrity sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw== - -strip-indent@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz#c32e1cee940b6b3432c771bc2c54bcce73cd3001" - integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== - dependencies: - min-indent "^1.0.0" - -strip-json-comments@3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz#85713975a91fb87bf1b305cca77395e40d2a64a7" - integrity sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw== - -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strong-log-transformer@2.1.0, strong-log-transformer@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz#0f5ed78d325e0421ac6f90f7f10e691d6ae3ae10" - integrity sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA== - dependencies: - duplexer "^0.1.1" - minimist "^1.2.0" - through "^2.3.4" - -style-search@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" - integrity sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI= - -stylelint-order@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/stylelint-order/-/stylelint-order-4.1.0.tgz#692d05b7d0c235ac66fcf5ea1d9e5f08a76747f6" - integrity sha512-sVTikaDvMqg2aJjh4r48jsdfmqLT+nqB1MOsaBnvM3OwLx4S+WXcsxsgk5w18h/OZoxZCxuyXMh61iBHcj9Qiw== - dependencies: - lodash "^4.17.15" - postcss "^7.0.31" - postcss-sorting "^5.0.1" - -stylelint@^13.11.0: - version "13.13.1" - resolved "https://registry.npmjs.org/stylelint/-/stylelint-13.13.1.tgz#fca9c9f5de7990ab26a00f167b8978f083a18f3c" - integrity sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ== - dependencies: - "@stylelint/postcss-css-in-js" "^0.37.2" - "@stylelint/postcss-markdown" "^0.36.2" - autoprefixer "^9.8.6" - balanced-match "^2.0.0" - chalk "^4.1.1" - cosmiconfig "^7.0.0" - debug "^4.3.1" - execall "^2.0.0" - fast-glob "^3.2.5" - fastest-levenshtein "^1.0.12" - file-entry-cache "^6.0.1" - get-stdin "^8.0.0" - global-modules "^2.0.0" - globby "^11.0.3" - globjoin "^0.1.4" - html-tags "^3.1.0" - ignore "^5.1.8" - import-lazy "^4.0.0" - imurmurhash "^0.1.4" - known-css-properties "^0.21.0" - lodash "^4.17.21" - log-symbols "^4.1.0" - mathml-tag-names "^2.1.3" - meow "^9.0.0" - micromatch "^4.0.4" - normalize-selector "^0.2.0" - postcss "^7.0.35" - postcss-html "^0.36.0" - postcss-less "^3.1.4" - postcss-media-query-parser "^0.2.3" - postcss-resolve-nested-selector "^0.1.1" - postcss-safe-parser "^4.0.2" - postcss-sass "^0.4.4" - postcss-scss "^2.1.1" - postcss-selector-parser "^6.0.5" - postcss-syntax "^0.36.2" - postcss-value-parser "^4.1.0" - resolve-from "^5.0.0" - slash "^3.0.0" - specificity "^0.4.1" - string-width "^4.2.2" - strip-ansi "^6.0.0" - style-search "^0.1.0" - sugarss "^2.0.0" - svg-tags "^1.0.0" - table "^6.6.0" - v8-compile-cache "^2.3.0" - write-file-atomic "^3.0.3" - -sugarss@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz#ddd76e0124b297d40bf3cca31c8b22ecb43bc61d" - integrity sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ== - dependencies: - postcss "^7.0.2" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.0.0, supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^9.2.1: - version "9.2.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-9.2.1.tgz#599dc9d45acf74c6176e0d880bab1d7d718fe891" - integrity sha512-Obv7ycoCTG51N7y175StI9BlAXrmgZrFhZOb0/PyjHBher/NmsdBgbbQ1Inhq+gIhz6+7Gb+jWF2Vqi7Mf1xnQ== - -supports-hyperlinks@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.1.0.tgz#f663df252af5f37c5d49bbd7eeefa9e0b9e59e47" - integrity sha512-zoE5/e+dnEijk6ASB6/qrK+oYdm2do1hjoLWrqUC/8WEIW1gbxFcKuBof7sW8ArN6e+AYvsE8HBGiVRWL/F5CA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-tags@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" - integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= - -symbol-tree@^3.2.4: - version "3.2.4" - resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" - integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== - -synckit@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" - integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q== - dependencies: - "@pkgr/utils" "^2.3.1" - tslib "^2.5.0" - -table@^6.0.9, table@^6.6.0: - version "6.7.1" - resolved "https://registry.npmjs.org/table/-/table-6.7.1.tgz#ee05592b7143831a8c94f3cee6aae4c1ccef33e2" - integrity sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg== - dependencies: - ajv "^8.0.1" - lodash.clonedeep "^4.5.0" - lodash.truncate "^4.4.2" - slice-ansi "^4.0.0" - string-width "^4.2.0" - strip-ansi "^6.0.0" - -tapable@^2.1.1, tapable@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" - integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== - -tar-stream@~2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== - dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -tar@6.1.11: - version "6.1.11" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" - integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^3.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -tar@^6.1.11, tar@^6.1.2: - version "6.1.14" - resolved "https://registry.npmjs.org/tar/-/tar-6.1.14.tgz#e87926bec1cfe7c9e783a77a79f3e81c1cfa3b66" - integrity sha512-piERznXu0U7/pW7cdSn7hjqySIVTYT6F76icmFk7ptU7dDYlXTm5r9A6K04R2vU3olYgoKeo1Cg3eeu5nhftAw== - dependencies: - chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" - mkdirp "^1.0.3" - yallist "^4.0.0" - -temp-dir@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== - -temp-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e" - integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== - -tempy@1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/tempy/-/tempy-1.0.0.tgz#4f192b3ee3328a2684d0e3fc5c491425395aab65" - integrity sha512-eLXG5B1G0mRPHmgH2WydPl5v4jH35qEn3y/rA/aahKhIa91Pn119SsU7n7v/433gtT9ONzC8ISvNHIh2JSTm0w== - dependencies: - del "^6.0.0" - is-stream "^2.0.0" - temp-dir "^2.0.0" - type-fest "^0.16.0" - unique-string "^2.0.0" - -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - -terser-webpack-plugin@^5.3.7: - version "5.3.8" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz#415e03d2508f7de63d59eca85c5d102838f06610" - integrity sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser@^5.16.8: - version "5.17.3" - resolved "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz#7f908f16b3cdf3f6c0f8338e6c1c674837f90d25" - integrity sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg== - dependencies: - "@jridgewell/source-map" "^0.3.2" - acorn "^8.5.0" - commander "^2.20.0" - source-map-support "~0.5.20" - -test-exclude@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" - integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== - dependencies: - "@istanbuljs/schema" "^0.1.2" - glob "^7.1.4" - minimatch "^3.0.4" - -text-extensions@^1.0.0: - version "1.9.0" - resolved "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26" - integrity sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - -throat@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/throat/-/throat-6.0.1.tgz#d514fedad95740c12c2d7fc70ea863eb51ade375" - integrity sha512-8hmiGIJMDlwjg7dlJ4yKGLK8EsYqKgPWbG3b4wjJddKNwc7N7Dpn08Df4szr/sZdMVeOstrdYSsqzX6BYbcB+w== - -through2@^2.0.0, through2@^2.0.2: - version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -through2@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz#39276e713c3302edf9e388dd9c812dd3b825bd5a" - integrity sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww== - dependencies: - readable-stream "2 || 3" - -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - -through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6, through@^2.3.8: - version "2.3.8" - resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timsort@~0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz#405411a8e7e6339fe64db9a234de11dc31e02bd4" - integrity sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q= - -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -tmp@~0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14" - integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== - dependencies: - rimraf "^3.0.0" - -tmpl@1.0.x: - version "1.0.5" - resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" - integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" - integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tough-cookie@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4" - integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg== - dependencies: - psl "^1.1.33" - punycode "^2.1.1" - universalify "^0.1.2" - -tr46@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" - integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== - dependencies: - punycode "^2.1.1" - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - -"traverse@>=0.3.0 <0.4": - version "0.3.9" - resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" - integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= - -treeverse@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" - integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== - -trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== - -trim-off-newlines@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz#8df24847fcb821b0ab27d58ab6efec9f2fe961a1" - integrity sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz#b8b639cefad7d0bb2abd37d433ff8293efa5f406" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -ts-jest@^27.0.5: - version "27.1.3" - resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.3.tgz#1f723e7e74027c4da92c0ffbd73287e8af2b2957" - integrity sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA== - dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" - jest-util "^27.0.0" - json5 "2.x" - lodash.memoize "4.x" - make-error "1.x" - semver "7.x" - yargs-parser "20.x" - -ts-loader@^9.4.2: - version "9.4.2" - resolved "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz#80a45eee92dd5170b900b3d00abcfa14949aeb78" - integrity sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA== - dependencies: - chalk "^4.1.0" - enhanced-resolve "^5.0.0" - micromatch "^4.0.0" - semver "^7.3.4" - -ts-node@^10.2.1: - version "10.4.0" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.4.0.tgz#680f88945885f4e6cf450e7f0d6223dd404895f7" - integrity sha512-g0FlPvvCXSIO1JDF6S232P5jPYqBkRL9qly81ZgAOSU7rwI0stphCgd2kLiCrU9DjQCrJMWEqcNSjQL02s6d8A== - dependencies: - "@cspotcode/source-map-support" "0.7.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - yn "3.1.1" - -ts-node@^10.7.0: - version "10.7.0" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz#35d503d0fab3e2baa672a0e94f4b40653c2463f5" - integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A== - dependencies: - "@cspotcode/source-map-support" "0.7.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.0" - yn "3.1.1" - -tsconfig-paths@^3.14.1: - version "3.14.2" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz#6e32f1f79412decd261f92d633a9dc1cfa99f088" - integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== - dependencies: - "@types/json5" "^0.0.29" - json5 "^1.0.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tsconfig-paths@^4.1.2: - version "4.2.0" - resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" - integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== - dependencies: - json5 "^2.2.2" - minimist "^1.2.6" - strip-bom "^3.0.0" - -tslib@^1.8.1, tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.3.0, tslib@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" - integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== - -tslib@^2.4.0: - version "2.5.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" - integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== - -tslib@^2.5.0, tslib@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz#b295854684dbda164e181d259a22cd779dcd7bc3" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== - -tslib@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== - -tsutils@^3.21.0: - version "3.21.0" - resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" - integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== - dependencies: - tslib "^1.8.1" - -tuf-js@^1.1.3: - version "1.1.6" - resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz#ad3e7a20237b83b51c2a8f9d1ddf093279a10fc2" - integrity sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg== - dependencies: - "@tufjs/models" "1.0.4" - debug "^4.3.4" - make-fetch-happen "^11.1.0" - -type-check@^0.4.0, type-check@~0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" - integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== - dependencies: - prelude-ls "^1.2.1" - -type-check@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - -type-detect@4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== - -type-fest@^0.12.0: - version "0.12.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.12.0.tgz#f57a27ab81c68d136a51fd71467eff94157fa1ee" - integrity sha512-53RyidyjvkGpnWPMF9bQgFtWp+Sl8O2Rp13VavmJgfAP9WWG6q6TkrKU8iyJdnwnfgHI6k2hTlgqH4aSdjoTbg== - -type-fest@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" - integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== - -type-fest@^0.15.1: - version "0.15.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.15.1.tgz#d2c4e73d3e4a53cf1a906396dd460a1c5178ca00" - integrity sha512-n+UXrN8i5ioo7kqT/nF8xsEzLaqFra7k32SEsSPwvXVGyAcRgV/FUQN/sgfptJTR1oRmmq7z4IXMFSM7im7C9A== - -type-fest@^0.16.0: - version "0.16.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz#3240b891a78b0deae910dbeb86553e552a148860" - integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== - -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.4.1.tgz#8bdf77743385d8a4f13ba95f610f5ccd68c728f8" - integrity sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== - -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== - dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" - -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" - -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== - dependencies: - call-bind "^1.0.2" - for-each "^0.3.3" - is-typed-array "^1.1.9" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@>=2.7, typescript@^4.4.2, typescript@~4.4.2: - version "4.4.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.4.3.tgz#bdc5407caa2b109efd4f82fe130656f977a29324" - integrity sha512-4xfscpisVgqqDfPaJo5vkd+Qd/ItkoagnHpufr+i2QCHBsNYp+G7UAoyFl8aPtx879u38wPV65rZ8qbGZijalA== - -"typescript@^3 || ^4": - version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -typescript@^4.4.3: - version "4.6.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz#eefeafa6afdd31d725584c67a0eaba80f6fc6c6c" - integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw== - -uglify-js@^3.1.4: - version "3.13.5" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.5.tgz#5d71d6dbba64cf441f32929b1efce7365bb4f113" - integrity sha512-xtB8yEqIkn7zmOyS2zUNBsYCBRhDkvlNxMMY2smuJ/qA8NCHeQvKCF3i9Z4k8FJH4+PJvZRtMrPynfZ75+CSZw== - -unbox-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" - integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== - dependencies: - call-bind "^1.0.2" - has-bigints "^1.0.2" - has-symbols "^1.0.3" - which-boxed-primitive "^1.0.2" - -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= - -unified@^9.1.0: - version "9.2.1" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" - integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-filename@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz#e785f8675a9a7589e0ac77e0b5c34d2eaeac6da2" - integrity sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A== - dependencies: - unique-slug "^3.0.0" - -unique-filename@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" - integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== - dependencies: - unique-slug "^4.0.0" - -unique-slug@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz#6d347cf57c8a7a7a6044aabd0e2d74e4d76dc7c9" - integrity sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w== - dependencies: - imurmurhash "^0.1.4" - -unique-slug@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" - integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== - dependencies: - imurmurhash "^0.1.4" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-util-find-all-after@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz#fdfecd14c5b7aea5e9ef38d5e0d5f774eeb561f6" - integrity sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ== - dependencies: - unist-util-is "^4.0.0" - -unist-util-is@^4.0.0: - version "4.0.4" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.0.4.tgz#3e9e8de6af2eb0039a59f50c9b3e99698a924f50" - integrity sha512-3dF39j/u423v4BBQrk1AQ2Ve1FxY5W3JKwXxVFzBODQ6WEvccguhgp802qQLKSnxPODE6WuRZtV+ohlUg4meBA== - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz#cce3bfa1cdf85ba7375d1d5b17bdc4cada9bd9da" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== - -universalify@^0.1.0, universalify@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" - integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== - -universalify@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz#b61a1da173e8435b2fe3c67d29b9adf8594bd16d" - integrity sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug== - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -unzipper@^0.10.11: - version "0.10.11" - resolved "https://registry.npmjs.org/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" - integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== - dependencies: - big-integer "^1.6.17" - binary "~0.3.0" - bluebird "~3.4.1" - buffer-indexof-polyfill "~1.0.0" - duplexer2 "~0.1.4" - fstream "^1.0.12" - graceful-fs "^4.2.2" - listenercount "~1.0.1" - readable-stream "~2.3.6" - setimmediate "~1.0.4" - -upath@2.0.1, upath@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" - integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -v8-compile-cache-lib@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz#0582bcb1c74f3a2ee46487ceecf372e46bce53e8" - integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA== - -v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== - -v8-to-istanbul@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.0.tgz#0aeb763894f1a0a1676adf8a8b7612a38902446c" - integrity sha512-/PRhfd8aTNp9Ggr62HPzXg2XasNFGy5PBt0Rp04du7/8GNNSgxFL6WBTkgMKSL9bFjH+8kKEG3f37FmxiTqUUA== - dependencies: - "@types/istanbul-lib-coverage" "^2.0.1" - convert-source-map "^1.6.0" - source-map "^0.7.3" - -validate-npm-package-license@3.0.4, validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - -validate-npm-package-name@4.0.0, validate-npm-package-name@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" - integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== - dependencies: - builtins "^5.0.0" - -validate-npm-package-name@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" - integrity sha1-X6kS2B630MdK/BQN5zF/DKffQ34= - dependencies: - builtins "^1.0.3" - -validate-npm-package-name@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" - integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== - dependencies: - builtins "^5.0.0" - -validator@^8.0.0: - version "8.2.0" - resolved "https://registry.npmjs.org/validator/-/validator-8.2.0.tgz#3c1237290e37092355344fef78c231249dab77b9" - integrity sha512-Yw5wW34fSv5spzTXNkokD6S6/Oq92d8q/t14TqsS3fAiA1RYnxSFSIZ+CY3n6PGGRCq5HhJTSepQvFUS2QUDxA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz#5b43b88171d409eae58477d13f23dd41d52c371a" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz#03f1dce28fc625c625bc6514350fbdb00fa9e624" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -vscode-jsonrpc@6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz#108bdb09b4400705176b957ceca9e0880e9b6d4e" - integrity sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg== - -vscode-languageclient@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz#b505c22c21ffcf96e167799757fca07a6bad0fb2" - integrity sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg== - dependencies: - minimatch "^3.0.4" - semver "^7.3.4" - vscode-languageserver-protocol "3.16.0" - -vscode-languageserver-protocol@3.16.0: - version "3.16.0" - resolved "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz#34135b61a9091db972188a07d337406a3cdbe821" - integrity sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A== - dependencies: - vscode-jsonrpc "6.0.0" - vscode-languageserver-types "3.16.0" - -vscode-languageserver-textdocument@^1.0.3: - version "1.0.4" - resolved "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.4.tgz#3cd56dd14cec1d09e86c4bb04b09a246cb3df157" - integrity sha512-/xhqXP/2A2RSs+J8JNXpiiNVvvNM0oTosNVmQnunlKvq9o4mupHOBAnnzH0lwIPKazXKvAKsVp1kr+H/K4lgoQ== - -vscode-languageserver-types@3.16.0: - version "3.16.0" - resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247" - integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA== - -vscode-languageserver@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz#49b068c87cfcca93a356969d20f5d9bdd501c6b0" - integrity sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw== - dependencies: - vscode-languageserver-protocol "3.16.0" - -vscode-test@^1.6.1: - version "1.6.1" - resolved "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz#44254c67036de92b00fdd72f6ace5f1854e1a563" - integrity sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA== - dependencies: - http-proxy-agent "^4.0.1" - https-proxy-agent "^5.0.0" - rimraf "^3.0.2" - unzipper "^0.10.11" - -vscode-uri@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84" - integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA== - -w3c-hr-time@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" - integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== - dependencies: - browser-process-hrtime "^1.0.0" - -w3c-xmlserializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a" - integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== - dependencies: - xml-name-validator "^3.0.0" - -walk-up-path@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e" - integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg== - -walker@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs= - dependencies: - makeerror "1.0.x" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wcwidth@^1.0.0, wcwidth@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" - integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= - dependencies: - defaults "^1.0.3" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - -webidl-conversions@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" - integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== - -webidl-conversions@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" - integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== - -webpack-cli@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz#c211ac6d911e77c512978f7132f0d735d4a97ace" - integrity sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw== - dependencies: - "@discoveryjs/json-ext" "^0.5.0" - "@webpack-cli/configtest" "^2.1.0" - "@webpack-cli/info" "^2.0.1" - "@webpack-cli/serve" "^2.0.4" - colorette "^2.0.14" - commander "^10.0.1" - cross-spawn "^7.0.3" - envinfo "^7.7.3" - fastest-levenshtein "^1.0.12" - import-local "^3.0.2" - interpret "^3.1.1" - rechoir "^0.8.0" - webpack-merge "^5.7.3" - -webpack-merge@^5.7.3: - version "5.7.3" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz#2a0754e1877a25a8bbab3d2475ca70a052708213" - integrity sha512-6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-node-externals@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz#1a3407c158d547a9feb4229a9e3385b7b60c9917" - integrity sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ== - -webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.82.1: - version "5.82.1" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz#8f38c78e53467556e8a89054ebd3ef6e9f67dbab" - integrity sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.7.6" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.14.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.1.2" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -whatwg-encoding@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" - integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== - dependencies: - iconv-lite "0.4.24" - -whatwg-mimetype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" - integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -whatwg-url@^8.0.0, whatwg-url@^8.5.0: - version "8.6.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.6.0.tgz#27c0205a4902084b872aecb97cf0f2a7a3011f4c" - integrity sha512-os0KkeeqUOl7ccdDT1qqUcS4KH4tcBTSKK5Nl5WKb2lyxInIZ/CpjkqKa1Ss12mjfdcRX9mHmPPs7/SxG1Hbdw== - dependencies: - lodash "^4.7.0" - tr46 "^2.1.0" - webidl-conversions "^6.1.0" - -which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - -which-typed-array@^1.1.10: - version "1.1.10" - resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz#74baa2789991905c2076abb317103b866c64e69e" - integrity sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA== - dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" - for-each "^0.3.3" - gopd "^1.0.1" - has-tostringtag "^1.0.0" - is-typed-array "^1.1.10" - -which@^1.2.14, which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1, which@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -which@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" - integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" - integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== - dependencies: - string-width "^1.0.2 || 2 || 3 || 4" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -wildcard@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" - integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== - -word-wrap@^1.0.3, word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.3" - resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== - -wordwrap@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" - integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.1.0: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -write-file-atomic@4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.1.tgz#9faa33a964c1c85ff6f849b80b42a88c2c537c8f" - integrity sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^3.0.7" - -write-file-atomic@^2.4.2: - version "2.4.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - -write-file-atomic@^3.0.0, write-file-atomic@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -write-file-atomic@^5.0.0: - version "5.0.1" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" - integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== - dependencies: - imurmurhash "^0.1.4" - signal-exit "^4.0.1" - -write-json-file@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/write-json-file/-/write-json-file-3.2.0.tgz#65bbdc9ecd8a1458e15952770ccbadfcff5fe62a" - integrity sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== - dependencies: - detect-indent "^5.0.0" - graceful-fs "^4.1.15" - make-dir "^2.1.0" - pify "^4.0.1" - sort-keys "^2.0.0" - write-file-atomic "^2.4.2" - -write-pkg@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/write-pkg/-/write-pkg-4.0.0.tgz#675cc04ef6c11faacbbc7771b24c0abbf2a20039" - integrity sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== - dependencies: - sort-keys "^2.0.0" - type-fest "^0.4.1" - write-json-file "^3.2.0" - -ws@^7, ws@^7.4.5, ws@^7.5.5: - version "7.5.6" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" - integrity sha512-6GLgCqo2cy2A2rjCNFlxQS6ZljG/coZfZXclldI8FB/1G3CCI36Zd8xy2HrFVACi8tfk5XrgLQEk+P0Tnz9UcA== - -xml-name-validator@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" - integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== - -xmlchars@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" - integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== - -xtend@^4.0.2, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml@^1.10.0, yaml@^1.10.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yaml@^2.2.2: - version "2.3.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz#f522db4313c671a0ca963a75670f1c12ea909144" - integrity sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg== - -yargs-parser@20.2.4: - version "20.2.4" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" - integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== - -yargs-parser@20.x, yargs-parser@^20.2.2, yargs-parser@^20.2.3: - version "20.2.6" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.6.tgz#69f920addf61aafc0b8b89002f5d66e28f2d8b20" - integrity sha512-AP1+fQIWSM/sMiET8fyayjx/J+JmTPt2Mr0FkrgqB4todtfa53sOsrSAcIrJRD5XS20bKUwaDIuMkWKCEiQLKA== - -yargs-parser@21.1.1, yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs-parser@^18.1.3: - version "18.1.3" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" - integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@16.2.0, yargs@^16.2.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.0: - version "17.1.1" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.1.1.tgz#c2a8091564bdb196f7c0a67c1d12e5b85b8067ba" - integrity sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.6.2: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - 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" - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== - -yoga-layout-prebuilt@^1.9.6: - version "1.10.0" - resolved "https://registry.npmjs.org/yoga-layout-prebuilt/-/yoga-layout-prebuilt-1.10.0.tgz#2936fbaf4b3628ee0b3e3b1df44936d6c146faa6" - integrity sha512-YnOmtSbv4MTf7RGJMK0FvZ+KD8OEe/J5BNnR0GHhD8J/XcG/Qvxgszm0Un6FTHWW4uHlTgP0IztiXQnGyIR45g== - dependencies: - "@types/yoga-layout" "1.9.2" - -z-schema@~3.18.3: - version "3.18.4" - resolved "https://registry.npmjs.org/z-schema/-/z-schema-3.18.4.tgz#ea8132b279533ee60be2485a02f7e3e42541a9a2" - integrity sha512-DUOKC/IhbkdLKKiV89gw9DUauTV8U/8yJl1sjf6MtDmzevLKOF2duNJ495S3MFVjqZarr+qNGCPbkg4mu4PpLw== - dependencies: - lodash.get "^4.0.0" - lodash.isequal "^4.0.0" - validator "^8.0.0" - optionalDependencies: - commander "^2.7.1" - -zone.js@^0.11.4: - version "0.11.5" - resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz#ab0b449e91fadb5ebb2db189ffe1b7b6048dc8b1" - integrity sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g== - dependencies: - tslib "^2.3.0" - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==