diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index 4f3b76b0..00000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/master/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index db137209..00000000 --- a/.changeset/config.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@1.3.0/schema.json", - "changelog": [ - "@changesets/changelog-github", - { "repo": "cloudfour/eslint-config" } - ], - "commit": false, - "linked": [], - "access": "public", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [] -} diff --git a/.changeset/sweet-mugs-shake.md b/.changeset/sweet-mugs-shake.md deleted file mode 100644 index 92273a45..00000000 --- a/.changeset/sweet-mugs-shake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@cloudfour/eslint-plugin': major ---- - -Drop support for node 16. Now only node 18+ is supported diff --git a/.editorconfig b/.editorconfig index 20edaa21..9fd75a67 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,11 +1,16 @@ root = true [*] -indent_style = space +indent_style = tab indent_size = 2 charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.md] -trim_trailing_whitespace = false \ No newline at end of file +trim_trailing_whitespace = false + +# YAML files cannot have tabs +# @see https://yaml.org/faq.html +[*.yml] +indent_style = space diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index ac79f19f..00000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -/dist -/fixtures/repos -/tmp-eslint-config diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 586de493..6191f138 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,26 +7,17 @@ concurrency: cancel-in-progress: true jobs: - lint: + validate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Use Node.js 18 - uses: actions/setup-node@v3 + - name: Check out repository code + uses: actions/checkout@v4 + - name: Setup Node + uses: actions/setup-node@v4 with: - node-version: 18 - - name: Cache node modules - uses: actions/cache@v3 - with: - path: node_modules - key: ${{ runner.OS }}-build-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.OS }}-build-${{ env.cache-name }}- - ${{ runner.OS }}-build- - ${{ runner.OS }}- + node-version: 'lts/*' + cache: 'npm' - name: Install Dependencies - run: npm ci && npm link && npm link @cloudfour/eslint-plugin - - name: Run Build - run: npm run build + run: npm ci - name: Run Lint - run: npm run check-lint + run: npm run lint:check diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index df6f3ff3..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Release - -on: - push: - branches: - - main - -jobs: - release: - name: Release - runs-on: ubuntu-latest - steps: - - name: Checkout Repo - uses: actions/checkout@v4 - with: - # Fetch all git history for correct changelog commits - fetch-depth: 0 - - - name: Setup Node.js 18.x - uses: actions/setup-node@master - with: - node-version: 18.x - - - name: Install Dependencies - run: npm ci - - - name: Create Release Pull Request or Publish to npm - uses: changesets/action@master - with: - publish: npm run release - version: npm run version - title: 'Publish Next Version' - commit: 'Publish Next Version' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.gitignore b/.gitignore index 9b7dd922..76efb07f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,2 @@ node_modules -/dist/*.js -.vscode/ -/fixtures/repos -/tmp-eslint-config +.vscode diff --git a/.npmrc b/.npmrc deleted file mode 100644 index 6257c6fc..00000000 --- a/.npmrc +++ /dev/null @@ -1,3 +0,0 @@ -# We want npm to not create the tag when the version is updated (in PRs) -# instead we want the tag created after the PR is merged, on main, on publish -git-tag-version=false diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..b009dfb9 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +lts/* diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index ac79f19f..00000000 --- a/.prettierignore +++ /dev/null @@ -1,3 +0,0 @@ -/dist -/fixtures/repos -/tmp-eslint-config diff --git a/.renovaterc.json b/.renovaterc.json index 5f12af73..88c23ad3 100644 --- a/.renovaterc.json +++ b/.renovaterc.json @@ -1,16 +1,16 @@ { - "extends": ["config:base", ":automergeMinor"], - "reviewers": ["team:dev"], - "dependencyDashboard": true, - "stabilityDays": 4, - "packageRules": [ - { - "matchDepTypes": ["dependencies"], - "rangeStrategy": "bump" - }, - { - "matchPackagePatterns": ["eslint"], - "automerge": false - } - ] + "extends": ["config:base", ":automergeMinor"], + "reviewers": ["team:dev"], + "dependencyDashboard": true, + "stabilityDays": 4, + "packageRules": [ + { + "matchDepTypes": ["dependencies"], + "rangeStrategy": "bump" + }, + { + "matchPackagePatterns": ["eslint"], + "automerge": false + } + ] } diff --git a/CHANGELOG.md b/CHANGELOG.md index 85842176..5c4a6622 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # @cloudfour/eslint-plugin +## Unreleased + +### Breaking Changes + +- Changed from a "super plugin" to a flat config file. +- Changed package name from `@cloudfour/eslint-plugin` to `@cloudfour/eslint-config`. + ## 23.0.0 ### Major Changes @@ -471,11 +478,11 @@ ```js function a() { - if (_) { - a(); - b(); - c(); - } + if (_) { + a(); + b(); + c(); + } } ``` @@ -483,10 +490,10 @@ ```js function a() { - if (!_) return; - a(); - b(); - c(); + if (!_) return; + a(); + b(); + c(); } ``` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6a8377a0..6b2c4573 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,33 +1,5 @@ # Contributing Guide -## Running @cloudfour/eslint-plugin on itself +## Release Process -In order to run `npm run lint` on this project, it needs to have a symlink to itself in `node_modules`, so that ESLint can find it. To set up this symlink, run `npm link` and then `npm link @cloudfour/eslint-plugin`. Then you should be able to run `npm run lint`. - -## Pull Requests - -If you are submitting a pull request that includes changes that will affect places where this ESLint config is installed, add a Changeset file to describe the outward-facing changes: - -- On your feature branch, run `npx changeset`. - - - First it will ask you what [kind of change it is](https://semver.org/#summary): - - - **Major changes** include - - Enabling rules - - Removing rules - - Bugfixes to rules that are likely to error on more code than before - - Removing support for Node or ESLint or TypeScript versions - - **Minor changes** include - - Creating rules that are not enabled by default - - Adding support for Node or ESLint or TypeScript versions - - Bugfixes to rules that are not likely to error on more code than before - - **Patch releases** include - - Bugfixes/refactorings that will not change the functionality - - Dependency updates can fall into any of the three categories, consider how the dependency change will affect consumers of this ESLint config. - - - Next it will ask you to describe your changes. This message will appear in the Changelog. You can press enter before you type anything to edit the message in your editor. - -## Releasing - -- [Changesets Action](https://github.com/changesets/action) will create and maintain release PR's whenever changes are pushed to main. Merge the "Publish Next Version" PR to release all unreleased changes on `main`. All of the changes will get combined into a single release. Changesets will handle updating the changelog, pushing git tags, and publishing to npm. +[How to publish an updated version](https://cloudfour.com/thinks/how-to-publish-an-updated-version-of-an-npm-package/) diff --git a/README.md b/README.md index 41c0e012..d0b19bdf 100644 --- a/README.md +++ b/README.md @@ -1,75 +1,43 @@ -# @cloudfour/eslint-plugin +# @cloudfour/eslint-config -[![NPM version](https://img.shields.io/npm/v/@cloudfour/eslint-plugin.svg)](https://www.npmjs.com/package/@cloudfour/eslint-plugin) [![Build Status](https://github.com/cloudfour/eslint-config/workflows/CI/badge.svg)](https://github.com/cloudfour/eslint-config/actions?query=workflow%3ACI) [![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com) +[![NPM version](https://img.shields.io/npm/v/@cloudfour/eslint-config.svg)](https://www.npmjs.com/package/@cloudfour/eslint-config) [![Build Status](https://github.com/cloudfour/eslint-config/workflows/CI/badge.svg)](https://github.com/cloudfour/eslint-config/actions?query=workflow%3ACI) [![Renovate](https://img.shields.io/badge/renovate-enabled-brightgreen.svg)](https://renovatebot.com) -Cloud Four's ESLint configuration. This exports itself as a "super-plugin" because of a [limitation of ESLint](https://github.com/eslint/eslint/issues/3458). +Cloud Four's ESLint configuration. -The way this works is that it requires all of the plugin dependencies, and exports them from this plugin under a prefix. - -The plugins that this exposes are: +This config extends the following plugins: - [`n`](https://github.com/weiran-zsd/eslint-plugin-node) (maintained fork of original [`eslint-plugin-node`](https://github.com/mysticatea/eslint-plugin-node)) - [`import`](https://github.com/benmosher/eslint-plugin-import) -- [`standard`](https://github.com/standard/eslint-plugin-standard) - [`promise`](https://github.com/xjamundx/eslint-plugin-promise) -- [`unicorn`](https://github.com/sindresorhus/eslint-plugin-unicorn) - [`jsdoc`](https://github.com/gajus/eslint-plugin-jsdoc) +- [`unicorn`](https://github.com/sindresorhus/eslint-plugin-unicorn) +- [`standard`](https://github.com/standard/eslint-config-standard) - [`@typescript-eslint`](https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin) -To override settings for any of these plugins, you must prefix the configuration -with `cloudfour/`, because the plugins are exposed through this "super-plugin". - -```json -{ - "extends": ["plugin:@cloudfour/recommended"], - "rules": { - "@cloudfour/promise/no-native": "off" - } -} -``` - -In addition to the `recommended` configuration, `@cloudfour/eslint-plugin` also re-exports typescript-eslint's [`disable-type-checked` configuration](https://typescript-eslint.io/linting/configs/#disable-type-checked). This configuration disables any rules that depend on typescript-eslint's typescript integration. - -## Installation +It also adds the following custom rules: -```sh -npm install --save-dev @cloudfour/eslint-plugin eslint prettier -``` +- [`prefer-early-return`](./rules/prefer-early-return/) ## Usage -Add this to your `package.json`: - -```json - "scripts": { - "check-lint": "eslint . && prettier --check .", - "lint": "eslint --fix . && prettier --write ." - }, - "eslintConfig": { - "extends": "plugin:@cloudfour/recommended" - }, - "prettier": { - "singleQuote": true - } -``` - -### Check for Lint Errors +This package exports [a flat ESLint configuration](https://eslint.org/docs/latest/use/configure/configuration-files-new). -```sh -npm run check-lint +```bash +npm install --save-dev eslint @cloudfour/eslint-config ``` -### Fix Lint Errors +Example `eslint.config.js`: -This command will attempt to automatically fix lint errors. Note that not all lint errors can be fixed this way, so be prepeared to fix any remaining errors by hand. +```js +import cloudFourConfig from '@cloudfour/eslint-config'; -```sh -npm run lint +export default [ + ...cloudFourConfig, + { + rules: { + // your overrides here + ... + } + }, +]; ``` - -### Troubleshooting Note - -This config relies on using a version of eslint installed locally to your project. If you also have eslint installed globally, it's possible to run into conflicts. To avoid any problems, either: - -- Just use the `npm run check-lint` and `npm run lint` scripts, which will run the local version of eslint. -- Or, if you prefer to run eslint by hand, use [npx](https://www.npmjs.com/package/npx), which will run the local version of eslint. eg, `npx eslint '**/*.js'` diff --git a/build.mjs b/build.mjs deleted file mode 100644 index 4873b0da..00000000 --- a/build.mjs +++ /dev/null @@ -1,46 +0,0 @@ -import { writeFileSync } from 'node:fs'; -import { dirname, join, sep } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -import { format } from 'prettier'; - -import configFile from './src/config.js'; - -const { configs, environments } = configFile; - -const resolveStart = '__REQUIRE_RESOLVE__'; -const resolveEnd = '__END_REQUIRE_RESOLVE__'; - -const __dirname = dirname(fileURLToPath(import.meta.url)); - -// Require.resolve needs to be dynamic and cannot be statically stringified with JSON.stringify -const stringify = (data) => - `module.exports = ${JSON.stringify(data, (k, v) => { - if (k === 'parser' && typeof v === 'string' && v.startsWith(__dirname)) { - const pathWithoutNodeModules = v.replace( - join(__dirname, `node_modules${sep}`), - '', - ); - // Takes the file path and changes it to just the name of the package the path was in - const packagePath = pathWithoutNodeModules.startsWith('@') - ? // If it is a part of a npm org, then it will be two levels deep: @___/___ - /^@[^/]*\/[^/]*/.exec(pathWithoutNodeModules)[0] - : // Otherwise, it will just be one level deep: ___ - /^[^/]*/.exec(pathWithoutNodeModules)[0]; - return `${resolveStart}${packagePath}${resolveEnd}`; - } - - return v; - })}`.replace( - // Wrap the relative parser path with require.resolve - new RegExp(`"${resolveStart}(.*?)${resolveEnd}"`, 'g'), - (_match, replacement) => `require.resolve("${replacement}")`, - ); - -const createFile = (data) => - // Clean up the file so that it is readable - format(stringify(data), { parser: 'babel', singleQuote: true }); - -// Snapshots the merged config to make debugging rules easier and to reduce dependencies -const text = await createFile({ configs, environments }); -writeFileSync(join('dist', 'config.js'), text); diff --git a/dist/.gitkeep b/dist/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 00000000..c7417ee8 --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,283 @@ +import configPrettier from 'eslint-config-prettier'; +import configXO from 'eslint-config-xo'; +import pluginImport from 'eslint-plugin-import'; +import pluginJSDoc from 'eslint-plugin-jsdoc'; +import pluginNode from 'eslint-plugin-n'; +import pluginPromise from 'eslint-plugin-promise'; +import pluginUnicorn from 'eslint-plugin-unicorn'; +import globals from 'globals'; +import pluginTypeScript from 'typescript-eslint'; + +import configStandard from './src/eslint-standard-config.js'; +import configStylistic from './src/eslint-stylistic-config.js'; +import rulePreferEarlyReturn from './src/rules/prefer-early-return/index.js'; + +// Create a plugin containing our custom rules +const pluginCloudFour = { + rules: { + 'prefer-early-return': rulePreferEarlyReturn, + }, +}; + +export default [ + // Plugins' recommended configs + pluginNode.configs['flat/recommended'], + pluginJSDoc.configs['flat/recommended-error'], + pluginUnicorn.configs['flat/recommended'], + + // "Standards" + ...configXO, + configStandard, + + // Our settings + { + languageOptions: { + ecmaVersion: 2022, + sourceType: 'module', + parserOptions: { + ecmaFeatures: { jsx: true }, + }, + globals: { + ...globals.es2022, + ...globals.node, + document: 'readonly', + navigator: 'readonly', + window: 'readonly', + }, + }, + plugins: { + import: pluginImport, + promise: pluginPromise, + '@cloudfour': pluginCloudFour, + }, + settings: { + jsdoc: { + mode: 'typescript', + tagNamePreference: { + TODO: 'todo', + }, + preferredTypes: { + '*': 'any', + Function: '() => void', + function: '() => void', + }, + }, + }, + // Override rules from recommended configs + rules: { + '@cloudfour/prefer-early-return': 'error', + 'no-unused-expressions': [ + 'error', + { + allowShortCircuit: false, + allowTernary: false, + allowTaggedTemplates: false, + }, + ], + 'no-return-assign': ['error'], + 'func-names': 'off', + 'prefer-const': [ + 'error', + // If there is a destructuring assignment + // and some of the properties should be const + // but others shouldn't be, let it use let + { destructuring: 'all' }, + ], + 'no-var': 'error', + 'object-shorthand': 'error', + 'prefer-object-spread': 'error', + 'prefer-spread': 'error', + 'prefer-destructuring': ['error', { array: false }], + 'prefer-rest-params': 'error', + // We decided that since devs can use blank lines to create logical groupings in code, + // it is best not to have ESLint enforce adding newlines + 'padding-line-between-statements': 'off', + 'prefer-template': 'error', + 'no-param-reassign': 'off', // We don't use `arguments`, and assigning to parameters can be useful + 'no-promise-executor-return': 'off', // Allow implicit return in promise executor + 'capitalized-comments': [ + 'error', + 'always', + { + ignorePattern: String.raw`pragma|ignore|prettier-ignore|webpack\w+:|c8|return|const|let|var|await|function|console`, + ignoreInlineComments: true, + ignoreConsecutiveComments: true, + }, + ], + + 'n/no-unsupported-features/es-syntax': 'off', // Does not account for transpilation + 'n/no-unpublished-require': 'off', // Does not account for "build" scripts + 'n/shebang': 'off', // Tons of false positives + 'n/file-extension-in-import': ['error', 'always'], // Don't allow extension-less relative imports (e.g. use ./foo.js instead of ./foo) + + // Used for sorting/grouping import statements + 'import/order': [ + 'error', + { + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + 'sibling', + 'index', + ], + 'newlines-between': 'always', + alphabetize: { order: 'asc', caseInsensitive: true }, + }, + ], + // Avoid multiple import statements in the same file for the same module + // prefer-inline means it is preferred to use inline `type` imports combined with non-types + // instead of separate imports for types and non-types + // e.g. import { Foo, type Bar } from 'something' is preferred over having separate import statements + 'import/no-duplicates': ['error', { 'prefer-inline': true }], + // Used for sorting members within an import statement alphabetically + 'sort-imports': ['error', { ignoreDeclarationSort: true }], + + 'unicorn/import-style': 'off', // It doesn't seem useful to force people to use named, default, or namespace imports + 'unicorn/prevent-abbreviations': 'off', // Causes more issues than it's worth + // Null is ok, even though Sindre Sorhus doesn't like it + // It is ok to avoid using null and use undefined instead + // but enforcing it in all code via a lint rule is too annoying + 'unicorn/no-null': 'off', + // This rule is meant to avoid the edge case of breaking changes occuring + // due to the `index` parameter being passed unexpectedly into the callback function, + // causing unexpected behavior if the callback expects something that is not the index + // But this is an edge case that can be avoided through careful manual review + // and sometimes through TS + 'unicorn/no-array-callback-reference': 'off', + // https://github.com/sindresorhus/eslint-plugin-unicorn/pull/1750 + // This rule got removed from the recommended preset, but that hasn't been published yet. + 'unicorn/prefer-json-parse-buffer': 'off', + // This rule changes arrays to sets if you call .includes on it + // Converting from array to set has a cost itself, just like .includes has a cost + // We decided to leave the decision of using arrays vs sets to human reviewers + 'unicorn/prefer-set-has': 'off', + // Reduce is often useful. Don't need a lint rule to tell us not to use it + 'unicorn/no-array-reduce': 'off', + 'unicorn/prefer-module': 'off', // A lot of projects still use commonjs by default for non-browser code. We can revisit this rule once commonjs is basically never used. + 'unicorn/prefer-switch': 'off', // Switch statements are often longer than if/else chains, and they are still read aloud as "if ... is ... then" + 'unicorn/prefer-number-properties': [ + 'error', + // There isn't a good reason to force use of Number.POSITIVE_INFINITY instead of Infinity + { checkInfinity: false }, + ], + // String#replaceAll doesn't quite have enough browser/node support to enable this rule by default. + // TODO [2025-01-01] Reconsider browser/node support for those two methods + 'unicorn/prefer-string-replace-all': 'off', + // String#at and Array#at don't quite have enough browser/node support to enable this rule by default. + // TODO [2025-01-01] Reconsider browser/node support for those two methods + 'unicorn/prefer-at': 'off', + // This rule suggests incorrect code with the destructured object is modified + // That is a fairly common case, and it is too annoying to always disable the rule on each line + 'unicorn/consistent-destructuring': 'off', + + // Allow _only_ TODO comments with expirations/conditions + 'no-warning-comments': 'off', + 'unicorn/expiring-todo-comments': [ + 'error', + { allowWarningComments: false }, + ], + + // Disabling jsdoc rules that check the types themselves + // If you want to have type checking on a project, use typescript instead + 'jsdoc/newline-after-description': 'off', + 'jsdoc/no-undefined-types': 'off', + 'jsdoc/valid-types': 'off', + 'jsdoc/require-returns': 'off', + 'jsdoc/require-param-description': 'off', + 'jsdoc/require-property-description': 'off', + 'jsdoc/require-returns-description': 'off', + 'jsdoc/require-jsdoc': 'off', + 'jsdoc/require-returns-check': 'off', // Does not handle @returns with void or undefined + 'jsdoc/tag-lines': ['error', 'any', { startLines: 1 }], + }, + }, + + // Load TypeScript ESLint recommended config for TS files only + // @see https://eslint.org/docs/latest/use/configure/combine-configs#apply-a-config-array-to-a-subset-of-files + ...pluginTypeScript.configs.recommendedTypeChecked.map((config) => ({ + ...config, + files: ['**/*.{ts,tsx,mts,cts}'], + })), + + // Override recommended rules for TS files only + { + files: ['**/*.{ts,tsx,mts,cts}'], + languageOptions: { + parserOptions: { + projectService: true, + tsconfigRootDir: import.meta.dirname, + }, + }, + rules: { + // TS handles checking these + 'n/no-missing-import': 'off', + 'n/no-missing-require': 'off', + + 'no-import-assign': 'off', // TS handles this + + // With TS, the only reason to have a @param tag + // is if a particular parameter needs a description, + // which is not true for all parameters + 'jsdoc/require-param': 'off', + 'jsdoc/require-param-type': 'off', // Types should be in type annotations instead + 'jsdoc/require-param-description': 'error', // The only reason to have an @param in TS is to add a description + 'jsdoc/require-returns-type': 'off', // Return types should be in type annotations instead + 'jsdoc/require-returns-description': 'error', // The only reason to have an @returns in TS is to add a description + // Auto-fixes type imports to use the `import type` syntax + // This syntax is preferred because it makes the TS -> JS transformation easier + // because it doesn't require checking which imports are only referenced as types + '@typescript-eslint/consistent-type-imports': [ + 'error', + // We have set it to allow import('...') for types because that is the only kind of import that is allowed in global type augmentations + { disallowTypeAnnotations: false }, + ], + // Don't try to use the result of expression whose type is `void` + '@typescript-eslint/no-confusing-void-expression': [ + 'error', + { ignoreArrowShorthand: true }, + ], + // Don't use the void operator an an expression whose type is already `void` + '@typescript-eslint/no-meaningless-void-operator': 'error', + '@typescript-eslint/no-unnecessary-type-constraint': 'error', + '@typescript-eslint/array-type': ['error', { default: 'array' }], // Require consistency: Use foo[] instead of Array + '@typescript-eslint/ban-ts-comment': 'error', + '@typescript-eslint/explicit-module-boundary-types': 'off', // Type inference is useful even for public functions + '@typescript-eslint/no-explicit-any': 'off', // Any is an escape hatch, it should be allowed + '@typescript-eslint/no-floating-promises': 'off', // Don't force every promise rejection to be caught. Humans can decide when it makes sense to handle errors and when it doesn't + '@typescript-eslint/no-non-null-assertion': 'error', // Default is warn + '@typescript-eslint/no-unsafe-assignment': 'off', // Any is an escape hatch, let it be an escape hatch + '@typescript-eslint/no-unsafe-call': 'off', // Any is an escape hatch, let it be an escape hatch + '@typescript-eslint/no-unsafe-member-access': 'off', // Any is an escape hatch, let it be an escape hatch + '@typescript-eslint/no-unsafe-return': 'off', // Any is an escape hatch, let it be an escape hatch + '@typescript-eslint/no-unsafe-argument': 'off', // Any is an escape hatch, let it be an escape hatch + '@typescript-eslint/restrict-template-expressions': 'off', // Allow using any-typed-values in template expressions + '@typescript-eslint/no-unnecessary-condition': 'error', // This catches a lot of dead code that TS itself doesn't flag + '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error', + '@typescript-eslint/prefer-optional-chain': 'error', // More readable syntax + 'no-unused-vars': 'off', // TS checks this via noUnusedLocals / noUnusedParameters + '@typescript-eslint/no-unused-vars': 'off', // TS checks this via noUnusedLocals / noUnusedParameters + '@typescript-eslint/no-empty-function': 'off', // Non-TS version of rule is not used either + '@typescript-eslint/unbound-method': 'off', // It is pretty common for this already being handled outside of what TS/ESLint can be aware of + '@typescript-eslint/no-import-type-side-effects': 'error', + 'no-unused-expressions': 'off', + '@typescript-eslint/no-unused-expressions': ['error'], // This rule is like the built in ESLint rule but it supports optional chaining + // Replacing the built-in rule with the version that works well with TS + 'no-use-before-define': 'off', + '@typescript-eslint/no-use-before-define': [ + 'error', + { + functions: false, + classes: false, + variables: false, + ignoreTypeReferences: true, + }, + ], + }, + }, + + // Disable stylistic rules + configStylistic, + configPrettier, +]; diff --git a/fixtures/.eslintrc.js b/fixtures/.eslintrc.js deleted file mode 100644 index 4ff8f483..00000000 --- a/fixtures/.eslintrc.js +++ /dev/null @@ -1,14 +0,0 @@ -const path = require('node:path'); -module.exports = { - rules: { - // These rules are disabled because they are very likely to trigger - // Because the linting files are taken out of context - '@cloudfour/n/no-extraneous-require': 'off', - '@cloudfour/n/no-missing-require': 'off', - '@cloudfour/n/no-missing-import': 'off', - '@cloudfour/n/no-extraneous-import': 'off', - }, - parserOptions: { - project: path.join(__dirname, 'tsconfig.json'), - }, -}; diff --git a/fixtures/README.md b/fixtures/README.md deleted file mode 100644 index 2a314c70..00000000 --- a/fixtures/README.md +++ /dev/null @@ -1,40 +0,0 @@ -# Fixtures Files - -## Purpose - -We have collected various JS files from a variety of public open source projects on GitHub. - -These files help us ensure that future updates to this ESLint config/plugin do not break existing code that passes linting. When a new rule is created, or when an existing rule is updated, these files will help make us aware of scenarios where the updates do not work as expected. - -## What Happens If a Plugin/Config Update Breaks Fixtures? - -- If the rule is catching something that is not actually a problem: - - Reconfigure, disable, or modify the lint rule -- If the rule is catching something that is actually a problem in the fixtures code: - - Whichever is easiest: - - [Add `// eslint-disable-next-line some-rule` comments](https://eslint.org/docs/2.13.1/user-guide/configuring#disabling-rules-with-inline-comments) - - Fix the error manually - - Delete the code with the lint error. The fixture files don't have to _work_, so sometimes this is the easiest option. - -## Finding Projects to Use as Fixtures - -- Try to use repos that come from a diverse set of authors or projects rather than a bunch of related projects from the same author -- Try to use repos from different parts of the javascript ecosystem (browser, node, transpiling, etc.) -- Try to use repos that use different parts and versions of javascript syntax - -[`awesome-nodejs`](https://github.com/sindresorhus/awesome-nodejs) and [`awesome-javascript`](https://github.com/sorrycc/awesome-javascript) have lists of packages that could be used. - -## Adding Fixture Files - -1. From the project root, run `npm run load-fixture-repo` -1. Paste in the URL of the git repo to add fixtures from -1. Wait for the repo to be cloned, and scanned for files -1. The importer will suggest files to import based on 3 factors: - - Maximize number of individual syntax features used in file - - Maximize number of tokens in file (overall file size) - - Minimize number of non-auto-fixable lint errors -1. Use the arrow keys and space bar to select files to import -1. `npm run lint` will be run automatically. Fix the lint errors in the newly imported fixture files via whichever is easiest: - - [Adding `// eslint-disable-next-line some-rule` comments](https://eslint.org/docs/2.13.1/user-guide/configuring#disabling-rules-with-inline-comments) - - Fixing the error manually - - Deleting the code with the lint error. The fixture files don't have to _work_, so sometimes this is the easiest option. diff --git a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/decorators.js b/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/decorators.js deleted file mode 100644 index 2f7d24e3..00000000 --- a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/decorators.js +++ /dev/null @@ -1,168 +0,0 @@ -import { types as t, template } from '@babel/core'; -import nameFunction from '@babel/helper-function-name'; -import ReplaceSupers from '@babel/helper-replace-supers'; - -export function hasOwnDecorators(node) { - return Boolean(node.decorators && node.decorators.length > 0); -} - -export function hasDecorators(node) { - return hasOwnDecorators(node) || node.body.body.some(hasOwnDecorators); -} - -function prop(key, value) { - if (!value) return null; - return t.objectProperty(t.identifier(key), value); -} - -function method(key, body) { - return t.objectMethod( - 'method', - t.identifier(key), - [], - t.blockStatement(body), - ); -} - -function takeDecorators(node) { - let result; - if (node.decorators && node.decorators.length > 0) { - result = t.arrayExpression( - node.decorators.map((decorator) => decorator.expression), - ); - } - - node.decorators = undefined; - return result; -} - -function getKey(node) { - if (node.computed) { - return node.key; - } - - if (t.isIdentifier(node.key)) { - return t.stringLiteral(node.key.name); - } - - return t.stringLiteral(String(node.key.value)); -} - -// NOTE: This function can be easily bound as .bind(file, classRef, superRef) -// to make it easier to use it in a loop. -function extractElementDescriptor(/* this: File, */ classRef, superRef, path) { - const { node, scope } = path; - const isMethod = path.isClassMethod(); - - if (path.isPrivate()) { - throw path.buildCodeFrameError( - `Private ${ - isMethod ? 'methods' : 'fields' - } in decorated classes are not supported yet.`, - ); - } - - new ReplaceSupers( - { - methodPath: path, - methodNode: node, - objectRef: classRef, - isStatic: node.static, - superRef, - scope, - file: this, - }, - true, - ).replace(); - - const properties = [ - prop('kind', t.stringLiteral(isMethod ? node.kind : 'field')), - prop('decorators', takeDecorators(node)), - prop('static', node.static && t.booleanLiteral(true)), - prop('key', getKey(node)), - ].filter(Boolean); - - if (isMethod) { - const id = node.computed ? null : node.key; - t.toExpression(node); - properties.push(prop('value', nameFunction({ node, id, scope }) || node)); - } else if (node.value) { - properties.push( - method('value', template.statements.ast`return ${node.value}`), - ); - } else { - properties.push(prop('value', scope.buildUndefinedNode())); - } - - path.remove(); - - return t.objectExpression(properties); -} - -function addDecorateHelper(file) { - try { - return file.addHelper('decorate'); - } catch (error) { - if (error.code === 'BABEL_HELPER_UNKNOWN') { - error.message += - "\n '@babel/plugin-transform-decorators' in non-legacy mode" + - " requires '@babel/core' version ^7.0.2 and you appear to be using" + - ' an older version.'; - } - - throw error; - } -} - -export function buildDecoratedClass(ref, path, elements, file) { - const { node, scope } = path; - const initializeId = scope.generateUidIdentifier('initialize'); - const isDeclaration = node.id && path.isDeclaration(); - const isStrict = path.isInStrictMode(); - const { superClass } = node; - - node.type = 'ClassDeclaration'; - if (!node.id) node.id = t.cloneNode(ref); - - let superId; - if (superClass) { - superId = scope.generateUidIdentifierBasedOnNode(node.superClass, 'super'); - node.superClass = superId; - } - - const classDecorators = takeDecorators(node); - const definitions = t.arrayExpression( - elements.map(extractElementDescriptor.bind(file, node.id, superId)), - ); - - let replacement = template.expression.ast` - ${addDecorateHelper(file)}( - ${classDecorators || t.nullLiteral()}, - function (${initializeId}, ${superClass ? superId : null}) { - ${node} - return { F: ${t.cloneNode(node.id)}, d: ${definitions} }; - }, - ${superClass} - ) - `; - let classPathDesc = 'arguments.1.body.body.0'; - - if (!isStrict) { - replacement.arguments[1].body.directives.push( - t.directive(t.directiveLiteral('use strict')), - ); - } - - if (isDeclaration) { - replacement = template.ast`let ${ref} = ${replacement}`; - classPathDesc = `declarations.0.init.${classPathDesc}`; - } - - return { - instanceNodes: [template.statement.ast`${initializeId}(this)`], - wrapClass(path) { - path.replaceWith(replacement); - return path.get(classPathDesc); - }, - }; -} diff --git a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/fields.js b/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/fields.js deleted file mode 100644 index bc350a41..00000000 --- a/fixtures/babel/packages/babel-helper-create-class-features-plugin/src/fields.js +++ /dev/null @@ -1,723 +0,0 @@ -/* eslint-disable max-params */ -import { types as t, template, traverse } from '@babel/core'; -import memberExpressionToFunctions from '@babel/helper-member-expression-to-functions'; -import optimiseCall from '@babel/helper-optimise-call-expression'; -import ReplaceSupers, { - environmentVisitor, -} from '@babel/helper-replace-supers'; - -import * as ts from './typescript'; - -export function buildPrivateNamesMap(props) { - const privateNamesMap = new Map(); - for (const prop of props) { - const isPrivate = prop.isPrivate(); - const isMethod = !prop.isProperty(); - const isInstance = !prop.node.static; - if (isPrivate) { - const { name } = prop.node.key.id; - const update = privateNamesMap.has(name) - ? privateNamesMap.get(name) - : { - id: prop.scope.generateUidIdentifier(name), - static: !isInstance, - method: isMethod, - }; - if (prop.node.kind === 'get') { - update.getId = prop.scope.generateUidIdentifier(`get_${name}`); - } else if (prop.node.kind === 'set') { - update.setId = prop.scope.generateUidIdentifier(`set_${name}`); - } else if (prop.node.kind === 'method') { - update.methodId = prop.scope.generateUidIdentifier(name); - } - - privateNamesMap.set(name, update); - } - } - - return privateNamesMap; -} - -export function buildPrivateNamesNodes(privateNamesMap, loose, state) { - const initNodes = []; - - for (const [name, value] of privateNamesMap) { - // In loose mode, both static and instance fields are transpiled using a - // secret non-enumerable property. Hence, we also need to generate that - // key (using the classPrivateFieldLooseKey helper). - // In spec mode, only instance fields need a "private name" initializer - // because static fields are directly assigned to a variable in the - // buildPrivateStaticFieldInitSpec function. - const { id, static: isStatic, method: isMethod, getId, setId } = value; - const isAccessor = getId || setId; - if (loose) { - initNodes.push( - template.statement.ast` - var ${id} = ${state.addHelper('classPrivateFieldLooseKey')}("${name}") - `, - ); - } else if (isMethod && !isStatic) { - if (isAccessor) { - initNodes.push(template.statement.ast`var ${id} = new WeakMap();`); - } else { - initNodes.push(template.statement.ast`var ${id} = new WeakSet();`); - } - } else if (!isStatic) { - initNodes.push(template.statement.ast`var ${id} = new WeakMap();`); - } - } - - return initNodes; -} - -// Traverses the class scope, handling private name references. If an inner -// class redeclares the same private name, it will hand off traversal to the -// restricted visitor (which doesn't traverse the inner class's inner scope). -const privateNameVisitor = { - PrivateName(path) { - const { privateNamesMap } = this; - const { node, parentPath } = path; - - if (!parentPath.isMemberExpression({ property: node })) return; - if (!privateNamesMap.has(node.id.name)) return; - - this.handle(parentPath); - }, - - Class(path) { - const { privateNamesMap } = this; - const body = path.get('body.body'); - - for (const prop of body) { - if (!prop.isPrivate()) { - continue; - } - - if (!privateNamesMap.has(prop.node.key.id.name)) continue; - - // This class redeclares the private name. - // So, we can only evaluate the things in the outer scope. - path.traverse(privateNameInnerVisitor, this); - path.skip(); - break; - } - }, -}; - -// Traverses the outer portion of a class, without touching the class's inner -// scope, for private names. -const privateNameInnerVisitor = traverse.visitors.merge([ - { - PrivateName: privateNameVisitor.PrivateName, - }, - environmentVisitor, -]); - -const privateNameHandlerSpec = { - memoise(member, count) { - const { scope } = member; - const { object } = member.node; - - const memo = scope.maybeGenerateMemoised(object); - if (!memo) { - return; - } - - this.memoiser.set(object, memo, count); - }, - - receiver(member) { - const { object } = member.node; - - if (this.memoiser.has(object)) { - return t.cloneNode(this.memoiser.get(object)); - } - - return t.cloneNode(object); - }, - - get(member) { - const { classRef, privateNamesMap, file } = this; - const { name } = member.node.property.id; - const { - id, - static: isStatic, - method: isMethod, - methodId, - getId, - setId, - } = privateNamesMap.get(name); - const isAccessor = getId || setId; - - if (isStatic) { - const helperName = - isMethod && !isAccessor - ? 'classStaticPrivateMethodGet' - : 'classStaticPrivateFieldSpecGet'; - - return t.callExpression(file.addHelper(helperName), [ - this.receiver(member), - t.cloneNode(classRef), - t.cloneNode(id), - ]); - } - - if (isMethod) { - if (isAccessor) { - return t.callExpression(file.addHelper('classPrivateFieldGet'), [ - this.receiver(member), - t.cloneNode(id), - ]); - } - - return t.callExpression(file.addHelper('classPrivateMethodGet'), [ - this.receiver(member), - t.cloneNode(id), - t.cloneNode(methodId), - ]); - } - - return t.callExpression(file.addHelper('classPrivateFieldGet'), [ - this.receiver(member), - t.cloneNode(id), - ]); - }, - - set(member, value) { - const { classRef, privateNamesMap, file } = this; - const { name } = member.node.property.id; - const { - id, - static: isStatic, - method: isMethod, - setId, - getId, - } = privateNamesMap.get(name); - const isAccessor = getId || setId; - - if (isStatic) { - const helperName = - isMethod && !isAccessor - ? 'classStaticPrivateMethodSet' - : 'classStaticPrivateFieldSpecSet'; - - return t.callExpression(file.addHelper(helperName), [ - this.receiver(member), - t.cloneNode(classRef), - t.cloneNode(id), - value, - ]); - } - - if (isMethod) { - if (setId) { - return t.callExpression(file.addHelper('classPrivateFieldSet'), [ - this.receiver(member), - t.cloneNode(id), - value, - ]); - } - - return t.callExpression(file.addHelper('classPrivateMethodSet'), []); - } - - return t.callExpression(file.addHelper('classPrivateFieldSet'), [ - this.receiver(member), - t.cloneNode(id), - value, - ]); - }, - - destructureSet(member) { - const { privateNamesMap, file } = this; - const { name } = member.node.property.id; - const { id } = privateNamesMap.get(name); - return t.memberExpression( - t.callExpression(file.addHelper('classPrivateFieldDestructureSet'), [ - this.receiver(member), - t.cloneNode(id), - ]), - t.identifier('value'), - ); - }, - - call(member, args) { - // The first access (the get) should do the memo assignment. - this.memoise(member, 1); - - return optimiseCall(this.get(member), this.receiver(member), args); - }, -}; - -const privateNameHandlerLoose = { - handle(member) { - const { privateNamesMap, file } = this; - const { object } = member.node; - const { name } = member.node.property.id; - - member.replaceWith( - template.expression`BASE(REF, PROP)[PROP]`({ - BASE: file.addHelper('classPrivateFieldLooseBase'), - REF: object, - PROP: privateNamesMap.get(name).id, - }), - ); - }, -}; - -export function transformPrivateNamesUsage( - ref, - path, - privateNamesMap, - loose, - state, -) { - const body = path.get('body'); - - if (loose) { - body.traverse(privateNameVisitor, { - privateNamesMap, - file: state, - ...privateNameHandlerLoose, - }); - } else { - memberExpressionToFunctions(body, privateNameVisitor, { - privateNamesMap, - classRef: ref, - file: state, - ...privateNameHandlerSpec, - }); - } -} - -function buildPrivateFieldInitLoose(ref, prop, privateNamesMap) { - const { id } = privateNamesMap.get(prop.node.key.id.name); - const value = prop.node.value || prop.scope.buildUndefinedNode(); - - return template.statement.ast` - Object.defineProperty(${ref}, ${id}, { - // configurable is false by default - // enumerable is false by default - writable: true, - value: ${value} - }); - `; -} - -function buildPrivateInstanceFieldInitSpec(ref, prop, privateNamesMap) { - const { id } = privateNamesMap.get(prop.node.key.id.name); - const value = prop.node.value || prop.scope.buildUndefinedNode(); - - return template.statement.ast`${id}.set(${ref}, { - // configurable is always false for private elements - // enumerable is always false for private elements - writable: true, - value: ${value}, - })`; -} - -function buildPrivateStaticFieldInitSpec(prop, privateNamesMap) { - const privateName = privateNamesMap.get(prop.node.key.id.name); - const { id, getId, setId, initAdded } = privateName; - const isAccessor = getId || setId; - - if (!prop.isProperty() && (initAdded || !isAccessor)) return; - - if (isAccessor) { - privateNamesMap.set(prop.node.key.id.name, { - ...privateName, - initAdded: true, - }); - - return template.statement.ast` - var ${id.name} = { - // configurable is false by default - // enumerable is false by default - // writable is false by default - get: ${getId ? getId.name : prop.scope.buildUndefinedNode()}, - set: ${setId ? setId.name : prop.scope.buildUndefinedNode()} - } - `; - } - - const value = prop.node.value || prop.scope.buildUndefinedNode(); - return template.statement.ast` - var ${id} = { - // configurable is false by default - // enumerable is false by default - writable: true, - value: ${value} - }; - `; -} - -function buildPrivateMethodInitLoose(ref, prop, privateNamesMap) { - const privateName = privateNamesMap.get(prop.node.key.id.name); - const { methodId, id, getId, setId, initAdded } = privateName; - if (initAdded) return; - - if (methodId) { - return template.statement.ast` - Object.defineProperty(${ref}, ${id}, { - // configurable is false by default - // enumerable is false by default - // writable is false by default - value: ${methodId.name} - }); - `; - } - - const isAccessor = getId || setId; - if (isAccessor) { - privateNamesMap.set(prop.node.key.id.name, { - ...privateName, - initAdded: true, - }); - - return template.statement.ast` - Object.defineProperty(${ref}, ${id}, { - // configurable is false by default - // enumerable is false by default - // writable is false by default - get: ${getId ? getId.name : prop.scope.buildUndefinedNode()}, - set: ${setId ? setId.name : prop.scope.buildUndefinedNode()} - }); - `; - } -} - -function buildPrivateInstanceMethodInitSpec(ref, prop, privateNamesMap) { - const privateName = privateNamesMap.get(prop.node.key.id.name); - const { id, getId, setId, initAdded } = privateName; - - if (initAdded) return; - - const isAccessor = getId || setId; - if (isAccessor) { - privateNamesMap.set(prop.node.key.id.name, { - ...privateName, - initAdded: true, - }); - - return template.statement.ast` - ${id}.set(${ref}, { - get: ${getId ? getId.name : prop.scope.buildUndefinedNode()}, - set: ${setId ? setId.name : prop.scope.buildUndefinedNode()} - }); - `; - } - - return template.statement.ast`${id}.add(${ref})`; -} - -function buildPublicFieldInitLoose(ref, prop) { - const { key, computed } = prop.node; - const value = prop.node.value || prop.scope.buildUndefinedNode(); - - return t.expressionStatement( - t.assignmentExpression( - '=', - t.memberExpression(ref, key, computed || t.isLiteral(key)), - value, - ), - ); -} - -function buildPublicFieldInitSpec(ref, prop, state) { - const { key, computed } = prop.node; - const value = prop.node.value || prop.scope.buildUndefinedNode(); - - return t.expressionStatement( - t.callExpression(state.addHelper('defineProperty'), [ - ref, - computed || t.isLiteral(key) ? key : t.stringLiteral(key.name), - value, - ]), - ); -} - -function buildPrivateStaticMethodInitLoose(ref, prop, state, privateNamesMap) { - const privateName = privateNamesMap.get(prop.node.key.id.name); - const { id, methodId, getId, setId, initAdded } = privateName; - - if (initAdded) return; - - const isAccessor = getId || setId; - if (isAccessor) { - privateNamesMap.set(prop.node.key.id.name, { - ...privateName, - initAdded: true, - }); - - return template.statement.ast` - Object.defineProperty(${ref}, ${id}, { - // configurable is false by default - // enumerable is false by default - // writable is false by default - get: ${getId ? getId.name : prop.scope.buildUndefinedNode()}, - set: ${setId ? setId.name : prop.scope.buildUndefinedNode()} - }) - `; - } - - return template.statement.ast` - Object.defineProperty(${ref}, ${id}, { - // configurable is false by default - // enumerable is false by default - // writable is false by default - value: ${methodId.name} - }); - `; -} - -function buildPrivateMethodDeclaration(prop, privateNamesMap, loose = false) { - const privateName = privateNamesMap.get(prop.node.key.id.name); - const { - id, - methodId, - getId, - setId, - getterDeclared, - setterDeclared, - static: isStatic, - } = privateName; - const { params, body, generator, async } = prop.node; - const methodValue = t.functionExpression( - methodId, - params, - body, - generator, - async, - ); - const isGetter = getId && !getterDeclared && params.length === 0; - const isSetter = setId && !setterDeclared && params.length > 0; - - if (isGetter) { - privateNamesMap.set(prop.node.key.id.name, { - ...privateName, - getterDeclared: true, - }); - return t.variableDeclaration('var', [ - t.variableDeclarator(getId, methodValue), - ]); - } - - if (isSetter) { - privateNamesMap.set(prop.node.key.id.name, { - ...privateName, - setterDeclared: true, - }); - return t.variableDeclaration('var', [ - t.variableDeclarator(setId, methodValue), - ]); - } - - if (isStatic && !loose) { - return t.variableDeclaration('var', [ - t.variableDeclarator( - id, - t.functionExpression(id, params, body, generator, async), - ), - ]); - } - - return t.variableDeclaration('var', [ - t.variableDeclarator(methodId, methodValue), - ]); -} - -const thisContextVisitor = traverse.visitors.merge([ - { - ThisExpression(path, state) { - state.needsClassRef = true; - path.replaceWith(t.cloneNode(state.classRef)); - }, - }, - environmentVisitor, -]); - -function replaceThisContext(path, ref, superRef, file, loose) { - const state = { classRef: ref, needsClassRef: false }; - - const replacer = new ReplaceSupers({ - methodPath: path, - isLoose: loose, - superRef, - file, - getObjectRef() { - state.needsClassRef = true; - return path.node.static - ? ref - : t.memberExpression(ref, t.identifier('prototype')); - }, - }); - replacer.replace(); - if (path.isProperty()) { - path.traverse(thisContextVisitor, state); - } - - return state.needsClassRef; -} - -// eslint-disable-next-line complexity -export function buildFieldsInitNodes( - ref, - superRef, - props, - privateNamesMap, - state, - loose, -) { - const staticNodes = []; - const instanceNodes = []; - let needsClassRef = false; - - for (const prop of props) { - ts.assertFieldTransformed(prop); - - const isStatic = prop.node.static; - const isInstance = !isStatic; - const isPrivate = prop.isPrivate(); - const isPublic = !isPrivate; - const isField = prop.isProperty(); - const isMethod = !isField; - - if (isStatic || (isMethod && isPrivate)) { - const replaced = replaceThisContext(prop, ref, superRef, state, loose); - needsClassRef = needsClassRef || replaced; - } - - switch (true) { - case isStatic && isPrivate && isField && loose: { - needsClassRef = true; - staticNodes.push( - buildPrivateFieldInitLoose(t.cloneNode(ref), prop, privateNamesMap), - ); - break; - } - case isStatic && isPrivate && isField && !loose: { - needsClassRef = true; - staticNodes.push( - buildPrivateStaticFieldInitSpec(prop, privateNamesMap), - ); - break; - } - case isStatic && isPublic && isField && loose: { - needsClassRef = true; - staticNodes.push(buildPublicFieldInitLoose(t.cloneNode(ref), prop)); - break; - } - case isStatic && isPublic && isField && !loose: { - needsClassRef = true; - staticNodes.push( - buildPublicFieldInitSpec(t.cloneNode(ref), prop, state), - ); - break; - } - case isInstance && isPrivate && isField && loose: { - instanceNodes.push( - buildPrivateFieldInitLoose(t.thisExpression(), prop, privateNamesMap), - ); - break; - } - case isInstance && isPrivate && isField && !loose: { - instanceNodes.push( - buildPrivateInstanceFieldInitSpec( - t.thisExpression(), - prop, - privateNamesMap, - ), - ); - break; - } - case isInstance && isPrivate && isMethod && loose: { - instanceNodes.unshift( - buildPrivateMethodInitLoose( - t.thisExpression(), - prop, - privateNamesMap, - ), - ); - staticNodes.push( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), - ); - break; - } - case isInstance && isPrivate && isMethod && !loose: { - instanceNodes.unshift( - buildPrivateInstanceMethodInitSpec( - t.thisExpression(), - prop, - privateNamesMap, - ), - ); - staticNodes.push( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), - ); - break; - } - case isStatic && isPrivate && isMethod && !loose: { - needsClassRef = true; - staticNodes.push( - buildPrivateStaticFieldInitSpec(prop, privateNamesMap), - ); - staticNodes.unshift( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), - ); - break; - } - case isStatic && isPrivate && isMethod && loose: { - needsClassRef = true; - staticNodes.push( - buildPrivateStaticMethodInitLoose( - t.cloneNode(ref), - prop, - state, - privateNamesMap, - ), - ); - staticNodes.unshift( - buildPrivateMethodDeclaration(prop, privateNamesMap, loose), - ); - break; - } - case isInstance && isPublic && isField && loose: { - instanceNodes.push(buildPublicFieldInitLoose(t.thisExpression(), prop)); - break; - } - case isInstance && isPublic && isField && !loose: { - instanceNodes.push( - buildPublicFieldInitSpec(t.thisExpression(), prop, state), - ); - break; - } - default: { - throw new Error('Unreachable.'); - } - } - } - - return { - staticNodes: staticNodes.filter(Boolean), - instanceNodes: instanceNodes.filter(Boolean), - wrapClass(path) { - for (const prop of props) { - prop.remove(); - } - - if (!needsClassRef) return path; - - if (path.isClassExpression()) { - path.scope.push({ id: ref }); - path.replaceWith( - t.assignmentExpression('=', t.cloneNode(ref), path.node), - ); - } else if (!path.node.id) { - // Anonymous class declaration - path.node.id = ref; - } - - return path; - }, - }; -} diff --git a/fixtures/babel/packages/babel-plugin-transform-for-of/src/index.js b/fixtures/babel/packages/babel-plugin-transform-for-of/src/index.js deleted file mode 100644 index 99bc3936..00000000 --- a/fixtures/babel/packages/babel-plugin-transform-for-of/src/index.js +++ /dev/null @@ -1,217 +0,0 @@ -import { types as t, template } from '@babel/core'; -import { declare } from '@babel/helper-plugin-utils'; - -import transformWithoutHelper from './no-helper-implementation'; - -export default declare((api, options) => { - api.assertVersion(7); - - const { loose, assumeArray } = options; - - if (loose === true && assumeArray === true) { - throw new Error( - `The loose and assumeArray options cannot be used together in @babel/plugin-transform-for-of`, - ); - } - - if (assumeArray) { - return { - name: 'transform-for-of', - - visitor: { - ForOfStatement(path) { - const { scope } = path; - const { left, right, await: isAwait } = path.node; - if (isAwait) { - return; - } - - const i = scope.generateUidIdentifier('i'); - let array = scope.maybeGenerateMemoised(right, true); - - const inits = [t.variableDeclarator(i, t.numericLiteral(0))]; - if (array) { - inits.push(t.variableDeclarator(array, right)); - } else { - array = right; - } - - const item = t.memberExpression( - t.cloneNode(array), - t.cloneNode(i), - true, - ); - let assignment; - if (t.isVariableDeclaration(left)) { - assignment = left; - assignment.declarations[0].init = item; - } else { - assignment = t.expressionStatement( - t.assignmentExpression('=', left, item), - ); - } - - let blockBody; - const body = path.get('body'); - if ( - body.isBlockStatement() && - Object.keys(path.getBindingIdentifiers()).some((id) => - body.scope.hasOwnBinding(id), - ) - ) { - blockBody = t.blockStatement([assignment, body.node]); - } else { - blockBody = t.toBlock(body.node); - blockBody.body.unshift(assignment); - } - - path.replaceWith( - t.forStatement( - t.variableDeclaration('let', inits), - t.binaryExpression( - '<', - t.cloneNode(i), - t.memberExpression(t.cloneNode(array), t.identifier('length')), - ), - t.updateExpression('++', t.cloneNode(i)), - blockBody, - ), - ); - }, - }, - }; - } - - const buildForOfArray = template(` - for (var KEY = 0, NAME = ARR; KEY < NAME.length; KEY++) BODY; - `); - - const buildForOfLoose = template.statements(` - for (var ITERATOR_HELPER = CREATE_ITERATOR_HELPER(OBJECT), STEP_KEY; - !(STEP_KEY = ITERATOR_HELPER()).done;) BODY; - `); - - const buildForOf = template.statements(` - var ITERATOR_HELPER = CREATE_ITERATOR_HELPER(OBJECT), STEP_KEY; - try { - for (ITERATOR_HELPER.s(); !(STEP_KEY = ITERATOR_HELPER.n()).done;) BODY; - } catch (err) { - ITERATOR_HELPER.e(err); - } finally { - ITERATOR_HELPER.f(); - } - `); - - const builder = loose - ? { - build: buildForOfLoose, - helper: 'createForOfIteratorHelperLoose', - getContainer: (nodes) => nodes, - } - : { - build: buildForOf, - helper: 'createForOfIteratorHelper', - getContainer: (nodes) => nodes[1].block.body, - }; - - function _ForOfStatementArray(path) { - const { node, scope } = path; - - const right = scope.generateUidIdentifierBasedOnNode(node.right, 'arr'); - const iterationKey = scope.generateUidIdentifier('i'); - - const loop = buildForOfArray({ - BODY: node.body, - KEY: iterationKey, - NAME: right, - ARR: node.right, - }); - - t.inherits(loop, node); - t.ensureBlock(loop); - - const iterationValue = t.memberExpression( - t.cloneNode(right), - t.cloneNode(iterationKey), - true, - ); - - const left = node.left; - if (t.isVariableDeclaration(left)) { - left.declarations[0].init = iterationValue; - loop.body.body.unshift(left); - } else { - loop.body.body.unshift( - t.expressionStatement( - t.assignmentExpression('=', left, iterationValue), - ), - ); - } - - return loop; - } - - return { - name: 'transform-for-of', - visitor: { - ForOfStatement(path, state) { - const right = path.get('right'); - if ( - right.isArrayExpression() || - right.isGenericType('Array') || - t.isArrayTypeAnnotation(right.getTypeAnnotation()) - ) { - path.replaceWith(_ForOfStatementArray(path)); - return; - } - - if (!state.availableHelper(builder.helper)) { - // Babel <7.9.0 doesn't support this helper - transformWithoutHelper(loose, path, state); - return; - } - - const { node, parent, scope } = path; - const left = node.left; - - const stepKey = scope.generateUid('step'); - const stepValue = t.memberExpression( - t.identifier(stepKey), - t.identifier('value'), - ); - - const declar = t.isVariableDeclaration(left) - ? t.variableDeclaration(left.kind, [ - t.variableDeclarator(left.declarations[0].id, stepValue), - ]) - : t.expressionStatement(t.assignmentExpression('=', left, stepValue)); - - // Ensure that it's a block so we can take all its statements - path.ensureBlock(); - - node.body.body.unshift(declar); - - const nodes = builder.build({ - CREATE_ITERATOR_HELPER: state.addHelper(builder.helper), - ITERATOR_HELPER: scope.generateUidIdentifier('iterator'), - STEP_KEY: t.identifier(stepKey), - OBJECT: node.right, - BODY: node.body, - }); - const container = builder.getContainer(nodes); - - t.inherits(container[0], node); - t.inherits(container[0].body, node.body); - - if (t.isLabeledStatement(parent)) { - container[0] = t.labeledStatement(parent.label, container[0]); - - path.parentPath.replaceWithMultiple(nodes); - path.remove(); - } else { - path.replaceWithMultiple(nodes); - } - }, - }, - }; -}); diff --git a/fixtures/babel/packages/babel-plugin-transform-modules-amd/src/index.js b/fixtures/babel/packages/babel-plugin-transform-modules-amd/src/index.js deleted file mode 100644 index 55a182b9..00000000 --- a/fixtures/babel/packages/babel-plugin-transform-modules-amd/src/index.js +++ /dev/null @@ -1,166 +0,0 @@ -import { types as t, template } from '@babel/core'; -import { - buildNamespaceInitStatements, - ensureStatementsHoisted, - getModuleName, - hasExports, - isModule, - isSideEffectImport, - rewriteModuleStatementsAndPrepareHeader, - wrapInterop, -} from '@babel/helper-module-transforms'; -import { declare } from '@babel/helper-plugin-utils'; -import { getImportSource } from 'babel-plugin-dynamic-import-node/utils'; - -const buildWrapper = template(` - define(MODULE_NAME, AMD_ARGUMENTS, function(IMPORT_NAMES) { - }) -`); - -const buildAnonymousWrapper = template(` - define(["require"], function(REQUIRE) { - }) -`); - -function injectWrapper(path, wrapper) { - const { body, directives } = path.node; - path.node.directives = []; - path.node.body = []; - const amdWrapper = path.pushContainer('body', wrapper)[0]; - const amdFactory = amdWrapper - .get('expression.arguments') - .find((arg) => arg.isFunctionExpression()) - .get('body'); - amdFactory.pushContainer('directives', directives); - amdFactory.pushContainer('body', body); -} - -export default declare((api, options) => { - api.assertVersion(7); - - const { loose, allowTopLevelThis, strict, strictMode, noInterop } = options; - return { - name: 'transform-modules-amd', - - pre() { - this.file.set('@babel/plugin-transform-modules-*', 'amd'); - }, - - visitor: { - CallExpression(path, state) { - if (!this.file.has('@babel/plugin-proposal-dynamic-import')) return; - if (!path.get('callee').isImport()) return; - - let { requireId, resolveId, rejectId } = state; - if (!requireId) { - requireId = path.scope.generateUidIdentifier('require'); - state.requireId = requireId; - } - - if (!resolveId || !rejectId) { - resolveId = path.scope.generateUidIdentifier('resolve'); - rejectId = path.scope.generateUidIdentifier('reject'); - state.resolveId = resolveId; - state.rejectId = rejectId; - } - - let result = t.identifier('imported'); - if (!noInterop) result = wrapInterop(path, result, 'namespace'); - - path.replaceWith( - template.expression.ast` - new Promise((${resolveId}, ${rejectId}) => - ${requireId}( - [${getImportSource(t, path.node)}], - imported => ${resolveId}(${result}), - ${rejectId} - ) - )`, - ); - }, - - Program: { - exit(path, { requireId }) { - if (!isModule(path)) { - if (requireId) { - injectWrapper( - path, - buildAnonymousWrapper({ REQUIRE: requireId }), - ); - } - - return; - } - - const amdArgs = []; - const importNames = []; - if (requireId) { - amdArgs.push(t.stringLiteral('require')); - importNames.push(requireId); - } - - let moduleName = getModuleName(this.file.opts, options); - if (moduleName) moduleName = t.stringLiteral(moduleName); - - const { meta, headers } = rewriteModuleStatementsAndPrepareHeader( - path, - { - loose, - strict, - strictMode, - allowTopLevelThis, - noInterop, - }, - ); - - if (hasExports(meta)) { - amdArgs.push(t.stringLiteral('exports')); - - importNames.push(t.identifier(meta.exportName)); - } - - for (const [source, metadata] of meta.source) { - amdArgs.push(t.stringLiteral(source)); - importNames.push(t.identifier(metadata.name)); - - if (!isSideEffectImport(metadata)) { - const interop = wrapInterop( - path, - t.identifier(metadata.name), - metadata.interop, - ); - if (interop) { - const header = t.expressionStatement( - t.assignmentExpression( - '=', - t.identifier(metadata.name), - interop, - ), - ); - header.loc = metadata.loc; - headers.push(header); - } - } - - headers.push( - ...buildNamespaceInitStatements(meta, metadata, loose), - ); - } - - ensureStatementsHoisted(headers); - path.unshiftContainer('body', headers); - - injectWrapper( - path, - buildWrapper({ - MODULE_NAME: moduleName, - - AMD_ARGUMENTS: t.arrayExpression(amdArgs), - IMPORT_NAMES: importNames, - }), - ); - }, - }, - }, - }; -}); diff --git a/fixtures/babel/packages/babel-plugin-transform-modules-commonjs/src/index.js b/fixtures/babel/packages/babel-plugin-transform-modules-commonjs/src/index.js deleted file mode 100644 index d5a30605..00000000 --- a/fixtures/babel/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ /dev/null @@ -1,228 +0,0 @@ -import { types as t, template } from '@babel/core'; -import { - buildNamespaceInitStatements, - ensureStatementsHoisted, - getModuleName, - isModule, - isSideEffectImport, - rewriteModuleStatementsAndPrepareHeader, - wrapInterop, -} from '@babel/helper-module-transforms'; -import { declare } from '@babel/helper-plugin-utils'; -import simplifyAccess from '@babel/helper-simple-access'; -import { createDynamicImportTransform } from 'babel-plugin-dynamic-import-node/utils'; - -export default declare((api, options) => { - api.assertVersion(7); - - const transformImportCall = createDynamicImportTransform(api); - - const { - loose, - - // 'true' for non-mjs files to strictly have .default, instead of having - // destructuring-like behavior for their properties. - strictNamespace = false, - - // 'true' for mjs files to strictly have .default, instead of having - // destructuring-like behavior for their properties. - mjsStrictNamespace = true, - allowTopLevelThis, - strict, - strictMode, - noInterop, - lazy = false, - // Defaulting to 'true' for now. May change before 7.x major. - allowCommonJSExports = true, - } = options; - - if ( - typeof lazy !== 'boolean' && - typeof lazy !== 'function' && - (!Array.isArray(lazy) || !lazy.every((item) => typeof item === 'string')) - ) { - throw new Error(`.lazy must be a boolean, array of strings, or a function`); - } - - if (typeof strictNamespace !== 'boolean') { - throw new TypeError(`.strictNamespace must be a boolean, or undefined`); - } - - if (typeof mjsStrictNamespace !== 'boolean') { - throw new TypeError(`.mjsStrictNamespace must be a boolean, or undefined`); - } - - // eslint-disable-next-line @cloudfour/unicorn/consistent-function-scoping - const getAssertion = (localName) => template.expression.ast` - (function(){ - throw new Error( - "The CommonJS '" + "${localName}" + "' variable is not available in ES6 modules." + - "Consider setting setting sourceType:script or sourceType:unambiguous in your " + - "Babel config for this file."); - })() - `; - - const moduleExportsVisitor = { - ReferencedIdentifier(path) { - const localName = path.node.name; - if (localName !== 'module' && localName !== 'exports') return; - - const localBinding = path.scope.getBinding(localName); - const rootBinding = this.scope.getBinding(localName); - - if ( - // Redeclared in this scope - rootBinding !== localBinding || - (path.parentPath.isObjectProperty({ value: path.node }) && - path.parentPath.parentPath.isObjectPattern()) || - path.parentPath.isAssignmentExpression({ left: path.node }) || - path.isAssignmentExpression({ left: path.node }) - ) { - return; - } - - path.replaceWith(getAssertion(localName)); - }, - - AssignmentExpression(path) { - const left = path.get('left'); - if (left.isIdentifier()) { - const localName = path.node.name; - if (localName !== 'module' && localName !== 'exports') return; - - const localBinding = path.scope.getBinding(localName); - const rootBinding = this.scope.getBinding(localName); - - // Redeclared in this scope - if (rootBinding !== localBinding) return; - - const right = path.get('right'); - right.replaceWith( - t.sequenceExpression([right.node, getAssertion(localName)]), - ); - } else if (left.isPattern()) { - const ids = left.getOuterBindingIdentifiers(); - const localName = Object.keys(ids).find((localName) => { - if (localName !== 'module' && localName !== 'exports') return false; - - return ( - this.scope.getBinding(localName) === - path.scope.getBinding(localName) - ); - }); - - if (localName) { - const right = path.get('right'); - right.replaceWith( - t.sequenceExpression([right.node, getAssertion(localName)]), - ); - } - } - }, - }; - - return { - name: 'transform-modules-commonjs', - - pre() { - this.file.set('@babel/plugin-transform-modules-*', 'commonjs'); - }, - - visitor: { - CallExpression(path) { - if (!this.file.has('@babel/plugin-proposal-dynamic-import')) return; - if (!path.get('callee').isImport()) return; - - let { scope } = path; - do { - scope.rename('require'); - } while ((scope = scope.parent)); - - transformImportCall(this, path.get('callee')); - }, - - Program: { - exit(path, state) { - if (!isModule(path)) return; - - // Rename the bindings auto-injected into the scope so there is no - // risk of conflict between the bindings. - path.scope.rename('exports'); - path.scope.rename('module'); - path.scope.rename('require'); - path.scope.rename('__filename'); - path.scope.rename('__dirname'); - - // Rewrite references to 'module' and 'exports' to throw exceptions. - // These objects are specific to CommonJS and are not available in - // real ES6 implementations. - if (!allowCommonJSExports) { - simplifyAccess(path, new Set(['module', 'exports'])); - path.traverse(moduleExportsVisitor, { - scope: path.scope, - }); - } - - let moduleName = getModuleName(this.file.opts, options); - if (moduleName) moduleName = t.stringLiteral(moduleName); - - const { meta, headers } = rewriteModuleStatementsAndPrepareHeader( - path, - { - exportName: 'exports', - loose, - strict, - strictMode, - allowTopLevelThis, - noInterop, - lazy, - esNamespaceOnly: - typeof state.filename === 'string' && - /\.mjs$/.test(state.filename) - ? mjsStrictNamespace - : strictNamespace, - }, - ); - - for (const [source, metadata] of meta.source) { - const loadExpr = t.callExpression(t.identifier('require'), [ - t.stringLiteral(source), - ]); - - let header; - if (isSideEffectImport(metadata)) { - if (metadata.lazy) throw new Error('Assertion failure'); - - header = t.expressionStatement(loadExpr); - } else { - const init = - wrapInterop(path, loadExpr, metadata.interop) || loadExpr; - - header = metadata.lazy - ? template.ast` - function ${metadata.name}() { - const data = ${init}; - ${metadata.name} = function(){ return data; }; - return data; - } - ` - : template.ast` - var ${metadata.name} = ${init}; - `; - } - - header.loc = metadata.loc; - - headers.push( - header, - ...buildNamespaceInitStatements(meta, metadata, loose), - ); - } - - ensureStatementsHoisted(headers); - path.unshiftContainer('body', headers); - }, - }, - }, - }; -}); diff --git a/fixtures/babel/packages/babel-plugin-transform-parameters/src/params.js b/fixtures/babel/packages/babel-plugin-transform-parameters/src/params.js deleted file mode 100644 index ec7f4e0b..00000000 --- a/fixtures/babel/packages/babel-plugin-transform-parameters/src/params.js +++ /dev/null @@ -1,208 +0,0 @@ -import { types as t, template } from '@babel/core'; - -const buildDefaultParam = template(` - let VARIABLE_NAME = - arguments.length > ARGUMENT_KEY && arguments[ARGUMENT_KEY] !== undefined ? - arguments[ARGUMENT_KEY] - : - DEFAULT_VALUE; -`); - -const buildLooseDefaultParam = template(` - if (ASSIGNMENT_IDENTIFIER === UNDEFINED) { - ASSIGNMENT_IDENTIFIER = DEFAULT_VALUE; - } -`); - -const buildLooseDestructuredDefaultParam = template(` - let ASSIGNMENT_IDENTIFIER = PARAMETER_NAME === UNDEFINED ? DEFAULT_VALUE : PARAMETER_NAME ; -`); - -const buildSafeArgumentsAccess = template(` - let $0 = arguments.length > $1 ? arguments[$1] : undefined; -`); - -const iifeVisitor = { - 'ReferencedIdentifier|BindingIdentifier'(path, state) { - const { scope, node } = path; - const { name } = node; - - if ( - name === 'eval' || - (scope.getBinding(name) === state.scope.parent.getBinding(name) && - state.scope.hasOwnBinding(name)) - ) { - state.needsOuterBinding = true; - path.stop(); - } - }, -}; - -// eslint-disable-next-line complexity -export default function convertFunctionParams(path, loose) { - const params = path.get('params'); - - const isSimpleParameterList = params.every((param) => param.isIdentifier()); - if (isSimpleParameterList) return false; - - const { node, scope } = path; - - const state = { - stop: false, - needsOuterBinding: false, - scope, - }; - - const body = []; - const shadowedParams = new Set(); - - for (const param of params) { - for (const name of Object.keys(param.getBindingIdentifiers())) { - const constantViolations = scope.bindings[name].constantViolations; - if (constantViolations) { - for (const redeclarator of constantViolations) { - const node = redeclarator.node; - // If a constant violation is a var or a function declaration, - // we first check to see if it's a var without an init. - // If so, we remove that declarator. - // Otherwise, we have to wrap it in an IIFE. - // eslint-disable-next-line default-case, max-depth - switch (node.type) { - case 'VariableDeclarator': { - // eslint-disable-next-line max-depth - if (node.init === null) { - const declaration = redeclarator.parentPath; - // The following uninitialized var declarators should not be removed - // for (var x in {}) - // for (var x;;) - // eslint-disable-next-line max-depth - if ( - !declaration.parentPath.isFor() || - declaration.parentPath.get('body') === declaration - ) { - redeclarator.remove(); - break; - } - } - - shadowedParams.add(name); - break; - } - - case 'FunctionDeclaration': { - shadowedParams.add(name); - break; - } - } - } - } - } - } - - if (shadowedParams.size === 0) { - for (const param of params) { - if (!param.isIdentifier()) param.traverse(iifeVisitor, state); - if (state.needsOuterBinding) break; - } - } - - let firstOptionalIndex = null; - - for (const [i, param] of params.entries()) { - const paramIsAssignmentPattern = param.isAssignmentPattern(); - if (paramIsAssignmentPattern && (loose || node.kind === 'set')) { - const left = param.get('left'); - const right = param.get('right'); - - const undefinedNode = scope.buildUndefinedNode(); - - if (left.isIdentifier()) { - body.push( - buildLooseDefaultParam({ - ASSIGNMENT_IDENTIFIER: t.cloneNode(left.node), - DEFAULT_VALUE: right.node, - UNDEFINED: undefinedNode, - }), - ); - param.replaceWith(left.node); - } else if (left.isObjectPattern() || left.isArrayPattern()) { - const paramName = scope.generateUidIdentifier(); - body.push( - buildLooseDestructuredDefaultParam({ - ASSIGNMENT_IDENTIFIER: left.node, - DEFAULT_VALUE: right.node, - PARAMETER_NAME: t.cloneNode(paramName), - UNDEFINED: undefinedNode, - }), - ); - param.replaceWith(paramName); - } - } else if (paramIsAssignmentPattern) { - if (firstOptionalIndex === null) firstOptionalIndex = i; - - const left = param.get('left'); - const right = param.get('right'); - - const defNode = buildDefaultParam({ - VARIABLE_NAME: left.node, - DEFAULT_VALUE: right.node, - ARGUMENT_KEY: t.numericLiteral(i), - }); - body.push(defNode); - } else if (firstOptionalIndex !== null) { - const defNode = buildSafeArgumentsAccess([ - param.node, - t.numericLiteral(i), - ]); - body.push(defNode); - } else if (param.isObjectPattern() || param.isArrayPattern()) { - const uid = path.scope.generateUidIdentifier('ref'); - - const defNode = t.variableDeclaration('let', [ - t.variableDeclarator(param.node, uid), - ]); - body.push(defNode); - - param.replaceWith(t.cloneNode(uid)); - } - } - - // We need to cut off all trailing parameters - if (firstOptionalIndex !== null) { - node.params = node.params.slice(0, firstOptionalIndex); - } - - // Ensure it's a block, useful for arrow functions - path.ensureBlock(); - - if (state.needsOuterBinding || shadowedParams.size > 0) { - body.push(buildScopeIIFE(shadowedParams, path.get('body').node)); - - path.set('body', t.blockStatement(body)); - - // We inject an arrow and then transform it to a normal function, to be - // sure that we correctly handle this and arguments. - const bodyPath = path.get('body.body'); - const arrowPath = bodyPath[bodyPath.length - 1].get('argument.callee'); - arrowPath.arrowFunctionToExpression(); - } else { - path.get('body').unshiftContainer('body', body); - } - - return true; -} - -function buildScopeIIFE(shadowedParams, body) { - const args = []; - const params = []; - - for (const name of shadowedParams) { - // We create them twice; the other option is to use t.cloneNode - args.push(t.identifier(name)); - params.push(t.identifier(name)); - } - - return t.returnStatement( - t.callExpression(t.arrowFunctionExpression(params, body), params), - ); -} diff --git a/fixtures/babel/packages/babel-plugin-transform-runtime/scripts/build-dist.js b/fixtures/babel/packages/babel-plugin-transform-runtime/scripts/build-dist.js deleted file mode 100644 index 7619d143..00000000 --- a/fixtures/babel/packages/babel-plugin-transform-runtime/scripts/build-dist.js +++ /dev/null @@ -1,223 +0,0 @@ -'use strict'; - -const path = require('node:path'); - -const babel = require('@babel/core'); -const helpers = require('@babel/helpers'); -const runtimeVersion = require('@babel/runtime/package.json').version; -const template = require('@babel/template'); -const t = require('@babel/types'); -const outputFile = require('output-file-sync'); - -const transformRuntime = require('..'); -const corejs2Definitions = - require('../lib/runtime-corejs2-definitions').default(); -const corejs3Definitions = - require('../lib/runtime-corejs3-definitions').default(); - -writeHelpers('@babel/runtime'); -writeHelpers('@babel/runtime-corejs2', { corejs: 2 }); -writeHelpers('@babel/runtime-corejs3', { - corejs: { version: 3, proposals: true }, -}); - -writeCoreJS({ - corejs: 2, - proposals: true, - definitions: corejs2Definitions, - paths: [ - 'is-iterable', - 'get-iterator', - // This was previously in definitions, but was removed to work around - // zloirock/core-js#262. We need to keep it in @babel/runtime-corejs2 to - // avoid a breaking change there. - 'symbol/async-iterator', - ], - corejsRoot: 'core-js/library/fn', -}); -writeCoreJS({ - corejs: 3, - proposals: false, - definitions: corejs3Definitions, - paths: [], - corejsRoot: 'core-js-pure/stable', -}); -writeCoreJS({ - corejs: 3, - proposals: true, - definitions: corejs3Definitions, - paths: ['is-iterable', 'get-iterator', 'get-iterator-method'], - corejsRoot: 'core-js-pure/features', -}); - -function writeCoreJS({ - corejs, - proposals, - definitions: { BuiltIns, StaticProperties, InstanceProperties }, - paths, - corejsRoot, -}) { - const pkgDirname = getRuntimeRoot(`@babel/runtime-corejs${corejs}`); - - for (const name of Object.keys(BuiltIns)) { - const { stable, path } = BuiltIns[name]; - if (stable || proposals) paths.push(path); - } - - for (const builtin of Object.keys(StaticProperties)) { - const props = StaticProperties[builtin]; - for (const name of Object.keys(props)) { - const { stable, path } = props[name]; - if (stable || proposals) paths.push(path); - } - } - - if (InstanceProperties) { - for (const name of Object.keys(InstanceProperties)) { - const { stable, path } = InstanceProperties[name]; - if (stable || proposals) paths.push(`instance/${path}`); - } - } - - const runtimeRoot = proposals ? 'core-js' : 'core-js-stable'; - for (const corejsPath of paths) { - outputFile( - path.join(pkgDirname, runtimeRoot, `${corejsPath}.js`), - `module.exports = require("${corejsRoot}/${corejsPath}");`, - ); - } -} - -function writeHelpers(runtimeName, { corejs } = {}) { - writeHelperFiles(runtimeName, { corejs, esm: false }); - writeHelperFiles(runtimeName, { corejs, esm: true }); -} - -function writeHelperFiles(runtimeName, { esm, corejs }) { - const pkgDirname = getRuntimeRoot(runtimeName); - - for (const helperName of helpers.list) { - const helperFilename = path.join( - pkgDirname, - 'helpers', - esm ? 'esm' : '', - `${helperName}.js`, - ); - - outputFile( - helperFilename, - buildHelper(runtimeName, pkgDirname, helperFilename, helperName, { - esm, - corejs, - }), - ); - } -} - -function getRuntimeRoot(runtimeName) { - return path.resolve( - __dirname, - '..', - '..', - runtimeName.replace(/^@babel\//, 'babel-'), - ); -} - -// eslint-disable-next-line max-params -function buildHelper( - runtimeName, - pkgDirname, - helperFilename, - helperName, - { esm, corejs }, -) { - const tree = t.program([], [], esm ? 'module' : 'script'); - const dependencies = {}; - let bindings = null; - - if (!esm) { - bindings = []; - helpers.ensure(helperName, babel.File); - for (const dep of helpers.getDependencies(helperName)) { - // eslint-disable-next-line no-multi-assign - const id = (dependencies[dep] = t.identifier(t.toIdentifier(dep))); - tree.body.push(template.statement.ast` - var ${id} = require("${`./${dep}`}"); - `); - bindings.push(id.name); - } - } - - const helper = helpers.get( - helperName, - (dep) => dependencies[dep], - esm ? null : template.expression.ast`module.exports`, - bindings, - ); - tree.body.push(...helper.nodes); - - return babel.transformFromAst(tree, null, { - filename: helperFilename, - presets: [ - [ - '@babel/preset-env', - { modules: false, exclude: ['@babel/plugin-transform-typeof-symbol'] }, - ], - ], - plugins: [ - [ - transformRuntime, - { corejs, useESModules: esm, version: runtimeVersion }, - ], - buildRuntimeRewritePlugin( - runtimeName, - path.relative(path.dirname(helperFilename), pkgDirname), - helperName, - ), - ], - overrides: [ - { - exclude: /typeof/, - plugins: ['@babel/plugin-transform-typeof-symbol'], - }, - ], - }).code; -} - -function buildRuntimeRewritePlugin(runtimeName, relativePath, helperName) { - function adjustImportPath(node, relativePath) { - node.value = helpers.list.includes(node.value) - ? `./${node.value}` - : node.value.replace(`${runtimeName}/`, `${relativePath}/`); - } - - return { - pre(file) { - const original = file.get('helperGenerator'); - file.set('helperGenerator', (name) => { - // Make sure that helpers won't insert circular references to themselves - if (name === helperName) return false; - - return original(name); - }); - }, - visitor: { - ImportDeclaration(path) { - adjustImportPath(path.get('source').node, relativePath); - }, - CallExpression(path) { - if ( - !path.get('callee').isIdentifier({ name: 'require' }) || - path.get('arguments').length !== 1 || - !path.get('arguments')[0].isStringLiteral() - ) { - return; - } - - // Replace any reference to @babel/runtime and other helpers - // with a relative path - adjustImportPath(path.get('arguments')[0].node, relativePath); - }, - }, - }; -} diff --git a/fixtures/cloudfour.com-patterns/.storybook/main.js b/fixtures/cloudfour.com-patterns/.storybook/main.js deleted file mode 100644 index 5da7996f..00000000 --- a/fixtures/cloudfour.com-patterns/.storybook/main.js +++ /dev/null @@ -1,60 +0,0 @@ -const { resolve } = require('path'); - -module.exports = { - // We load the welcome story separately so it will be the first sidebar item. - stories: ['../src/welcome.stories.mdx', '../src/**/*.stories.(js|mdx)'], - addons: [ - // Core addons - '@storybook/addon-a11y/register', - '@storybook/addon-docs', - '@storybook/addon-knobs/register', - '@storybook/addon-viewport/register', - { - name: '@storybook/preset-scss', - options: { - sassLoaderOptions: { - // Dart Sass performs much better than Node Sass - implementation: require('sass'), - sassOptions: { - // Import Theo design tokens as SCSS variables - importer: [require('./theo-importer')], - }, - }, - }, - }, - // Community addons - 'storybook-addon-themes', - ], - webpackFinal: async (config) => { - // Remove default SVG processing from default config. - // @see https://github.com/storybookjs/storybook/issues/5708#issuecomment-515384927 - config.module.rules = config.module.rules.map((data) => { - if (/svg\|/.test(String(data.test))) { - data.test = - /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|ttf|woff|woff2|cur|ani)(\?.*)?$/; - } - - return data; - }); - - // Push new rules - config.module.rules.push( - { - test: /\.twig$/, - use: 'twigjs-loader', - }, - { - // Import Theo design tokens as JS objects - test: /\.ya?ml$/, - use: resolve(__dirname, './theo-loader.js'), - }, - { - // Optimize and process SVGs as React elements for use in documentation - test: /\.svg$/, - use: '@svgr/webpack', - }, - ); - - return config; - }, -}; diff --git a/fixtures/cloudfour.com-patterns/gulpfile.js/tasks/svg-to-twig.js b/fixtures/cloudfour.com-patterns/gulpfile.js/tasks/svg-to-twig.js deleted file mode 100644 index f93df2de..00000000 --- a/fixtures/cloudfour.com-patterns/gulpfile.js/tasks/svg-to-twig.js +++ /dev/null @@ -1,114 +0,0 @@ -const { readFileSync } = require('node:fs'); -const path = require('node:path'); - -const { src, dest } = require('gulp'); -const rename = require('gulp-rename'); -const svgmin = require('gulp-svgmin'); -const yaml = require('js-yaml'); -const ltx = require('ltx'); -const { obj } = require('through2'); - -// Load SVGO preferences from config file to keep things DRY -const svgoPath = path.join(__dirname, '../../.svgo.yml'); -const svgoConfig = yaml.safeLoad(readFileSync(svgoPath, 'utf8')); - -// Properties to make configurable via Twig templates -const dynamicSvgProps = [ - 'aria-hidden', - 'aria-labelledby', - 'class', - 'focusable', - 'height', - 'id', - 'preserveAspectRatio', - 'role', - 'style', - 'viewBox', - 'width', -]; - -/** - * Accepts SVG source markup and templatizes root attributes while also adding - * layout blocks (`before`, `content` and `after`) to its contents. - * - * @param {string} src - The source SVG markup. - * @returns {string} - */ -function templatizeSvgString(src) { - const svg = ltx.parse(src); - - // Create blocks for SVG content, before and after - const prepend = ltx.parse( - '{% block before %}{% endblock %}{% block content %}', - ); - const append = ltx.parse( - '{% endblock %}{% block after %}{% endblock %}', - ); - svg.children = [...prepend.children, ...svg.children, ...append.children]; - - // Identify props already in use in the SVG versus those yet to be used - const usedProps = dynamicSvgProps.filter((prop) => Boolean(svg.attrs[prop])); - const unusedProps = dynamicSvgProps.filter((prop) => !svg.attrs[prop]); - - // Properties already in use should have their value set to a conditional. - // The `default` filter would be less code, but things get tricky when it - // comes to managing quotation marks in XML. - for (const prop of usedProps) { - const current = svg.attrs[prop]; - // Dashes have meaning in Twig expressions, so we replace them with - // underscores in property names. - const twigProp = prop.replace(/-/g, '_'); - svg.attrs[ - prop - ] = `{% if ${twigProp} %}{{${twigProp}}}{% else %}${current}{% endif %}`; - } - - // Grab the SVG source to this point - let result = svg.root().toString(); - - if (unusedProps.length > 0) { - // We build a big string of attribute name/value pairs for any properties - // yet to be used for this asset. - const unusedPropHtml = unusedProps - .map((prop) => { - const twigProp = prop.replace(/-/g, '_'); - return `{% if ${twigProp} %} ${prop}="{{${twigProp}}}"{% endif %}`; - }) - .join(''); - - // We tack this string onto the root SVG element, which we assume ends with - // the first occurrence of `>`. - result = result.replace('>', `${unusedPropHtml}>`); - } - - return result; -} - -/** - * Gulp task for converting SVG files to Twig templates. - */ -function svgToTwig() { - return ( - src('src/assets/**/*.svg') - // Optimize assets with SVGO - .pipe(svgmin(svgoConfig)) - // Pipe file contents through templatize function - .pipe( - obj((file, _, cb) => { - if (file.isBuffer()) { - const template = templatizeSvgString(file.contents.toString()); - file.contents = Buffer.from(template); - } - - cb(null, file); - }), - ) - // Append `.twig` to filenames - .pipe(rename({ extname: '.svg.twig' })) - // Output to same directory to expose to Storybook - .pipe(dest('src/assets')) - ); -} - -// Expose to Gulp -module.exports = svgToTwig; diff --git a/fixtures/cloudfour.com-patterns/gulpfile.js/theo-formats/stories.mdx.js b/fixtures/cloudfour.com-patterns/gulpfile.js/theo-formats/stories.mdx.js deleted file mode 100644 index 4cb29281..00000000 --- a/fixtures/cloudfour.com-patterns/gulpfile.js/theo-formats/stories.mdx.js +++ /dev/null @@ -1,121 +0,0 @@ -const { basename, extname } = require('node:path'); - -const groupBy = require('lodash/groupBy'); -const kebabCase = require('lodash/kebabCase'); -const startCase = require('lodash/startCase'); - -/** - * Return a string containing Storybook Docs MDX markup for a color. - * - * @param {object} prop - Theo property - * @returns {string} - */ -function mdxColor(prop) { - return ` -`.trim(); -} - -/** - * Return a string containing Storybook Docs MDX markup for multiple colors. - * - * @param {Array} props - Theo properties - * @returns {string} - */ -function mdxColors(props) { - const colors = props.map(mdxColor); - return ` - - ${colors.join('\n')} -`.trim(); -} - -/** - * Return a string containing Storybook Docs MDX markup for a single row of a - * property table. - * - * @param {object} prop - Theo property - * @returns {string} - */ -function mdxProp(prop) { - return ` - - $${kebabCase(prop.name)} - ${prop.value} - - `.trim(); -} - -/** - * Return a string containing Storybook Docs MDX markup for a property table. - * - * @param {Array} props - Theo properties - * @returns {string} - */ -function mdxProps(props) { - const rows = props.map(mdxProp); - return ` - - - - - - ${rows.join('\n')} -
NameValue
`.trim(); -} - -/** - * Return a string containing Storybook Docs MDX markup for a single category - * of Theo properties. - * - * @param {string} category - Category of Theo properties - * @param {Array} props - Theo properties - * @returns {string} - */ -function categoryToMdx(category, props) { - const categoryTitle = startCase(category); - const categoryBody = category.includes('color') - ? mdxColors(props) - : mdxProps(props); - - return ` -## ${categoryTitle} - -${categoryBody} -`.trim(); -} - -/** - * Theo format for Storybook Docs (`.stories.mdx`). - * - * @param {ImmutableMap} result - Map of Theo properties and meta. - * @returns {string} - */ -function mdxStoriesFormat(result) { - const file = result.getIn(['meta', 'file']); - const filename = basename(file); - const slug = basename(filename, extname(filename)); - const title = startCase(slug); - const props = result.get('props').toJS(); - const categories = groupBy(props, 'category'); - const mdxCategories = Object.keys(categories).map((category) => - categoryToMdx(category, categories[category]), - ); - return ` -import { Meta, ColorPalette, ColorItem } from '@storybook/addon-docs/blocks'; - - - -# ${title} - -\`\`\`scss -@use 'path/to/${filename}'; -$example: ${slug}.$${kebabCase(props[0].name)}; // => ${props[0].value} -\`\`\` - -${mdxCategories.join('\n\n')}`.trim(); -} - -module.exports = mdxStoriesFormat; diff --git a/fixtures/dom-testing-library/src/events.js b/fixtures/dom-testing-library/src/events.js deleted file mode 100644 index 3eab5bac..00000000 --- a/fixtures/dom-testing-library/src/events.js +++ /dev/null @@ -1,447 +0,0 @@ -import { getWindowFromNode } from './helpers'; -const eventMap = { - // Clipboard Events - copy: { - EventType: 'ClipboardEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - cut: { - EventType: 'ClipboardEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - paste: { - EventType: 'ClipboardEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - // Composition Events - compositionEnd: { - EventType: 'CompositionEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - compositionStart: { - EventType: 'CompositionEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - compositionUpdate: { - EventType: 'CompositionEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - // Keyboard Events - keyDown: { - EventType: 'KeyboardEvent', - defaultInit: { bubbles: true, cancelable: true, charCode: 0 }, - }, - keyPress: { - EventType: 'KeyboardEvent', - defaultInit: { bubbles: true, cancelable: true, charCode: 0 }, - }, - keyUp: { - EventType: 'KeyboardEvent', - defaultInit: { bubbles: true, cancelable: true, charCode: 0 }, - }, - // Focus Events - focus: { - EventType: 'FocusEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - blur: { - EventType: 'FocusEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - focusIn: { - EventType: 'FocusEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - focusOut: { - EventType: 'FocusEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - // Form Events - change: { - EventType: 'Event', - defaultInit: { bubbles: true, cancelable: false }, - }, - input: { - EventType: 'InputEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - invalid: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: true }, - }, - submit: { - EventType: 'Event', - defaultInit: { bubbles: true, cancelable: true }, - }, - reset: { - EventType: 'Event', - defaultInit: { bubbles: true, cancelable: true }, - }, - // Mouse Events - click: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true, button: 0 }, - }, - contextMenu: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - dblClick: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - drag: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - dragEnd: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - dragEnter: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - dragExit: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - dragLeave: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - dragOver: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - dragStart: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - drop: { - EventType: 'DragEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - mouseDown: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - mouseEnter: { - EventType: 'MouseEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - mouseLeave: { - EventType: 'MouseEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - mouseMove: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - mouseOut: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - mouseOver: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - mouseUp: { - EventType: 'MouseEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - // Selection Events - select: { - EventType: 'Event', - defaultInit: { bubbles: true, cancelable: false }, - }, - // Touch Events - touchCancel: { - EventType: 'TouchEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - touchEnd: { - EventType: 'TouchEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - touchMove: { - EventType: 'TouchEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - touchStart: { - EventType: 'TouchEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - // UI Events - scroll: { - EventType: 'UIEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - // Wheel Events - wheel: { - EventType: 'WheelEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - // Media Events - abort: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - canPlay: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - canPlayThrough: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - durationChange: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - emptied: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - encrypted: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - ended: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - loadedData: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - loadedMetadata: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - loadStart: { - EventType: 'ProgressEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - pause: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - play: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - playing: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - progress: { - EventType: 'ProgressEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - rateChange: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - seeked: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - seeking: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - stalled: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - suspend: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - timeUpdate: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - volumeChange: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - waiting: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - // Image Events - load: { - EventType: 'UIEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - error: { - EventType: 'Event', - defaultInit: { bubbles: false, cancelable: false }, - }, - // Animation Events - animationStart: { - EventType: 'AnimationEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - animationEnd: { - EventType: 'AnimationEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - animationIteration: { - EventType: 'AnimationEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - // Transition Events - transitionEnd: { - EventType: 'TransitionEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - // Pointer events - pointerOver: { - EventType: 'PointerEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - pointerEnter: { - EventType: 'PointerEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - pointerDown: { - EventType: 'PointerEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - pointerMove: { - EventType: 'PointerEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - pointerUp: { - EventType: 'PointerEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - pointerCancel: { - EventType: 'PointerEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, - pointerOut: { - EventType: 'PointerEvent', - defaultInit: { bubbles: true, cancelable: true }, - }, - pointerLeave: { - EventType: 'PointerEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - gotPointerCapture: { - EventType: 'PointerEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - lostPointerCapture: { - EventType: 'PointerEvent', - defaultInit: { bubbles: false, cancelable: false }, - }, - // History events - popState: { - EventType: 'PopStateEvent', - defaultInit: { bubbles: true, cancelable: false }, - }, -}; - -const eventAliasMap = { - doubleClick: 'dblClick', -}; - -function fireEvent(element, event) { - if (!event) { - throw new Error( - `Unable to fire an event - please provide an event object.`, - ); - } - - if (!element) { - throw new Error( - `Unable to fire a "${event.type}" event - please provide a DOM element.`, - ); - } - - return element.dispatchEvent(event); -} - -const createEvent = {}; - -for (const key of Object.keys(eventMap)) { - const { EventType, defaultInit } = eventMap[key]; - const eventName = key.toLowerCase(); - - createEvent[key] = (node, init) => { - if (!node) { - throw new Error( - `Unable to fire a "${key}" event - please provide a DOM element.`, - ); - } - - const eventInit = { ...defaultInit, ...init }; - const { target: { value, files, ...targetProperties } = {} } = eventInit; - if (value !== undefined) { - setNativeValue(node, value); - } - - if (files !== undefined) { - // Input.files is a read-only property so this is not allowed: - // input.files = [file] - // so we have to use this workaround to set the property - Object.defineProperty(node, 'files', { - configurable: true, - enumerable: true, - writable: true, - value: files, - }); - } - - Object.assign(node, targetProperties); - const window = getWindowFromNode(node); - const EventConstructor = window[EventType] || window.Event; - /* istanbul ignore else */ - if (typeof EventConstructor === 'function') { - return new EventConstructor(eventName, eventInit); - } - - // IE11 polyfill from https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill - const event = window.document.createEvent(EventType); - const { bubbles, cancelable, detail, ...otherInit } = eventInit; - event.initEvent(eventName, bubbles, cancelable, detail); - for (const eventKey of Object.keys(otherInit)) { - event[eventKey] = otherInit[eventKey]; - } - - return event; - }; - - fireEvent[key] = (node, init) => - fireEvent(node, createEvent[key](node, init)); -} - -// Function written after some investigation here: -// https://github.com/facebook/react/issues/10135#issuecomment-401496776 -function setNativeValue(element, value) { - const { set: valueSetter } = - Object.getOwnPropertyDescriptor(element, 'value') || {}; - const prototype = Object.getPrototypeOf(element); - const { set: prototypeValueSetter } = - Object.getOwnPropertyDescriptor(prototype, 'value') || {}; - if (prototypeValueSetter && valueSetter !== prototypeValueSetter) { - prototypeValueSetter.call(element, value); - } /* istanbul ignore next (I don't want to bother) */ else if (valueSetter) { - valueSetter.call(element, value); - } else { - throw new Error('The given element does not have a value setter'); - } -} - -for (const aliasKey of Object.keys(eventAliasMap)) { - const key = eventAliasMap[aliasKey]; - fireEvent[aliasKey] = (...args) => fireEvent[key](...args); -} - -export { fireEvent, createEvent }; - -/* eslint complexity:["error", 9] */ diff --git a/fixtures/dom-testing-library/src/queries/role.js b/fixtures/dom-testing-library/src/queries/role.js deleted file mode 100644 index 025da1a1..00000000 --- a/fixtures/dom-testing-library/src/queries/role.js +++ /dev/null @@ -1,154 +0,0 @@ -import { computeAccessibleName } from 'dom-accessibility-api'; - -import { - getImplicitAriaRoles, - isInaccessible, - isSubtreeInaccessible, - prettyRoles, -} from '../role-helpers'; - -import { - buildQueries, - fuzzyMatches, - getConfig, - makeNormalizer, - matches, -} from './all-utils'; - -function queryAllByRole( - container, - role, - { - exact = true, - collapseWhitespace, - hidden = getConfig().defaultHidden, - name, - trim, - normalizer, - queryFallbacks = false, - } = {}, -) { - const matcher = exact ? matches : fuzzyMatches; - const matchNormalizer = makeNormalizer({ - collapseWhitespace, - trim, - normalizer, - }); - - const subtreeIsInaccessibleCache = new WeakMap(); - function cachedIsSubtreeInaccessible(element) { - if (!subtreeIsInaccessibleCache.has(element)) { - subtreeIsInaccessibleCache.set(element, isSubtreeInaccessible(element)); - } - - return subtreeIsInaccessibleCache.get(element); - } - - return [...container.querySelectorAll('*')] - .filter((node) => { - const isRoleSpecifiedExplicitly = node.hasAttribute('role'); - - if (isRoleSpecifiedExplicitly) { - const roleValue = node.getAttribute('role'); - if (queryFallbacks) { - return roleValue - .split(' ') - .filter(Boolean) - .some((text) => matcher(text, node, role, matchNormalizer)); - } - - // If a custom normalizer is passed then let normalizer handle the role value - if (normalizer) { - return matcher(roleValue, node, role, matchNormalizer); - } - - // Other wise only send the first word to match - const [firstWord] = roleValue.split(' '); - return matcher(firstWord, node, role, matchNormalizer); - } - - const implicitRoles = getImplicitAriaRoles(node); - - return implicitRoles.some((implicitRole) => - matcher(implicitRole, node, role, matchNormalizer), - ); - }) - .filter((element) => - hidden === false - ? isInaccessible(element, { - isSubtreeInaccessible: cachedIsSubtreeInaccessible, - }) === false - : true, - ) - .filter((element) => { - if (name === undefined) { - // Don't care - return true; - } - - return matches( - computeAccessibleName(element), - element, - name, - (text) => text, - ); - }); -} - -const getMultipleError = (c, role) => - `Found multiple elements with the role "${role}"`; - -const getMissingError = ( - container, - role, - { hidden = getConfig().defaultHidden, name } = {}, -) => { - const roles = prettyRoles(container, { - hidden, - includeName: name !== undefined, - }); - let roleMessage; - - if (roles.length === 0) { - roleMessage = - hidden === false - ? 'There are no accessible roles. But there might be some inaccessible roles. ' + - 'If you wish to access them, then set the `hidden` option to `true`. ' + - 'Learn more about this here: https://testing-library.com/docs/dom-testing-library/api-queries#byrole' - : 'There are no available roles.'; - } else { - roleMessage = ` -Here are the ${hidden === false ? 'accessible' : 'available'} roles: - - ${roles.replace(/\n/g, '\n ').replace(/\n\s\s\n/g, '\n\n')} -`.trim(); - } - - let nameHint = ''; - if (name === undefined) { - nameHint = ''; - } else if (typeof name === 'string') { - nameHint = ` and name "${name}"`; - } else { - nameHint = ` and name \`${name}\``; - } - - return ` -Unable to find an ${ - hidden === false ? 'accessible ' : '' - }element with the role "${role}"${nameHint} - -${roleMessage}`.trim(); -}; - -const [queryByRole, getAllByRole, getByRole, findAllByRole, findByRole] = - buildQueries(queryAllByRole, getMultipleError, getMissingError); - -export { - queryByRole, - queryAllByRole, - getAllByRole, - getByRole, - findAllByRole, - findByRole, -}; diff --git a/fixtures/dom-testing-library/src/queries/text.js b/fixtures/dom-testing-library/src/queries/text.js deleted file mode 100644 index 1457da72..00000000 --- a/fixtures/dom-testing-library/src/queries/text.js +++ /dev/null @@ -1,52 +0,0 @@ -import { - buildQueries, - fuzzyMatches, - getNodeText, - makeNormalizer, - matches, -} from './all-utils'; - -function queryAllByText( - container, - text, - { - selector = '*', - exact = true, - collapseWhitespace, - trim, - ignore = 'script, style', - normalizer, - } = {}, -) { - const matcher = exact ? matches : fuzzyMatches; - const matchNormalizer = makeNormalizer({ - collapseWhitespace, - trim, - normalizer, - }); - let baseArray = []; - if (typeof container.matches === 'function' && container.matches(selector)) { - baseArray = [container]; - } - - return [...baseArray, ...container.querySelectorAll(selector)] - .filter((node) => !ignore || !node.matches(ignore)) - .filter((node) => matcher(getNodeText(node), node, text, matchNormalizer)); -} - -const getMultipleError = (c, text) => - `Found multiple elements with the text: ${text}`; -const getMissingError = (c, text) => - `Unable to find an element with the text: ${text}. This could be because the text is broken up by multiple elements. In this case, you can provide a function for your text matcher to make your matcher more flexible.`; - -const [queryByText, getAllByText, getByText, findAllByText, findByText] = - buildQueries(queryAllByText, getMultipleError, getMissingError); - -export { - queryByText, - queryAllByText, - getByText, - getAllByText, - findAllByText, - findByText, -}; diff --git a/fixtures/dom-testing-library/src/query-helpers.js b/fixtures/dom-testing-library/src/query-helpers.js deleted file mode 100644 index 45c5adf5..00000000 --- a/fixtures/dom-testing-library/src/query-helpers.js +++ /dev/null @@ -1,99 +0,0 @@ -import { getConfig } from './config'; -import { fuzzyMatches, makeNormalizer, matches } from './matches'; -import { waitFor } from './wait-for'; - -function getMultipleElementsFoundError(message, container) { - return getConfig().getElementError( - `${message}\n\n(If this is intentional, then use the \`*AllBy*\` variant of the query (like \`queryAllByText\`, \`getAllByText\`, or \`findAllByText\`)).`, - container, - ); -} - -function queryAllByAttribute( - attribute, - container, - text, - { exact = true, collapseWhitespace, trim, normalizer } = {}, -) { - const matcher = exact ? matches : fuzzyMatches; - const matchNormalizer = makeNormalizer({ - collapseWhitespace, - trim, - normalizer, - }); - return [...container.querySelectorAll(`[${attribute}]`)].filter((node) => - matcher(node.getAttribute(attribute), node, text, matchNormalizer), - ); -} - -function queryByAttribute(attribute, container, text, ...args) { - const els = queryAllByAttribute(attribute, container, text, ...args); - if (els.length > 1) { - throw getMultipleElementsFoundError( - `Found multiple elements by [${attribute}=${text}]`, - container, - ); - } - - return els[0] || null; -} - -// This accepts a query function and returns a function which throws an error -// if more than one elements is returned, otherwise it returns the first -// element or null -function makeSingleQuery(allQuery, getMultipleError) { - return (container, ...args) => { - const els = allQuery(container, ...args); - if (els.length > 1) { - throw getMultipleElementsFoundError( - getMultipleError(container, ...args), - container, - ); - } - - return els[0] || null; - }; -} - -// This accepts a query function and returns a function which throws an error -// if an empty list of elements is returned -function makeGetAllQuery(allQuery, getMissingError) { - return (container, ...args) => { - const els = allQuery(container, ...args); - if (els.length === 0) { - throw getConfig().getElementError( - getMissingError(container, ...args), - container, - ); - } - - return els; - }; -} - -// This accepts a getter query function and returns a function which calls -// waitFor and passing a function which invokes the getter. -function makeFindQuery(getter) { - return (container, text, options, waitForOptions) => - waitFor(() => getter(container, text, options), waitForOptions); -} - -function buildQueries(queryAllBy, getMultipleError, getMissingError) { - const queryBy = makeSingleQuery(queryAllBy, getMultipleError); - const getAllBy = makeGetAllQuery(queryAllBy, getMissingError); - const getBy = makeSingleQuery(getAllBy, getMultipleError); - const findAllBy = makeFindQuery(getAllBy); - const findBy = makeFindQuery(getBy); - - return [queryBy, getAllBy, getBy, findAllBy, findBy]; -} - -export { - getMultipleElementsFoundError, - queryAllByAttribute, - queryByAttribute, - makeSingleQuery, - makeGetAllQuery, - makeFindQuery, - buildQueries, -}; diff --git a/fixtures/dom-testing-library/src/wait-for-dom-change.js b/fixtures/dom-testing-library/src/wait-for-dom-change.js deleted file mode 100644 index 1c97c824..00000000 --- a/fixtures/dom-testing-library/src/wait-for-dom-change.js +++ /dev/null @@ -1,65 +0,0 @@ -import { getConfig } from './config'; -import { - clearTimeout, - getDocument, - getWindowFromNode, - runWithRealTimers, - setImmediate, - setTimeout, -} from './helpers'; - -let hasWarned = false; - -// Deprecated... TODO: remove this method. People should use wait instead -// the reasoning is that waiting for just any DOM change is an implementation -// detail. People should be waiting for a specific thing to change. -function waitForDomChange({ - container = getDocument(), - timeout = getConfig().asyncUtilTimeout, - mutationObserverOptions = { - subtree: true, - childList: true, - attributes: true, - characterData: true, - }, -} = {}) { - if (!hasWarned) { - hasWarned = true; - console.warn( - `\`waitForDomChange\` has been deprecated. Use \`waitFor\` instead: https://testing-library.com/docs/dom-testing-library/api-async#waitfor.`, - ); - } - - return new Promise((resolve, reject) => { - const timer = setTimeout(onTimeout, timeout); - const { MutationObserver } = getWindowFromNode(container); - const observer = new MutationObserver(onMutation); - runWithRealTimers(() => - observer.observe(container, mutationObserverOptions), - ); - - function onDone(error, result) { - clearTimeout(timer); - setImmediate(() => observer.disconnect()); - if (error) { - reject(error); - } else { - resolve(result); - } - } - - function onMutation(mutationsList) { - onDone(null, mutationsList); - } - - function onTimeout() { - onDone(new Error('Timed out in waitForDomChange.'), null); - } - }); -} - -function waitForDomChangeWrapper(...args) { - return getConfig().asyncWrapper(() => waitForDomChange(...args)); -} - -export { waitForDomChangeWrapper as waitForDomChange }; diff --git a/fixtures/downshift/src/hooks/useCombobox/reducer.js b/fixtures/downshift/src/hooks/useCombobox/reducer.js deleted file mode 100644 index 591f83b6..00000000 --- a/fixtures/downshift/src/hooks/useCombobox/reducer.js +++ /dev/null @@ -1,202 +0,0 @@ -import { getNextNonDisabledIndex, getNextWrappingIndex } from '../../utils'; -import { getDefaultValue, getHighlightedIndexOnOpen } from '../utils.js'; - -import * as stateChangeTypes from './stateChangeTypes'; - -/* eslint-disable complexity */ -export default function downshiftUseComboboxReducer(state, action) { - const { type, props, shiftKey } = action; - let changes; - - switch (type) { - case stateChangeTypes.ItemMouseMove: { - changes = { - highlightedIndex: action.index, - }; - break; - } - case stateChangeTypes.ItemClick: { - changes = { - isOpen: getDefaultValue(props, 'isOpen'), - highlightedIndex: getDefaultValue(props, 'highlightedIndex'), - selectedItem: props.items[action.index], - inputValue: props.itemToString(props.items[action.index]), - }; - break; - } - case stateChangeTypes.InputKeyDownArrowDown: { - changes = state.isOpen - ? { - highlightedIndex: getNextWrappingIndex( - shiftKey ? 5 : 1, - state.highlightedIndex, - props.items.length, - action.getItemNodeFromIndex, - props.circularNavigation, - ), - } - : { - highlightedIndex: getHighlightedIndexOnOpen( - props, - state, - 1, - action.getItemNodeFromIndex, - ), - isOpen: true, - }; - - break; - } - case stateChangeTypes.InputKeyDownArrowUp: { - changes = state.isOpen - ? { - highlightedIndex: getNextWrappingIndex( - shiftKey ? -5 : -1, - state.highlightedIndex, - props.items.length, - action.getItemNodeFromIndex, - props.circularNavigation, - ), - } - : { - highlightedIndex: getHighlightedIndexOnOpen( - props, - state, - -1, - action.getItemNodeFromIndex, - ), - isOpen: true, - }; - - break; - } - case stateChangeTypes.InputKeyDownEnter: { - changes = { - ...(state.highlightedIndex >= 0 && { - selectedItem: props.items[state.highlightedIndex], - isOpen: getDefaultValue(props, 'isOpen'), - highlightedIndex: getDefaultValue(props, 'highlightedIndex'), - inputValue: props.itemToString(props.items[state.highlightedIndex]), - }), - }; - break; - } - case stateChangeTypes.InputKeyDownEscape: { - changes = { - isOpen: false, - selectedItem: null, - highlightedIndex: -1, - inputValue: '', - }; - break; - } - case stateChangeTypes.InputKeyDownHome: { - changes = { - highlightedIndex: getNextNonDisabledIndex( - 1, - 0, - props.items.length, - action.getItemNodeFromIndex, - false, - ), - }; - break; - } - case stateChangeTypes.InputKeyDownEnd: { - changes = { - highlightedIndex: getNextNonDisabledIndex( - -1, - props.items.length - 1, - props.items.length, - action.getItemNodeFromIndex, - false, - ), - }; - break; - } - case stateChangeTypes.InputBlur: { - changes = { - isOpen: false, - ...(state.highlightedIndex >= 0 && { - selectedItem: props.items[state.highlightedIndex], - inputValue: props.itemToString(props.items[state.highlightedIndex]), - highlightedIndex: -1, - }), - }; - break; - } - case stateChangeTypes.InputChange: { - changes = { - isOpen: true, - highlightedIndex: getDefaultValue(props, 'highlightedIndex'), - inputValue: action.inputValue, - }; - break; - } - case stateChangeTypes.MenuMouseLeave: { - changes = { - highlightedIndex: -1, - }; - break; - } - case stateChangeTypes.ToggleButtonClick: - case stateChangeTypes.FunctionToggleMenu: { - changes = { - isOpen: !state.isOpen, - highlightedIndex: state.isOpen - ? -1 - : getHighlightedIndexOnOpen(props, state, 0), - }; - break; - } - case stateChangeTypes.FunctionOpenMenu: { - changes = { - isOpen: true, - highlightedIndex: getHighlightedIndexOnOpen(props, state, 0), - }; - break; - } - case stateChangeTypes.FunctionCloseMenu: { - changes = { - isOpen: false, - }; - break; - } - case stateChangeTypes.FunctionSetHighlightedIndex: { - changes = { - highlightedIndex: action.highlightedIndex, - }; - break; - } - case stateChangeTypes.FunctionSelectItem: { - changes = { - selectedItem: action.selectedItem, - }; - break; - } - case stateChangeTypes.FunctionSetInputValue: { - changes = { - inputValue: action.inputValue, - }; - break; - } - case stateChangeTypes.FunctionReset: { - changes = { - highlightedIndex: getDefaultValue(props, 'highlightedIndex'), - isOpen: getDefaultValue(props, 'isOpen'), - selectedItem: getDefaultValue(props, 'selectedItem'), - inputValue: getDefaultValue(props, 'inputValue'), - }; - break; - } - default: { - throw new Error('Reducer called without proper action type.'); - } - } - - return { - ...state, - ...changes, - }; -} -/* eslint-enable complexity */ diff --git a/fixtures/downshift/src/hooks/useCombobox/utils.js b/fixtures/downshift/src/hooks/useCombobox/utils.js deleted file mode 100644 index a9dd040a..00000000 --- a/fixtures/downshift/src/hooks/useCombobox/utils.js +++ /dev/null @@ -1,87 +0,0 @@ -import PropTypes from 'prop-types'; - -import { generateId, getA11yStatusMessage } from '../../utils'; -import { - defaultProps as defaultPropsCommon, - getElementIds as getElementIdsCommon, - getInitialState as getInitialStateCommon, -} from '../utils.js'; - -function getElementIds({ id, inputId, ...rest }) { - const uniqueId = id === undefined ? `downshift-${generateId()}` : id; - - return { - inputId: inputId || `${uniqueId}-input`, - ...getElementIdsCommon({ id, ...rest }), - }; -} - -function getInitialState(props) { - const initialState = getInitialStateCommon(props); - const { selectedItem } = initialState; - let { inputValue } = initialState; - - if ( - inputValue === '' && - selectedItem && - props.defaultInputValue === undefined && - props.initialInputValue === undefined && - props.inputValue === undefined - ) { - inputValue = props.itemToString(selectedItem); - } - - return { - ...initialState, - inputValue, - }; -} - -const propTypes = { - items: PropTypes.array.isRequired, - itemToString: PropTypes.func, - getA11yStatusMessage: PropTypes.func, - getA11ySelectionMessage: PropTypes.func, - circularNavigation: PropTypes.bool, - highlightedIndex: PropTypes.number, - defaultHighlightedIndex: PropTypes.number, - initialHighlightedIndex: PropTypes.number, - isOpen: PropTypes.bool, - defaultIsOpen: PropTypes.bool, - initialIsOpen: PropTypes.bool, - selectedItem: PropTypes.any, - initialSelectedItem: PropTypes.any, - defaultSelectedItem: PropTypes.any, - inputValue: PropTypes.string, - defaultInputValue: PropTypes.string, - initialInputValue: PropTypes.string, - id: PropTypes.string, - labelId: PropTypes.string, - menuId: PropTypes.string, - getItemId: PropTypes.func, - inputId: PropTypes.string, - toggleButtonId: PropTypes.string, - stateReducer: PropTypes.func, - onSelectedItemChange: PropTypes.func, - onHighlightedIndexChange: PropTypes.func, - onStateChange: PropTypes.func, - onIsOpenChange: PropTypes.func, - onInputValueChange: PropTypes.func, - environment: PropTypes.shape({ - addEventListener: PropTypes.func, - removeEventListener: PropTypes.func, - document: PropTypes.shape({ - getElementById: PropTypes.func, - activeElement: PropTypes.any, - body: PropTypes.any, - }), - }), -}; - -const defaultProps = { - ...defaultPropsCommon, - getA11yStatusMessage, - circularNavigation: true, -}; - -export { getInitialState, propTypes, defaultProps, getElementIds }; diff --git a/fixtures/downshift/src/hooks/useSelect/reducer.js b/fixtures/downshift/src/hooks/useSelect/reducer.js deleted file mode 100644 index d7cb9c85..00000000 --- a/fixtures/downshift/src/hooks/useSelect/reducer.js +++ /dev/null @@ -1,253 +0,0 @@ -import { getNextNonDisabledIndex, getNextWrappingIndex } from '../../utils'; -import { getDefaultValue, getHighlightedIndexOnOpen } from '../utils.js'; - -import * as stateChangeTypes from './stateChangeTypes'; -import { getItemIndexByCharacterKey } from './utils.js'; - -/* eslint-disable complexity */ -export default function downshiftSelectReducer(state, action) { - const { type, props, shiftKey } = action; - let changes; - - switch (type) { - case stateChangeTypes.ItemMouseMove: { - changes = { - highlightedIndex: action.index, - }; - - break; - } - case stateChangeTypes.ItemClick: { - changes = { - isOpen: getDefaultValue(props, 'isOpen'), - highlightedIndex: getDefaultValue(props, 'highlightedIndex'), - selectedItem: props.items[action.index], - }; - - break; - } - case stateChangeTypes.ToggleButtonKeyDownCharacter: { - { - const lowercasedKey = action.key; - const inputValue = `${state.inputValue}${lowercasedKey}`; - const itemIndex = getItemIndexByCharacterKey( - inputValue, - state.selectedItem ? props.items.indexOf(state.selectedItem) : -1, - props.items, - props.itemToString, - action.getItemNodeFromIndex, - ); - - changes = { - inputValue, - ...(itemIndex >= 0 && { - selectedItem: props.items[itemIndex], - }), - }; - } - - break; - } - case stateChangeTypes.ToggleButtonKeyDownArrowDown: { - changes = { - highlightedIndex: getHighlightedIndexOnOpen( - props, - state, - 1, - action.getItemNodeFromIndex, - ), - isOpen: true, - }; - - break; - } - case stateChangeTypes.ToggleButtonKeyDownArrowUp: { - changes = { - highlightedIndex: getHighlightedIndexOnOpen( - props, - state, - -1, - action.getItemNodeFromIndex, - ), - isOpen: true, - }; - - break; - } - case stateChangeTypes.MenuKeyDownEnter: - case stateChangeTypes.MenuKeyDownSpaceButton: { - changes = { - isOpen: getDefaultValue(props, 'isOpen'), - highlightedIndex: getDefaultValue(props, 'highlightedIndex'), - ...(state.highlightedIndex >= 0 && { - selectedItem: props.items[state.highlightedIndex], - }), - }; - - break; - } - case stateChangeTypes.MenuKeyDownHome: { - changes = { - highlightedIndex: getNextNonDisabledIndex( - 1, - 0, - props.items.length, - action.getItemNodeFromIndex, - false, - ), - }; - - break; - } - case stateChangeTypes.MenuKeyDownEnd: { - changes = { - highlightedIndex: getNextNonDisabledIndex( - -1, - props.items.length - 1, - props.items.length, - action.getItemNodeFromIndex, - false, - ), - }; - - break; - } - case stateChangeTypes.MenuKeyDownEscape: { - changes = { - isOpen: false, - highlightedIndex: -1, - }; - - break; - } - case stateChangeTypes.MenuBlur: { - changes = { - isOpen: false, - highlightedIndex: -1, - }; - - break; - } - case stateChangeTypes.MenuKeyDownCharacter: { - { - const lowercasedKey = action.key; - const inputValue = `${state.inputValue}${lowercasedKey}`; - const highlightedIndex = getItemIndexByCharacterKey( - inputValue, - state.highlightedIndex, - props.items, - props.itemToString, - action.getItemNodeFromIndex, - ); - - changes = { - inputValue, - ...(highlightedIndex >= 0 && { - highlightedIndex, - }), - }; - } - - break; - } - case stateChangeTypes.MenuKeyDownArrowDown: { - changes = { - highlightedIndex: getNextWrappingIndex( - shiftKey ? 5 : 1, - state.highlightedIndex, - props.items.length, - action.getItemNodeFromIndex, - props.circularNavigation, - ), - }; - - break; - } - case stateChangeTypes.MenuKeyDownArrowUp: { - changes = { - highlightedIndex: getNextWrappingIndex( - shiftKey ? -5 : -1, - state.highlightedIndex, - props.items.length, - action.getItemNodeFromIndex, - props.circularNavigation, - ), - }; - - break; - } - case stateChangeTypes.MenuMouseLeave: { - changes = { - highlightedIndex: -1, - }; - - break; - } - case stateChangeTypes.ToggleButtonClick: - case stateChangeTypes.FunctionToggleMenu: { - changes = { - isOpen: !state.isOpen, - highlightedIndex: state.isOpen - ? -1 - : getHighlightedIndexOnOpen(props, state, 0), - }; - - break; - } - case stateChangeTypes.FunctionOpenMenu: { - changes = { - isOpen: true, - highlightedIndex: getHighlightedIndexOnOpen(props, state, 0), - }; - - break; - } - case stateChangeTypes.FunctionCloseMenu: { - changes = { - isOpen: false, - }; - - break; - } - case stateChangeTypes.FunctionSetHighlightedIndex: { - changes = { - highlightedIndex: action.highlightedIndex, - }; - - break; - } - case stateChangeTypes.FunctionSelectItem: { - changes = { - selectedItem: action.selectedItem, - }; - - break; - } - case stateChangeTypes.FunctionSetInputValue: { - changes = { - inputValue: action.inputValue, - }; - - break; - } - case stateChangeTypes.FunctionReset: { - changes = { - highlightedIndex: getDefaultValue(props, 'highlightedIndex'), - isOpen: getDefaultValue(props, 'isOpen'), - selectedItem: getDefaultValue(props, 'selectedItem'), - inputValue: getDefaultValue(props, 'inputValue'), - }; - - break; - } - default: { - throw new Error('Reducer called without proper action type.'); - } - } - - return { - ...state, - ...changes, - }; -} -/* eslint-enable complexity */ diff --git a/fixtures/downshift/src/hooks/useSelect/utils.js b/fixtures/downshift/src/hooks/useSelect/utils.js deleted file mode 100644 index 007f45d4..00000000 --- a/fixtures/downshift/src/hooks/useSelect/utils.js +++ /dev/null @@ -1,114 +0,0 @@ -import PropTypes from 'prop-types'; - -import { defaultProps as commonDefaultProps } from '../utils.js'; - -// eslint-disable-next-line max-params -function getItemIndexByCharacterKey( - keysSoFar, - highlightedIndex, - items, - itemToStringParam, - getItemNodeFromIndex, -) { - const lowerCasedItemStrings = items.map((item) => - itemToStringParam(item).toLowerCase(), - ); - const lowerCasedKeysSoFar = keysSoFar.toLowerCase(); - const isValid = (itemString, index) => { - const element = getItemNodeFromIndex(index); - - return ( - itemString.startsWith(lowerCasedKeysSoFar) && - !(element && element.hasAttribute('disabled')) - ); - }; - - for ( - let index = highlightedIndex + 1; - index < lowerCasedItemStrings.length; - index++ - ) { - const itemString = lowerCasedItemStrings[index]; - - if (isValid(itemString, index)) { - return index; - } - } - - for (let index = 0; index < highlightedIndex; index++) { - const itemString = lowerCasedItemStrings[index]; - - if (isValid(itemString, index)) { - return index; - } - } - - return highlightedIndex; -} - -const propTypes = { - items: PropTypes.array.isRequired, - itemToString: PropTypes.func, - getA11yStatusMessage: PropTypes.func, - getA11ySelectionMessage: PropTypes.func, - circularNavigation: PropTypes.bool, - highlightedIndex: PropTypes.number, - defaultHighlightedIndex: PropTypes.number, - initialHighlightedIndex: PropTypes.number, - isOpen: PropTypes.bool, - defaultIsOpen: PropTypes.bool, - initialIsOpen: PropTypes.bool, - selectedItem: PropTypes.any, - initialSelectedItem: PropTypes.any, - defaultSelectedItem: PropTypes.any, - id: PropTypes.string, - labelId: PropTypes.string, - menuId: PropTypes.string, - getItemId: PropTypes.func, - toggleButtonId: PropTypes.string, - stateReducer: PropTypes.func, - onSelectedItemChange: PropTypes.func, - onHighlightedIndexChange: PropTypes.func, - onStateChange: PropTypes.func, - onIsOpenChange: PropTypes.func, - environment: PropTypes.shape({ - addEventListener: PropTypes.func, - removeEventListener: PropTypes.func, - document: PropTypes.shape({ - getElementById: PropTypes.func, - activeElement: PropTypes.any, - body: PropTypes.any, - }), - }), -}; - -/** - * Default implementation for status message. Only added when menu is open. - * Will specift if there are results in the list, and if so, how many, - * and what keys are relevant. - * - * @param {object} param the downshift state and other relevant properties - * @param {boolean} param.isOpen - * @param {number} param.resultCount - * @returns {string} the a11y status message - */ -function getA11yStatusMessage({ isOpen, resultCount }) { - if (!isOpen) { - return ''; - } - - if (!resultCount) { - return 'No results are available.'; - } - - return `${resultCount} result${ - resultCount === 1 ? ' is' : 's are' - } available, use up and down arrow keys to navigate. Press Enter or Space Bar keys to select.`; -} - -const defaultProps = { - ...commonDefaultProps, - getA11yStatusMessage, -}; - -export { propTypes, getItemIndexByCharacterKey, defaultProps }; diff --git a/fixtures/downshift/src/hooks/utils.js b/fixtures/downshift/src/hooks/utils.js deleted file mode 100644 index 4d13fd96..00000000 --- a/fixtures/downshift/src/hooks/utils.js +++ /dev/null @@ -1,238 +0,0 @@ -import PropTypes from 'prop-types'; -import { useCallback, useReducer } from 'react'; - -import { - generateId, - getNextWrappingIndex, - getState, - scrollIntoView, -} from '../utils'; - -const defaultStateValues = { - highlightedIndex: -1, - isOpen: false, - selectedItem: null, - inputValue: '', -}; - -function getElementIds({ id, labelId, menuId, getItemId, toggleButtonId }) { - const uniqueId = id === undefined ? `downshift-${generateId()}` : id; - - return { - labelId: labelId || `${uniqueId}-label`, - menuId: menuId || `${uniqueId}-menu`, - getItemId: getItemId || ((index) => `${uniqueId}-item-${index}`), - toggleButtonId: toggleButtonId || `${uniqueId}-toggle-button`, - }; -} - -function getItemIndex(index, item, items) { - if (index !== undefined) { - return index; - } - - if (items.length === 0) { - return -1; - } - - return items.indexOf(item); -} - -function itemToString(item) { - return item ? String(item) : ''; -} - -function getPropTypesValidator(caller, propTypes) { - // istanbul ignore next - return function validate(options = {}) { - for (const key of Object.keys(propTypes)) { - PropTypes.checkPropTypes(propTypes, options, key, caller.name); - } - }; -} - -function isAcceptedCharacterKey(key) { - return /^\S$/.test(key); -} - -function capitalizeString(string) { - return `${string.slice(0, 1).toUpperCase()}${string.slice(1)}`; -} - -function invokeOnChangeHandler(key, props, state, newState) { - const handler = `on${capitalizeString(key)}Change`; - if ( - props[handler] && - newState[key] !== undefined && - newState[key] !== state[key] - ) { - props[handler](newState); - } -} - -function callOnChangeProps(action, state, newState) { - const { props, type } = action; - const changes = {}; - - for (const key of Object.keys(state)) { - invokeOnChangeHandler(key, props, state, newState); - - if (newState[key] !== state[key]) { - changes[key] = newState[key]; - } - } - - if (props.onStateChange && Object.keys(changes).length > 0) { - props.onStateChange({ type, ...changes }); - } -} - -function useEnhancedReducer(reducer, initialState, props) { - const enhancedReducer = useCallback( - (state, action) => { - state = getState(state, action.props); - - const { stateReducer: stateReduceLocal } = action.props; - const changes = reducer(state, action); - const newState = stateReduceLocal(state, { ...action, changes }); - - callOnChangeProps(action, state, newState); - - return newState; - }, - [reducer], - ); - - const [state, dispatch] = useReducer(enhancedReducer, initialState); - const dispatchWithProps = (action) => dispatch({ props, ...action }); - - return [getState(state, props), dispatchWithProps]; -} - -/** - * Default state reducer that returns the changes. - * - * @param {object} s state. - * @param {object} a action with changes. - * @returns {object} changes. - */ -function stateReducer(s, a) { - return a.changes; -} - -/** - * Returns a message to be added to aria-live region when item is selected. - * - * @param {object} selectionParameters Parameters required to build the message. - * @returns {string} The a11y message. - */ -function getA11ySelectionMessage(selectionParameters) { - const { selectedItem, itemToString: itemToStringLocal } = selectionParameters; - - return `${itemToStringLocal(selectedItem)} has been selected.`; -} - -const defaultProps = { - itemToString, - stateReducer, - getA11ySelectionMessage, - scrollIntoView, - circularNavigation: false, - environment: - typeof window === 'undefined' /* istanbul ignore next (ssr) */ - ? {} - : window, -}; - -function getDefaultValue(props, propKey) { - const defaultPropKey = `default${capitalizeString(propKey)}`; - - if (defaultPropKey in props) { - return props[defaultPropKey]; - } - - return defaultStateValues[propKey]; -} - -function getInitialValue(props, propKey) { - if (propKey in props) { - return props[propKey]; - } - - const initialPropKey = `initial${capitalizeString(propKey)}`; - - if (initialPropKey in props) { - return props[initialPropKey]; - } - - return getDefaultValue(props, propKey); -} - -function getInitialState(props) { - const selectedItem = getInitialValue(props, 'selectedItem'); - const isOpen = getInitialValue(props, 'isOpen'); - const highlightedIndex = getInitialValue(props, 'highlightedIndex'); - const inputValue = getInitialValue(props, 'inputValue'); - - return { - highlightedIndex: - highlightedIndex < 0 && selectedItem - ? props.items.indexOf(selectedItem) - : highlightedIndex, - isOpen, - selectedItem, - inputValue, - }; -} - -function getHighlightedIndexOnOpen(props, state, offset, getItemNodeFromIndex) { - const { items, initialHighlightedIndex, defaultHighlightedIndex } = props; - const { selectedItem, highlightedIndex } = state; - - // InitialHighlightedIndex will give value to highlightedIndex on initial state only. - if ( - initialHighlightedIndex !== undefined && - highlightedIndex === initialHighlightedIndex - ) { - return initialHighlightedIndex; - } - - if (defaultHighlightedIndex !== undefined) { - return defaultHighlightedIndex; - } - - if (selectedItem) { - if (offset === 0) { - return items.indexOf(selectedItem); - } - - return getNextWrappingIndex( - offset, - items.indexOf(selectedItem), - items.length, - getItemNodeFromIndex, - false, - ); - } - - if (offset === 0) { - return -1; - } - - return offset < 0 ? items.length - 1 : 0; -} - -export { - getElementIds, - getItemIndex, - getPropTypesValidator, - isAcceptedCharacterKey, - useEnhancedReducer, - capitalizeString, - defaultProps, - getDefaultValue, - getInitialValue, - getHighlightedIndexOnOpen, - defaultStateValues, - getInitialState, -}; diff --git a/fixtures/eslint/lib/cli-engine/cascading-config-array-factory.js b/fixtures/eslint/lib/cli-engine/cascading-config-array-factory.js deleted file mode 100644 index 66f79d9e..00000000 --- a/fixtures/eslint/lib/cli-engine/cascading-config-array-factory.js +++ /dev/null @@ -1,482 +0,0 @@ -/** - * @file `CascadingConfigArrayFactory` class. - * - * `CascadingConfigArrayFactory` class has a responsibility: - * - * 1. Handles cascading of config files. - * - * It provides two methods: - * - * - `getConfigArrayForFile(filePath)` - * Get the corresponded configuration of a given file. This method doesn't - * throw even if the given file didn't exist. - * - `clearCache()` - * Clear the internal cache. You have to call this method when - * `additionalPluginPool` was updated if `baseConfig` or `cliConfig` depends - * on the additional plugins. (`CLIEngine#addPlugin()` method calls this.) - * @author Toru Nagashima - */ -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const os = require('node:os'); -const path = require('node:path'); - -const debug = require('debug')('eslint:cascading-config-array-factory'); - -const { validateConfigArray } = require('../shared/config-validator'); -const { emitDeprecationWarning } = require('../shared/deprecation-warnings'); - -const { - ConfigArray, - ConfigDependency, - IgnorePattern, -} = require('./config-array'); -const { ConfigArrayFactory } = require('./config-array-factory'); -const loadRules = require('./load-rules'); - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -// Define types for VSCode IntelliSense. -/** @typedef {import("../shared/types").ConfigData} ConfigData */ -/** @typedef {import("../shared/types").Parser} Parser */ -/** @typedef {import("../shared/types").Plugin} Plugin */ -/** @typedef {ReturnType} ConfigArray */ - -/** - * @typedef {object} CascadingConfigArrayFactoryOptions - * @property {Map} [additionalPluginPool] The map for additional plugins. - * @property {ConfigData} [baseConfig] The config by `baseConfig` option. - * @property {ConfigData} [cliConfig] The config by CLI options (`--env`, `--global`, `--ignore-pattern`, `--parser`, `--parser-options`, `--plugin`, and `--rule`). CLI options overwrite the setting in config files. - * @property {string} [cwd] The base directory to start lookup. - * @property {string} [ignorePath] The path to the alternative file of `.eslintignore`. - * @property {string[]} [rulePaths] The value of `--rulesdir` option. - * @property {string} [specificConfigPath] The value of `--config` option. - * @property {boolean} [useEslintrc] if `false` then it doesn't load config files. - */ - -/** - * @typedef {object} CascadingConfigArrayFactoryInternalSlots - * @property {ConfigArray} baseConfigArray The config array of `baseConfig` option. - * @property {ConfigData} baseConfigData The config data of `baseConfig` option. This is used to reset `baseConfigArray`. - * @property {ConfigArray} cliConfigArray The config array of CLI options. - * @property {ConfigData} cliConfigData The config data of CLI options. This is used to reset `cliConfigArray`. - * @property {ConfigArrayFactory} configArrayFactory The factory for config arrays. - * @property {Map} configCache The cache from directory paths to config arrays. - * @property {string} cwd The base directory to start lookup. - * @property {WeakMap} finalizeCache The cache from config arrays to finalized config arrays. - * @property {string} [ignorePath] The path to the alternative file of `.eslintignore`. - * @property {string[]|null} rulePaths The value of `--rulesdir` option. This is used to reset `baseConfigArray`. - * @property {string|null} specificConfigPath The value of `--config` option. This is used to reset `cliConfigArray`. - * @property {boolean} useEslintrc if `false` then it doesn't load config files. - */ - -/** @type {WeakMap} */ -const internalSlotsMap = new WeakMap(); - -/** - * Create the config array from `baseConfig` and `rulePaths`. - * - * @param {CascadingConfigArrayFactoryInternalSlots} slots The slots. - * @returns {ConfigArray} The config array of the base configs. - */ -function createBaseConfigArray({ - configArrayFactory, - baseConfigData, - rulePaths, - cwd, -}) { - const baseConfigArray = configArrayFactory.create(baseConfigData, { - name: 'BaseConfig', - }); - - /* - * Create the config array element for the default ignore patterns. - * This element has `ignorePattern` property that ignores the default - * patterns in the current working directory. - */ - baseConfigArray.unshift( - configArrayFactory.create( - { ignorePatterns: IgnorePattern.DefaultPatterns }, - { name: 'DefaultIgnorePattern' }, - )[0], - ); - - /* - * Load rules `--rulesdir` option as a pseudo plugin. - * Use a pseudo plugin to define rules of `--rulesdir`, so we can validate - * the rule's options with only information in the config array. - */ - if (rulePaths && rulePaths.length > 0) { - baseConfigArray.push({ - type: 'config', - name: '--rulesdir', - filePath: '', - plugins: { - '': new ConfigDependency({ - definition: { - // eslint-disable-next-line @cloudfour/unicorn/prefer-object-from-entries - rules: rulePaths.reduce( - (map, rulesPath) => Object.assign(map, loadRules(rulesPath, cwd)), - {}, - ), - }, - filePath: '', - id: '', - importerName: '--rulesdir', - importerPath: '', - }), - }, - }); - } - - return baseConfigArray; -} - -/** - * Create the config array from CLI options. - * - * @param {CascadingConfigArrayFactoryInternalSlots} slots The slots. - * @returns {ConfigArray} The config array of the base configs. - */ -function createCLIConfigArray({ - cliConfigData, - configArrayFactory, - cwd, - ignorePath, - specificConfigPath, -}) { - const cliConfigArray = configArrayFactory.create(cliConfigData, { - name: 'CLIOptions', - }); - - cliConfigArray.unshift( - ...(ignorePath - ? configArrayFactory.loadESLintIgnore(ignorePath) - : configArrayFactory.loadDefaultESLintIgnore()), - ); - - if (specificConfigPath) { - cliConfigArray.unshift( - ...configArrayFactory.loadFile(specificConfigPath, { - name: '--config', - basePath: cwd, - }), - ); - } - - return cliConfigArray; -} - -/** - * The error type when there are files matched by a glob, but all of them have been ignored. - */ -class ConfigurationNotFoundError extends Error { - /** - * @param {string} directoryPath The directory path. - */ - constructor(directoryPath) { - super(`No ESLint configuration found in ${directoryPath}.`); - this.messageTemplate = 'no-config-found'; - this.messageData = { directoryPath }; - } -} - -/** - * This class provides the functionality that enumerates every file which is - * matched by given glob patterns and that configuration. - */ -class CascadingConfigArrayFactory { - /** - * Initialize this enumerator. - * - * @param {CascadingConfigArrayFactoryOptions} options The options. - */ - constructor({ - additionalPluginPool = new Map(), - baseConfig: baseConfigData = null, - cliConfig: cliConfigData = null, - cwd = process.cwd(), - ignorePath, - resolvePluginsRelativeTo = cwd, - rulePaths = [], - specificConfigPath = null, - useEslintrc = true, - } = {}) { - const configArrayFactory = new ConfigArrayFactory({ - additionalPluginPool, - cwd, - resolvePluginsRelativeTo, - }); - - internalSlotsMap.set(this, { - baseConfigArray: createBaseConfigArray({ - baseConfigData, - configArrayFactory, - cwd, - rulePaths, - }), - baseConfigData, - cliConfigArray: createCLIConfigArray({ - cliConfigData, - configArrayFactory, - cwd, - ignorePath, - specificConfigPath, - }), - cliConfigData, - configArrayFactory, - configCache: new Map(), - cwd, - finalizeCache: new WeakMap(), - ignorePath, - rulePaths, - specificConfigPath, - useEslintrc, - }); - } - - /** - * The path to the current working directory. - * This is used by tests. - * - * @type {string} - */ - get cwd() { - const { cwd } = internalSlotsMap.get(this); - - return cwd; - } - - /** - * Get the config array of a given file. - * If `filePath` was not given, it returns the config which contains only - * `baseConfigData` and `cliConfigData`. - * - * @param {string} [filePath] The file path to a file. - * @param {object} [options] The options. - * @param {boolean} [options.ignoreNotFoundError] If `true` then it doesn't throw `ConfigurationNotFoundError`. - * @returns {ConfigArray} The config array of the file. - */ - getConfigArrayForFile(filePath, { ignoreNotFoundError = false } = {}) { - const { baseConfigArray, cliConfigArray, cwd } = internalSlotsMap.get(this); - - if (!filePath) { - return new ConfigArray(...baseConfigArray, ...cliConfigArray); - } - - const directoryPath = path.dirname(path.resolve(cwd, filePath)); - - debug(`Load config files for ${directoryPath}.`); - - return this._finalizeConfigArray( - this._loadConfigInAncestors(directoryPath), - directoryPath, - ignoreNotFoundError, - ); - } - - /** - * Clear config cache. - * - * @returns {void} - */ - clearCache() { - const slots = internalSlotsMap.get(this); - - slots.baseConfigArray = createBaseConfigArray(slots); - slots.cliConfigArray = createCLIConfigArray(slots); - slots.configCache.clear(); - } - - /** - * Load and normalize config files from the ancestor directories. - * - * @param {string} directoryPath The path to a leaf directory. - * @param {boolean} configsExistInSubdirs `true` if configurations exist in subdirectories. - * @returns {ConfigArray} The loaded config. - * @private - */ - _loadConfigInAncestors(directoryPath, configsExistInSubdirs = false) { - const { - baseConfigArray, - configArrayFactory, - configCache, - cwd, - useEslintrc, - } = internalSlotsMap.get(this); - - if (!useEslintrc) { - return baseConfigArray; - } - - let configArray = configCache.get(directoryPath); - - // Hit cache. - if (configArray) { - debug(`Cache hit: ${directoryPath}.`); - return configArray; - } - - debug(`No cache found: ${directoryPath}.`); - - const homePath = os.homedir(); - - // Consider this is root. - if (directoryPath === homePath && cwd !== homePath) { - debug('Stop traversing because of considered root.'); - if (configsExistInSubdirs) { - const filePath = - ConfigArrayFactory.getPathToConfigFileInDirectory(directoryPath); - - if (filePath) { - emitDeprecationWarning(filePath, 'ESLINT_PERSONAL_CONFIG_SUPPRESS'); - } - } - - return this._cacheConfig(directoryPath, baseConfigArray); - } - - // Load the config on this directory. - try { - configArray = configArrayFactory.loadInDirectory(directoryPath); - } catch (error) { - /* istanbul ignore next */ - if (error.code === 'EACCES') { - debug("Stop traversing because of 'EACCES' error."); - return this._cacheConfig(directoryPath, baseConfigArray); - } - - throw error; - } - - if (configArray.length > 0 && configArray.isRoot()) { - debug("Stop traversing because of 'root:true'."); - configArray.unshift(...baseConfigArray); - return this._cacheConfig(directoryPath, configArray); - } - - // Load from the ancestors and merge it. - const parentPath = path.dirname(directoryPath); - const parentConfigArray = - parentPath && parentPath !== directoryPath - ? this._loadConfigInAncestors( - parentPath, - configsExistInSubdirs || configArray.length > 0, - ) - : baseConfigArray; - - if (configArray.length > 0) { - configArray.unshift(...parentConfigArray); - } else { - configArray = parentConfigArray; - } - - // Cache and return. - return this._cacheConfig(directoryPath, configArray); - } - - /** - * Freeze and cache a given config. - * - * @param {string} directoryPath The path to a directory as a cache key. - * @param {ConfigArray} configArray The config array as a cache value. - * @returns {ConfigArray} The `configArray` (frozen). - */ - _cacheConfig(directoryPath, configArray) { - const { configCache } = internalSlotsMap.get(this); - - Object.freeze(configArray); - configCache.set(directoryPath, configArray); - - return configArray; - } - - /** - * Finalize a given config array. - * Concatenate `--config` and other CLI options. - * - * @param {ConfigArray} configArray The parent config array. - * @param {string} directoryPath The path to the leaf directory to find config files. - * @param {boolean} ignoreNotFoundError If `true` then it doesn't throw `ConfigurationNotFoundError`. - * @returns {ConfigArray} The loaded config. - * @private - */ - _finalizeConfigArray(configArray, directoryPath, ignoreNotFoundError) { - const { cliConfigArray, configArrayFactory, finalizeCache, useEslintrc } = - internalSlotsMap.get(this); - - let finalConfigArray = finalizeCache.get(configArray); - - if (!finalConfigArray) { - finalConfigArray = configArray; - - // Load the personal config if there are no regular config files. - if ( - useEslintrc && - configArray.every((c) => !c.filePath) && - cliConfigArray.every((c) => !c.filePath) // `--config` option can be a file. - ) { - const homePath = os.homedir(); - - debug('Loading the config file of the home directory:', homePath); - - const personalConfigArray = configArrayFactory.loadInDirectory( - homePath, - { name: 'PersonalConfig' }, - ); - - if ( - personalConfigArray.length > 0 && - !directoryPath.startsWith(homePath) - ) { - const lastElement = - personalConfigArray[personalConfigArray.length - 1]; - - emitDeprecationWarning( - lastElement.filePath, - 'ESLINT_PERSONAL_CONFIG_LOAD', - ); - } - - finalConfigArray = [...finalConfigArray, ...personalConfigArray]; - } - - // Apply CLI options. - if (cliConfigArray.length > 0) { - finalConfigArray = [finalConfigArray, ...cliConfigArray]; - } - - // Validate rule settings and environments. - validateConfigArray(finalConfigArray); - - // Cache it. - Object.freeze(finalConfigArray); - finalizeCache.set(configArray, finalConfigArray); - - debug( - 'Configuration was determined: %o on %s', - finalConfigArray, - directoryPath, - ); - } - - // At least one element (the default ignore patterns) exists. - if (!ignoreNotFoundError && useEslintrc && finalConfigArray.length <= 1) { - throw new ConfigurationNotFoundError(directoryPath); - } - - return finalConfigArray; - } -} - -// ------------------------------------------------------------------------------ -// Public Interface -// ------------------------------------------------------------------------------ - -module.exports = { CascadingConfigArrayFactory }; diff --git a/fixtures/eslint/lib/cli-engine/config-array-factory.js b/fixtures/eslint/lib/cli-engine/config-array-factory.js deleted file mode 100644 index 0c3d0046..00000000 --- a/fixtures/eslint/lib/cli-engine/config-array-factory.js +++ /dev/null @@ -1,1096 +0,0 @@ -/** - * @file The factory of `ConfigArray` objects. - * - * This class provides methods to create `ConfigArray` instance. - * - * - `create(configData, options)` - * Create a `ConfigArray` instance from a config data. This is to handle CLI - * options except `--config`. - * - `loadFile(filePath, options)` - * Create a `ConfigArray` instance from a config file. This is to handle - * `--config` option. If the file was not found, throws the following error: - * - If the filename was `*.js`, a `MODULE_NOT_FOUND` error. - * - If the filename was `package.json`, an IO error or an - * `ESLINT_CONFIG_FIELD_NOT_FOUND` error. - * - Otherwise, an IO error such as `ENOENT`. - * - `loadInDirectory(directoryPath, options)` - * Create a `ConfigArray` instance from a config file which is on a given - * directory. This tries to load `.eslintrc.*` or `package.json`. If not - * found, returns an empty `ConfigArray`. - * - `loadESLintIgnore(filePath)` - * Create a `ConfigArray` instance from a config file that is `.eslintignore` - * format. This is to handle `--ignore-path` option. - * - `loadDefaultESLintIgnore()` - * Create a `ConfigArray` instance from `.eslintignore` or `package.json` in - * the current working directory. - * - * `ConfigArrayFactory` class has the responsibility that loads configuration - * files, including loading `extends`, `parser`, and `plugins`. The created - * `ConfigArray` instance has the loaded `extends`, `parser`, and `plugins`. - * - * But this class doesn't handle cascading. `CascadingConfigArrayFactory` class - * handles cascading and hierarchy. - * @author Toru Nagashima - */ -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const fs = require('node:fs'); -const path = require('node:path'); - -const debug = require('debug')('eslint:config-array-factory'); -const importFresh = require('import-fresh'); -const stripComments = require('strip-json-comments'); - -const { validateConfigSchema } = require('../shared/config-validator'); -const naming = require('../shared/naming'); -const ModuleResolver = require('../shared/relative-module-resolver'); - -const { - ConfigArray, - ConfigDependency, - IgnorePattern, - OverrideTester, -} = require('./config-array'); - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -const eslintRecommendedPath = path.resolve( - __dirname, - '../../conf/eslint-recommended.js', -); -const eslintAllPath = path.resolve(__dirname, '../../conf/eslint-all.js'); -const configFilenames = [ - '.eslintrc.js', - '.eslintrc.cjs', - '.eslintrc.yaml', - '.eslintrc.yml', - '.eslintrc.json', - '.eslintrc', - 'package.json', -]; - -// Define types for VSCode IntelliSense. -/** @typedef {import("../shared/types").ConfigData} ConfigData */ -/** @typedef {import("../shared/types").OverrideConfigData} OverrideConfigData */ -/** @typedef {import("../shared/types").Parser} Parser */ -/** @typedef {import("../shared/types").Plugin} Plugin */ -/** @typedef {import("./config-array/config-dependency").DependentParser} DependentParser */ -/** @typedef {import("./config-array/config-dependency").DependentPlugin} DependentPlugin */ -/** @typedef {ConfigArray[0]} ConfigArrayElement */ - -/** - * @typedef {object} ConfigArrayFactoryOptions - * @property {Map} [additionalPluginPool] The map for additional plugins. - * @property {string} [cwd] The path to the current working directory. - * @property {string} [resolvePluginsRelativeTo] A path to the directory that plugins should be resolved from. Defaults to `cwd`. - */ - -/** - * @typedef {object} ConfigArrayFactoryInternalSlots - * @property {Map} additionalPluginPool The map for additional plugins. - * @property {string} cwd The path to the current working directory. - * @property {string} resolvePluginsRelativeTo An absolute path the the directory that plugins should be resolved from. - */ - -/** - * @typedef {object} ConfigArrayFactoryLoadingContext - * @property {string} filePath The path to the current configuration. - * @property {string} matchBasePath The base path to resolve relative paths in `overrides[].files`, `overrides[].excludedFiles`, and `ignorePatterns`. - * @property {string} name The name of the current configuration. - * @property {"config" | "ignore" | "implicit-processor"} type The type of the current configuration. This is `"config"` in normal. This is `"ignore"` if it came from `.eslintignore`. This is `"implicit-processor"` if it came from legacy file-extension processors. - */ - -/** @type {WeakMap} */ -const internalSlotsMap = new WeakMap(); - -/** - * Check if a given string is a file path. - * - * @param {string} nameOrPath A module name or file path. - * @returns {boolean} `true` if the `nameOrPath` is a file path. - */ -function isFilePath(nameOrPath) { - return /^\.{1,2}[/\\]/u.test(nameOrPath) || path.isAbsolute(nameOrPath); -} - -/** - * Convenience wrapper for synchronously reading file contents. - * - * @param {string} filePath The filename to read. - * @returns {string} The file contents, with the BOM removed. - * @private - */ -function readFile(filePath) { - return fs.readFileSync(filePath, 'utf8').replace(/^\uFEFF/u, ''); -} - -/** - * Loads a YAML configuration from a file. - * - * @param {string} filePath The filename to load. - * @returns {ConfigData} The configuration object from the file. - * @throws {Error} If the file cannot be read. - * @private - */ -function loadYAMLConfigFile(filePath) { - debug(`Loading YAML config file: ${filePath}`); - - // Lazy load YAML to improve performance when not used - const yaml = require('js-yaml'); - - try { - // Empty YAML file can be null, so always use - return yaml.safeLoad(readFile(filePath)) || {}; - } catch (error) { - debug(`Error reading YAML file: ${filePath}`); - error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`; - throw error; - } -} - -/** - * Loads a JSON configuration from a file. - * - * @param {string} filePath The filename to load. - * @returns {ConfigData} The configuration object from the file. - * @throws {Error} If the file cannot be read. - * @private - */ -function loadJSONConfigFile(filePath) { - debug(`Loading JSON config file: ${filePath}`); - - try { - return JSON.parse(stripComments(readFile(filePath))); - } catch (error) { - debug(`Error reading JSON file: ${filePath}`); - error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`; - error.messageTemplate = 'failed-to-read-json'; - error.messageData = { - path: filePath, - message: error.message, - }; - throw error; - } -} - -/** - * Loads a legacy (.eslintrc) configuration from a file. - * - * @param {string} filePath The filename to load. - * @returns {ConfigData} The configuration object from the file. - * @throws {Error} If the file cannot be read. - * @private - */ -function loadLegacyConfigFile(filePath) { - debug(`Loading legacy config file: ${filePath}`); - - // Lazy load YAML to improve performance when not used - const yaml = require('js-yaml'); - - try { - return ( - yaml.safeLoad(stripComments(readFile(filePath))) || - /* istanbul ignore next */ {} - ); - } catch (error) { - debug('Error reading YAML file: %s\n%o', filePath, error); - error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`; - throw error; - } -} - -/** - * Loads a JavaScript configuration from a file. - * - * @param {string} filePath The filename to load. - * @returns {ConfigData} The configuration object from the file. - * @throws {Error} If the file cannot be read. - * @private - */ -function loadJSConfigFile(filePath) { - debug(`Loading JS config file: ${filePath}`); - try { - return importFresh(filePath); - } catch (error) { - debug(`Error reading JavaScript file: ${filePath}`); - error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`; - throw error; - } -} - -/** - * Loads a configuration from a package.json file. - * - * @param {string} filePath The filename to load. - * @returns {ConfigData} The configuration object from the file. - * @throws {Error} If the file cannot be read. - * @private - */ -function loadPackageJSONConfigFile(filePath) { - debug(`Loading package.json config file: ${filePath}`); - try { - const packageData = loadJSONConfigFile(filePath); - - if (!Object.hasOwnProperty.call(packageData, 'eslintConfig')) { - throw Object.assign( - new Error("package.json file doesn't have 'eslintConfig' field."), - { code: 'ESLINT_CONFIG_FIELD_NOT_FOUND' }, - ); - } - - return packageData.eslintConfig; - } catch (error) { - debug(`Error reading package.json file: ${filePath}`); - error.message = `Cannot read config file: ${filePath}\nError: ${error.message}`; - throw error; - } -} - -/** - * Loads a `.eslintignore` from a file. - * - * @param {string} filePath The filename to load. - * @returns {string[]} The ignore patterns from the file. - * @private - */ -function loadESLintIgnoreFile(filePath) { - debug(`Loading .eslintignore file: ${filePath}`); - - try { - return readFile(filePath) - .split(/\r?\n/gu) - .filter((line) => line.trim() !== '' && !line.startsWith('#')); - } catch (error) { - debug(`Error reading .eslintignore file: ${filePath}`); - error.message = `Cannot read .eslintignore file: ${filePath}\nError: ${error.message}`; - throw error; - } -} - -/** - * Creates an error to notify about a missing config to extend from. - * - * @param {string} configName The name of the missing config. - * @param {string} importerName The name of the config that imported the missing config - * @returns {Error} The error object to throw - * @private - */ -function configMissingError(configName, importerName) { - return Object.assign( - new Error(`Failed to load config "${configName}" to extend from.`), - { - messageTemplate: 'extend-config-missing', - messageData: { configName, importerName }, - }, - ); -} - -/** - * Loads a configuration file regardless of the source. Inspects the file path - * to determine the correctly way to load the config file. - * - * @param {string} filePath The path to the configuration. - * @returns {ConfigData|null} The configuration information. - * @private - */ -function loadConfigFile(filePath) { - switch (path.extname(filePath)) { - case '.js': - case '.cjs': { - return loadJSConfigFile(filePath); - } - - case '.json': { - if (path.basename(filePath) === 'package.json') { - return loadPackageJSONConfigFile(filePath); - } - - return loadJSONConfigFile(filePath); - } - - case '.yaml': - case '.yml': { - return loadYAMLConfigFile(filePath); - } - - default: { - return loadLegacyConfigFile(filePath); - } - } -} - -/** - * Write debug log. - * - * @param {string} request The requested module name. - * @param {string} relativeTo The file path to resolve the request relative to. - * @param {string} filePath The resolved file path. - * @returns {void} - */ -function writeDebugLogForLoading(request, relativeTo, filePath) { - /* istanbul ignore next */ - if (!debug.enabled) return; - let nameAndVersion = null; - - try { - const packageJsonPath = ModuleResolver.resolve( - `${request}/package.json`, - relativeTo, - ); - const { version = 'unknown' } = require(packageJsonPath); - - nameAndVersion = `${request}@${version}`; - } catch (error) { - debug('package.json was not found:', error.message); - nameAndVersion = request; - } - - debug('Loaded: %s (%s)', nameAndVersion, filePath); -} - -/** - * Create a new context with default values. - * - * @param {string | undefined} cwd The current working directory. - * @param {"config" | "ignore" | "implicit-processor" | undefined} providedType The type of the current configuration. Default is `"config"`. - * @param {string | undefined} providedName The name of the current configuration. Default is the relative path from `cwd` to `filePath`. - * @param {string | undefined} providedFilePath The path to the current configuration. Default is empty string. - * @param {string | undefined} providedMatchBasePath The type of the current configuration. Default is the directory of `filePath` or `cwd`. - * @returns {ConfigArrayFactoryLoadingContext} The created context. - */ -// eslint-disable-next-line max-params -function createContext( - cwd, - providedType, - providedName, - providedFilePath, - providedMatchBasePath, -) { - const filePath = providedFilePath ? path.resolve(cwd, providedFilePath) : ''; - const matchBasePath = - providedMatchBasePath || (filePath && path.dirname(filePath)) || cwd; - const name = providedName || (filePath && path.relative(cwd, filePath)) || ''; - const type = providedType || 'config'; - - return { filePath, matchBasePath, name, type }; -} - -/** - * Normalize a given plugin. - * - Ensure the object to have four properties: configs, environments, processors, and rules. - * - Ensure the object to not have other properties. - * - * @param {Plugin} plugin The plugin to normalize. - * @returns {Plugin} The normalized plugin. - */ -function normalizePlugin(plugin) { - return { - configs: plugin.configs || {}, - environments: plugin.environments || {}, - processors: plugin.processors || {}, - rules: plugin.rules || {}, - }; -} - -// ------------------------------------------------------------------------------ -// Public Interface -// ------------------------------------------------------------------------------ - -/** - * The factory of `ConfigArray` objects. - */ -class ConfigArrayFactory { - /** - * Initialize this instance. - * - * @param {ConfigArrayFactoryOptions} [options] The map for additional plugins. - */ - constructor({ - additionalPluginPool = new Map(), - cwd = process.cwd(), - resolvePluginsRelativeTo = cwd, - } = {}) { - internalSlotsMap.set(this, { - additionalPluginPool, - cwd, - resolvePluginsRelativeTo: path.resolve(cwd, resolvePluginsRelativeTo), - }); - } - - /** - * Create `ConfigArray` instance from a config data. - * - * @param {ConfigData|null} configData The config data to create. - * @param {object} [options] The options. - * @param {string} [options.basePath] The base path to resolve relative paths in `overrides[].files`, `overrides[].excludedFiles`, and `ignorePatterns`. - * @param {string} [options.filePath] The path to this config data. - * @param {string} [options.name] The config name. - * @returns {ConfigArray} Loaded config. - */ - create(configData, { basePath, filePath, name } = {}) { - if (!configData) { - return new ConfigArray(); - } - - const { cwd } = internalSlotsMap.get(this); - const ctx = createContext(cwd, 'config', name, filePath, basePath); - const elements = this._normalizeConfigData(configData, ctx); - - return new ConfigArray(...elements); - } - - /** - * Load a config file. - * - * @param {string} filePath The path to a config file. - * @param {object} [options] The options. - * @param {string} [options.basePath] The base path to resolve relative paths in `overrides[].files`, `overrides[].excludedFiles`, and `ignorePatterns`. - * @param {string} [options.name] The config name. - * @returns {ConfigArray} Loaded config. - */ - loadFile(filePath, { basePath, name } = {}) { - const { cwd } = internalSlotsMap.get(this); - const ctx = createContext(cwd, 'config', name, filePath, basePath); - - return new ConfigArray(...this._loadConfigData(ctx)); - } - - /** - * Load the config file on a given directory if exists. - * - * @param {string} directoryPath The path to a directory. - * @param {object} [options] The options. - * @param {string} [options.basePath] The base path to resolve relative paths in `overrides[].files`, `overrides[].excludedFiles`, and `ignorePatterns`. - * @param {string} [options.name] The config name. - * @returns {ConfigArray} Loaded config. An empty `ConfigArray` if any config doesn't exist. - */ - loadInDirectory(directoryPath, { basePath, name } = {}) { - const { cwd } = internalSlotsMap.get(this); - - for (const filename of configFilenames) { - const ctx = createContext( - cwd, - 'config', - name, - path.join(directoryPath, filename), - basePath, - ); - - if (fs.existsSync(ctx.filePath)) { - let configData; - - try { - configData = loadConfigFile(ctx.filePath); - } catch (error) { - if (!error || error.code !== 'ESLINT_CONFIG_FIELD_NOT_FOUND') { - throw error; - } - } - - if (configData) { - debug(`Config file found: ${ctx.filePath}`); - return new ConfigArray(...this._normalizeConfigData(configData, ctx)); - } - } - } - - debug(`Config file not found on ${directoryPath}`); - return new ConfigArray(); - } - - /** - * Check if a config file on a given directory exists or not. - * - * @param {string} directoryPath The path to a directory. - * @returns {string | null} The path to the found config file. If not found then null. - */ - static getPathToConfigFileInDirectory(directoryPath) { - for (const filename of configFilenames) { - const filePath = path.join(directoryPath, filename); - - if (fs.existsSync(filePath)) { - if (filename === 'package.json') { - try { - loadPackageJSONConfigFile(filePath); - return filePath; - } catch { - /* ignore */ - } - } else { - return filePath; - } - } - } - - return null; - } - - /** - * Load `.eslintignore` file. - * - * @param {string} filePath The path to a `.eslintignore` file to load. - * @returns {ConfigArray} Loaded config. An empty `ConfigArray` if any config doesn't exist. - */ - loadESLintIgnore(filePath) { - const { cwd } = internalSlotsMap.get(this); - const absolutePath = path.resolve(cwd, filePath); - const ignorePatterns = loadESLintIgnoreFile(absolutePath); - const ctx = createContext(cwd, 'ignore', undefined, absolutePath, cwd); - - return new ConfigArray( - ...this._normalizeESLintIgnoreData(ignorePatterns, ctx), - ); - } - - /** - * Load `.eslintignore` file in the current working directory. - * - * @returns {ConfigArray} Loaded config. An empty `ConfigArray` if any config doesn't exist. - */ - loadDefaultESLintIgnore() { - const { cwd } = internalSlotsMap.get(this); - const eslintIgnorePath = path.resolve(cwd, '.eslintignore'); - const packageJsonPath = path.resolve(cwd, 'package.json'); - - if (fs.existsSync(eslintIgnorePath)) { - return this.loadESLintIgnore(eslintIgnorePath); - } - - if (fs.existsSync(packageJsonPath)) { - const data = loadJSONConfigFile(packageJsonPath); - - if (Object.hasOwnProperty.call(data, 'eslintIgnore')) { - if (!Array.isArray(data.eslintIgnore)) { - throw new TypeError( - 'Package.json eslintIgnore property requires an array of paths', - ); - } - - const ctx = createContext( - cwd, - 'ignore', - 'eslintIgnore in package.json', - packageJsonPath, - cwd, - ); - - return new ConfigArray( - ...this._normalizeESLintIgnoreData(data.eslintIgnore, ctx), - ); - } - } - - return new ConfigArray(); - } - - /** - * Load a given config file. - * - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {IterableIterator} Loaded config. - * @private - */ - _loadConfigData(ctx) { - return this._normalizeConfigData(loadConfigFile(ctx.filePath), ctx); - } - - /** - * Normalize a given `.eslintignore` data to config array elements. - * - * @param {string[]} ignorePatterns The patterns to ignore files. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @yields {ConfigArrayElement} The normalized config. - * @private - */ - *_normalizeESLintIgnoreData(ignorePatterns, ctx) { - const elements = this._normalizeObjectConfigData({ ignorePatterns }, ctx); - - // Set `ignorePattern.loose` flag for backward compatibility. - for (const element of elements) { - if (element.ignorePattern) { - element.ignorePattern.loose = true; - } - - yield element; - } - } - - /** - * Normalize a given config to an array. - * - * @param {ConfigData} configData The config data to normalize. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {IterableIterator} The normalized config. - * @private - */ - _normalizeConfigData(configData, ctx) { - validateConfigSchema(configData, ctx.name || ctx.filePath); - return this._normalizeObjectConfigData(configData, ctx); - } - - /** - * Normalize a given config to an array. - * - * @param {ConfigData|OverrideConfigData} configData The config data to normalize. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @yields {ConfigArrayElement} The normalized config. - * @private - */ - *_normalizeObjectConfigData(configData, ctx) { - const { files, excludedFiles, ...configBody } = configData; - const criteria = OverrideTester.create( - files, - excludedFiles, - ctx.matchBasePath, - ); - const elements = this._normalizeObjectConfigDataBody(configBody, ctx); - - // Apply the criteria to every element. - for (const element of elements) { - /* - * Merge the criteria. - * This is for the `overrides` entries that came from the - * configurations of `overrides[].extends`. - */ - element.criteria = OverrideTester.and(criteria, element.criteria); - - /* - * Remove `root` property to ignore `root` settings which came from - * `extends` in `overrides`. - */ - if (element.criteria) { - element.root = undefined; - } - - yield element; - } - } - - /** - * Normalize a given config to an array. - * - * @param {ConfigData} configData The config data to normalize. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @yields {ConfigArrayElement} The normalized config. - * @private - */ - *_normalizeObjectConfigDataBody( - { - env, - extends: extend, - globals, - ignorePatterns, - noInlineConfig, - parser: parserName, - parserOptions, - plugins: pluginList, - processor, - reportUnusedDisableDirectives, - root, - rules, - settings, - overrides: overrideList = [], - }, - ctx, - ) { - const extendList = Array.isArray(extend) ? extend : [extend]; - const ignorePattern = - ignorePatterns && - new IgnorePattern( - Array.isArray(ignorePatterns) ? ignorePatterns : [ignorePatterns], - ctx.matchBasePath, - ); - - // Flatten `extends`. - for (const extendName of extendList.filter(Boolean)) { - yield* this._loadExtends(extendName, ctx); - } - - // Load parser & plugins. - const parser = parserName && this._loadParser(parserName, ctx); - const plugins = pluginList && this._loadPlugins(pluginList, ctx); - - // Yield pseudo config data for file extension processors. - if (plugins) { - yield* this._takeFileExtensionProcessors(plugins, ctx); - } - - // Yield the config data except `extends` and `overrides`. - yield { - // Debug information. - type: ctx.type, - name: ctx.name, - filePath: ctx.filePath, - - // Config data. - criteria: null, - env, - globals, - ignorePattern, - noInlineConfig, - parser, - parserOptions, - plugins, - processor, - reportUnusedDisableDirectives, - root, - rules, - settings, - }; - - // Flatten `overries`. - for (const [i, element] of overrideList.entries()) { - yield* this._normalizeObjectConfigData(element, { - ...ctx, - name: `${ctx.name}#overrides[${i}]`, - }); - } - } - - /** - * Load configs of an element in `extends`. - * - * @param {string} extendName The name of a base config. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {IterableIterator} The normalized config. - * @private - */ - _loadExtends(extendName, ctx) { - debug('Loading {extends:%j} relative to %s', extendName, ctx.filePath); - try { - if (extendName.startsWith('eslint:')) { - return this._loadExtendedBuiltInConfig(extendName, ctx); - } - - if (extendName.startsWith('plugin:')) { - return this._loadExtendedPluginConfig(extendName, ctx); - } - - return this._loadExtendedShareableConfig(extendName, ctx); - } catch (error) { - error.message += `\nReferenced from: ${ctx.filePath || ctx.name}`; - throw error; - } - } - - /** - * Load configs of an element in `extends`. - * - * @param {string} extendName The name of a base config. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {IterableIterator} The normalized config. - * @private - */ - _loadExtendedBuiltInConfig(extendName, ctx) { - if (extendName === 'eslint:recommended') { - return this._loadConfigData({ - ...ctx, - filePath: eslintRecommendedPath, - name: `${ctx.name} » ${extendName}`, - }); - } - - if (extendName === 'eslint:all') { - return this._loadConfigData({ - ...ctx, - filePath: eslintAllPath, - name: `${ctx.name} » ${extendName}`, - }); - } - - throw configMissingError(extendName, ctx.name); - } - - /** - * Load configs of an element in `extends`. - * - * @param {string} extendName The name of a base config. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {IterableIterator} The normalized config. - * @private - */ - _loadExtendedPluginConfig(extendName, ctx) { - const slashIndex = extendName.lastIndexOf('/'); - const pluginName = extendName.slice('plugin:'.length, slashIndex); - const configName = extendName.slice(slashIndex + 1); - - if (isFilePath(pluginName)) { - throw new Error("'extends' cannot use a file path for plugins."); - } - - const plugin = this._loadPlugin(pluginName, ctx); - const configData = - plugin.definition && plugin.definition.configs[configName]; - - if (configData) { - return this._normalizeConfigData(configData, { - ...ctx, - filePath: plugin.filePath, - name: `${ctx.name} » plugin:${plugin.id}/${configName}`, - }); - } - - throw plugin.error || configMissingError(extendName, ctx.filePath); - } - - /** - * Load configs of an element in `extends`. - * - * @param {string} extendName The name of a base config. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {IterableIterator} The normalized config. - * @private - */ - _loadExtendedShareableConfig(extendName, ctx) { - const { cwd } = internalSlotsMap.get(this); - const relativeTo = ctx.filePath || path.join(cwd, '__placeholder__.js'); - let request; - - if (isFilePath(extendName)) { - request = extendName; - } else if (extendName.startsWith('.')) { - request = `./${extendName}`; // For backward compatibility. A ton of tests depended on this behavior. - } else { - request = naming.normalizePackageName(extendName, 'eslint-config'); - } - - let filePath; - - try { - filePath = ModuleResolver.resolve(request, relativeTo); - } catch (error) { - /* istanbul ignore else */ - if (error && error.code === 'MODULE_NOT_FOUND') { - throw configMissingError(extendName, ctx.filePath); - } - - throw error; - } - - writeDebugLogForLoading(request, relativeTo, filePath); - return this._loadConfigData({ - ...ctx, - filePath, - name: `${ctx.name} » ${request}`, - }); - } - - /** - * Load given plugins. - * - * @param {string[]} names The plugin names to load. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {Record} The loaded parser. - * @private - */ - _loadPlugins(names, ctx) { - return Object.fromEntries( - names.map((name) => { - if (isFilePath(name)) - throw new Error('Plugins array cannot includes file paths.'); - - const plugin = this._loadPlugin(name, ctx); - return [plugin.id, plugin]; - }), - ); - } - - /** - * Load a given parser. - * - * @param {string} nameOrPath The package name or the path to a parser file. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {DependentParser} The loaded parser. - */ - _loadParser(nameOrPath, ctx) { - debug('Loading parser %j from %s', nameOrPath, ctx.filePath); - - const { cwd } = internalSlotsMap.get(this); - const relativeTo = ctx.filePath || path.join(cwd, '__placeholder__.js'); - - try { - const filePath = ModuleResolver.resolve(nameOrPath, relativeTo); - - writeDebugLogForLoading(nameOrPath, relativeTo, filePath); - - return new ConfigDependency({ - definition: require(filePath), - filePath, - id: nameOrPath, - importerName: ctx.name, - importerPath: ctx.filePath, - }); - } catch (error) { - // If the parser name is "espree", load the espree of ESLint. - if (nameOrPath === 'espree') { - debug('Fallback espree.'); - return new ConfigDependency({ - definition: require('espree'), - filePath: require.resolve('espree'), - id: nameOrPath, - importerName: ctx.name, - importerPath: ctx.filePath, - }); - } - - debug( - "Failed to load parser '%s' declared in '%s'.", - nameOrPath, - ctx.name, - ); - error.message = `Failed to load parser '${nameOrPath}' declared in '${ctx.name}': ${error.message}`; - - return new ConfigDependency({ - error, - id: nameOrPath, - importerName: ctx.name, - importerPath: ctx.filePath, - }); - } - } - - /** - * Load a given plugin. - * - * @param {string} name The plugin name to load. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @returns {DependentPlugin} The loaded plugin. - * @private - */ - _loadPlugin(name, ctx) { - debug('Loading plugin %j from %s', name, ctx.filePath); - - const { additionalPluginPool, resolvePluginsRelativeTo } = - internalSlotsMap.get(this); - const request = naming.normalizePackageName(name, 'eslint-plugin'); - const id = naming.getShorthandName(request, 'eslint-plugin'); - const relativeTo = path.join( - resolvePluginsRelativeTo, - '__placeholder__.js', - ); - - if (/\s+/u.test(name)) { - const error = Object.assign( - new Error(`Whitespace found in plugin name '${name}'`), - { - messageTemplate: 'whitespace-found', - messageData: { pluginName: request }, - }, - ); - - return new ConfigDependency({ - error, - id, - importerName: ctx.name, - importerPath: ctx.filePath, - }); - } - - // Check for additional pool. - const plugin = - additionalPluginPool.get(request) || additionalPluginPool.get(id); - - if (plugin) { - return new ConfigDependency({ - definition: normalizePlugin(plugin), - filePath: ctx.filePath, - id, - importerName: ctx.name, - importerPath: ctx.filePath, - }); - } - - let filePath; - let error; - - try { - filePath = ModuleResolver.resolve(request, relativeTo); - } catch (error_) { - error = error_; - /* istanbul ignore else */ - if (error && error.code === 'MODULE_NOT_FOUND') { - error.messageTemplate = 'plugin-missing'; - error.messageData = { - pluginName: request, - resolvePluginsRelativeTo, - importerName: ctx.name, - }; - } - } - - if (filePath) { - try { - writeDebugLogForLoading(request, relativeTo, filePath); - - const startTime = Date.now(); - const pluginDefinition = require(filePath); - - debug(`Plugin ${filePath} loaded in: ${Date.now() - startTime}ms`); - - return new ConfigDependency({ - definition: normalizePlugin(pluginDefinition), - filePath, - id, - importerName: ctx.name, - importerPath: ctx.filePath, - }); - } catch (error_) { - error = error_; - } - } - - debug("Failed to load plugin '%s' declared in '%s'.", name, ctx.name); - error.message = `Failed to load plugin '${name}' declared in '${ctx.name}': ${error.message}`; - return new ConfigDependency({ - error, - id, - importerName: ctx.name, - importerPath: ctx.filePath, - }); - } - - /** - * Take file expression processors as config array elements. - * - * @param {Record} plugins The plugin definitions. - * @param {ConfigArrayFactoryLoadingContext} ctx The loading context. - * @yields {ConfigArrayElement} The config array elements of file expression processors. - * @private - */ - *_takeFileExtensionProcessors(plugins, ctx) { - for (const pluginId of Object.keys(plugins)) { - const processors = - plugins[pluginId] && - plugins[pluginId].definition && - plugins[pluginId].definition.processors; - - if (!processors) { - continue; - } - - for (const processorId of Object.keys(processors)) { - if (processorId.startsWith('.')) { - yield* this._normalizeObjectConfigData( - { - files: [`*${processorId}`], - processor: `${pluginId}/${processorId}`, - }, - { - ...ctx, - type: 'implicit-processor', - name: `${ctx.name}#processors["${pluginId}/${processorId}"]`, - }, - ); - } - } - } - } -} - -module.exports = { ConfigArrayFactory, createContext }; diff --git a/fixtures/eslint/lib/cli-engine/config-array/ignore-pattern.js b/fixtures/eslint/lib/cli-engine/config-array/ignore-pattern.js deleted file mode 100644 index 0cd6575a..00000000 --- a/fixtures/eslint/lib/cli-engine/config-array/ignore-pattern.js +++ /dev/null @@ -1,252 +0,0 @@ -/** - * @file `IgnorePattern` class. - * - * `IgnorePattern` class has the set of glob patterns and the base path. - * - * It provides two static methods. - * - * - `IgnorePattern.createDefaultIgnore(cwd)` - * Create the default predicate function. - * - `IgnorePattern.createIgnore(ignorePatterns)` - * Create the predicate function from multiple `IgnorePattern` objects. - * - * It provides two properties and a method. - * - * - `patterns` - * The glob patterns that ignore to lint. - * - `basePath` - * The base path of the glob patterns. If absolute paths existed in the - * glob patterns, those are handled as relative paths to the base path. - * - `getPatternsRelativeTo(basePath)` - * Get `patterns` as modified for a given base path. It modifies the - * absolute paths in the patterns as prepending the difference of two base - * paths. - * - * `ConfigArrayFactory` creates `IgnorePattern` objects when it processes - * `ignorePatterns` properties. - * @author Toru Nagashima - */ -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const assert = require('node:assert'); -const path = require('node:path'); - -const debug = require('debug')('eslint:ignore-pattern'); -const ignore = require('ignore'); - -/** @typedef {ReturnType} Ignore */ - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -/** - * Get the path to the common ancestor directory of given paths. - * - * @param {string[]} sourcePaths The paths to calculate the common ancestor. - * @returns {string} The path to the common ancestor directory. - */ -function getCommonAncestorPath(sourcePaths) { - let result = sourcePaths[0]; - - for (let i = 1; i < sourcePaths.length; ++i) { - const a = result; - const b = sourcePaths[i]; - - // Set the shorter one (it's the common ancestor if one includes the other). - result = a.length < b.length ? a : b; - - // Set the common ancestor. - for (let j = 0, lastSepPos = 0; j < a.length && j < b.length; ++j) { - if (a[j] !== b[j]) { - result = a.slice(0, lastSepPos); - break; - } - - if (a[j] === path.sep) { - lastSepPos = j; - } - } - } - - return result || path.sep; -} - -/** - * Make relative path. - * - * @param {string} from The source path to get relative path. - * @param {string} to The destination path to get relative path. - * @returns {string} The relative path. - */ -function relative(from, to) { - const relPath = path.relative(from, to); - - if (path.sep === '/') { - return relPath; - } - - return relPath.split(path.sep).join('/'); -} - -/** - * Get the trailing slash if existed. - * - * @param {string} filePath The path to check. - * @returns {string} The trailing slash if existed. - */ -function dirSuffix(filePath) { - const isDir = - filePath.endsWith(path.sep) || - (process.platform === 'win32' && filePath.endsWith('/')); - - return isDir ? '/' : ''; -} - -const DefaultPatterns = Object.freeze(['/**/node_modules/*']); -const DotPatterns = Object.freeze(['.*', '!.eslintrc.*', '!../']); - -// ------------------------------------------------------------------------------ -// Public -// ------------------------------------------------------------------------------ - -class IgnorePattern { - /** - * The default patterns. - * - * @type {string[]} - */ - static get DefaultPatterns() { - return DefaultPatterns; - } - - /** - * Create the default predicate function. - * - * @param {string} cwd The current working directory. - * @returns {((filePath:string, dot:boolean) => boolean) & {basePath:string; patterns:string[]}} - * The preficate function. - * The first argument is an absolute path that is checked. - * The second argument is the flag to not ignore dotfiles. - * If the predicate function returned `true`, it means the path should be ignored. - */ - static createDefaultIgnore(cwd) { - return this.createIgnore([new IgnorePattern(DefaultPatterns, cwd)]); - } - - /** - * Create the predicate function from multiple `IgnorePattern` objects. - * - * @param {IgnorePattern[]} ignorePatterns The list of ignore patterns. - * @returns {((filePath:string, dot?:boolean) => boolean) & {basePath:string; patterns:string[]}} - * The preficate function. - * The first argument is an absolute path that is checked. - * The second argument is the flag to not ignore dotfiles. - * If the predicate function returned `true`, it means the path should be ignored. - */ - static createIgnore(ignorePatterns) { - debug('Create with: %o', ignorePatterns); - - const basePath = getCommonAncestorPath( - ignorePatterns.map((p) => p.basePath), - ); - const patterns = ignorePatterns.flatMap((p) => - p.getPatternsRelativeTo(basePath), - ); - const ig = ignore().add([...DotPatterns, ...patterns]); - const dotIg = ignore().add(patterns); - - debug(' processed: %o', { basePath, patterns }); - - return Object.assign( - (filePath, dot = false) => { - assert( - path.isAbsolute(filePath), - "'filePath' should be an absolute path.", - ); - const relPathRaw = relative(basePath, filePath); - const relPath = relPathRaw && relPathRaw + dirSuffix(filePath); - const adoptedIg = dot ? dotIg : ig; - const result = relPath !== '' && adoptedIg.ignores(relPath); - - debug('Check', { filePath, dot, relativePath: relPath, result }); - return result; - }, - { basePath, patterns }, - ); - } - - /** - * Initialize a new `IgnorePattern` instance. - * - * @param {string[]} patterns The glob patterns that ignore to lint. - * @param {string} basePath The base path of `patterns`. - */ - constructor(patterns, basePath) { - assert(path.isAbsolute(basePath), "'basePath' should be an absolute path."); - - /** - * The glob patterns that ignore to lint. - * - * @type {string[]} - */ - this.patterns = patterns; - - /** - * The base path of `patterns`. - * - * @type {string} - */ - this.basePath = basePath; - - /** - * If `true` then patterns which don't start with `/` will match the paths to the outside of `basePath`. Defaults to `false`. - * - * It's set `true` for `.eslintignore`, `package.json`, and `--ignore-path` for backward compatibility. - * It's `false` as-is for `ignorePatterns` property in config files. - * - * @type {boolean} - */ - this.loose = false; - } - - /** - * Get `patterns` as modified for a given base path. It modifies the - * absolute paths in the patterns as prepending the difference of two base - * paths. - * - * @param {string} newBasePath The base path. - * @returns {string[]} Modifired patterns. - */ - getPatternsRelativeTo(newBasePath) { - assert( - path.isAbsolute(newBasePath), - "'newBasePath' should be an absolute path.", - ); - const { basePath, loose, patterns } = this; - - if (newBasePath === basePath) { - return patterns; - } - - const prefix = `/${relative(newBasePath, basePath)}`; - - return patterns.map((pattern) => { - const negative = pattern.startsWith('!'); - const head = negative ? '!' : ''; - const body = negative ? pattern.slice(1) : pattern; - - if (body.startsWith('/') || body.startsWith('../')) { - return `${head}${prefix}${body}`; - } - - return loose ? pattern : `${head}${prefix}/**/${body}`; - }); - } -} - -module.exports = { IgnorePattern }; diff --git a/fixtures/eslint/lib/cli-engine/file-enumerator.js b/fixtures/eslint/lib/cli-engine/file-enumerator.js deleted file mode 100644 index 36af431a..00000000 --- a/fixtures/eslint/lib/cli-engine/file-enumerator.js +++ /dev/null @@ -1,536 +0,0 @@ -/** - * @file `FileEnumerator` class. - * - * `FileEnumerator` class has two responsibilities: - * - * 1. Find target files by processing glob patterns. - * 2. Tie each target file and appropriate configuration. - * - * It provides a method: - * - * - `iterateFiles(patterns)` - * Iterate files which are matched by given patterns together with the - * corresponded configuration. This is for `CLIEngine#executeOnFiles()`. - * While iterating files, it loads the configuration file of each directory - * before iterate files on the directory, so we can use the configuration - * files to determine target files. - * @example - * const enumerator = new FileEnumerator(); - * const linter = new Linter(); - * - * for (const { config, filePath } of enumerator.iterateFiles(["*.js"])) { - * const code = fs.readFileSync(filePath, "utf8"); - * const messages = linter.verify(code, config, filePath); - * - * console.log(messages); - * } - * @author Toru Nagashima - */ -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const fs = require('node:fs'); -const path = require('node:path'); - -const debug = require('debug')('eslint:file-enumerator'); -const getGlobParent = require('glob-parent'); -const isGlob = require('is-glob'); -const { escapeRegExp } = require('lodash'); -const { Minimatch } = require('minimatch'); - -const { - CascadingConfigArrayFactory, -} = require('./cascading-config-array-factory'); -const { IgnorePattern } = require('./config-array'); - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -const minimatchOpts = { dot: true, matchBase: true }; -const dotfilesPattern = /(?:(?:^\.)|(?:[/\\]\.))[^/\\.].*/u; -const NONE = 0; -const IGNORED_SILENTLY = 1; -const IGNORED = 2; - -// For VSCode intellisense -/** @typedef {ReturnType} ConfigArray */ - -/** - * @typedef {object} FileEnumeratorOptions - * @property {CascadingConfigArrayFactory} [configArrayFactory] The factory for config arrays. - * @property {string} [cwd] The base directory to start lookup. - * @property {string[]} [extensions] The extensions to match files for directory patterns. - * @property {boolean} [globInputPaths] Set to false to skip glob resolution of input file paths to lint (default: true). If false, each input file paths is assumed to be a non-glob path to an existing file. - * @property {boolean} [ignore] The flag to check ignored files. - * @property {string[]} [rulePaths] The value of `--rulesdir` option. - */ - -/** - * @typedef {object} FileAndConfig - * @property {string} filePath The path to a target file. - * @property {ConfigArray} config The config entries of that file. - * @property {boolean} ignored If `true` then this file should be ignored and warned because it was directly specified. - */ - -/** - * @typedef {object} FileEntry - * @property {string} filePath The path to a target file. - * @property {ConfigArray} config The config entries of that file. - * @property {NONE|IGNORED_SILENTLY|IGNORED} flag The flag. - * - `NONE` means the file is a target file. - * - `IGNORED_SILENTLY` means the file should be ignored silently. - * - `IGNORED` means the file should be ignored and warned because it was directly specified. - */ - -/** - * @typedef {object} FileEnumeratorInternalSlots - * @property {CascadingConfigArrayFactory} configArrayFactory The factory for config arrays. - * @property {string} cwd The base directory to start lookup. - * @property {RegExp|null} extensionRegExp The RegExp to test if a string ends with specific file extensions. - * @property {boolean} globInputPaths Set to false to skip glob resolution of input file paths to lint (default: true). If false, each input file paths is assumed to be a non-glob path to an existing file. - * @property {boolean} ignoreFlag The flag to check ignored files. - * @property {(filePath:string, dot:boolean) => boolean} defaultIgnores The default predicate function to ignore files. - */ - -/** @type {WeakMap} */ -const internalSlotsMap = new WeakMap(); - -/** - * Check if a string is a glob pattern or not. - * - * @param {string} pattern A glob pattern. - * @returns {boolean} `true` if the string is a glob pattern. - */ -function isGlobPattern(pattern) { - return isGlob(path.sep === '\\' ? pattern.replace(/\\/gu, '/') : pattern); -} - -/** - * Get stats of a given path. - * - * @param {string} filePath The path to target file. - * @returns {fs.Stats|null} The stats. - * @private - */ -function statSafeSync(filePath) { - try { - return fs.statSync(filePath); - } catch (error) { - /* istanbul ignore next */ - if (error.code !== 'ENOENT') { - throw error; - } - - return null; - } -} - -/** - * Get filenames in a given path to a directory. - * - * @param {string} directoryPath The path to target directory. - * @returns {import("fs").Dirent[]} The filenames. - * @private - */ -function readdirSafeSync(directoryPath) { - try { - return fs.readdirSync(directoryPath, { withFileTypes: true }); - } catch (error) { - /* istanbul ignore next */ - if (error.code !== 'ENOENT') { - throw error; - } - - return []; - } -} - -/** - * Create a `RegExp` object to detect extensions. - * - * @param {string[] | null} extensions The extensions to create. - * @returns {RegExp | null} The created `RegExp` object or null. - */ -function createExtensionRegExp(extensions) { - if (extensions) { - const normalizedExts = extensions.map((ext) => - escapeRegExp(ext.startsWith('.') ? ext.slice(1) : ext), - ); - - return new RegExp(`.\\.(?:${normalizedExts.join('|')})$`, 'u'); - } - - return null; -} - -/** - * The error type when no files match a glob. - */ -class NoFilesFoundError extends Error { - /** - * @param {string} pattern The glob pattern which was not found. - * @param {boolean} globDisabled If `true` then the pattern was a glob pattern, but glob was disabled. - */ - constructor(pattern, globDisabled) { - super( - `No files matching '${pattern}' were found${ - globDisabled ? ' (glob was disabled)' : '' - }.`, - ); - this.messageTemplate = 'file-not-found'; - this.messageData = { pattern, globDisabled }; - } -} - -/** - * The error type when there are files matched by a glob, but all of them have been ignored. - */ -class AllFilesIgnoredError extends Error { - /** - * @param {string} pattern The glob pattern which was not found. - */ - constructor(pattern) { - super(`All files matched by '${pattern}' are ignored.`); - this.messageTemplate = 'all-files-ignored'; - this.messageData = { pattern }; - } -} - -/** - * This class provides the functionality that enumerates every file which is - * matched by given glob patterns and that configuration. - */ -class FileEnumerator { - /** - * Initialize this enumerator. - * - * @param {FileEnumeratorOptions} options The options. - */ - constructor({ - cwd = process.cwd(), - configArrayFactory = new CascadingConfigArrayFactory({ cwd }), - extensions = null, - globInputPaths = true, - errorOnUnmatchedPattern = true, - ignore = true, - } = {}) { - internalSlotsMap.set(this, { - configArrayFactory, - cwd, - defaultIgnores: IgnorePattern.createDefaultIgnore(cwd), - extensionRegExp: createExtensionRegExp(extensions), - globInputPaths, - errorOnUnmatchedPattern, - ignoreFlag: ignore, - }); - } - - /** - * Check if a given file is target or not. - * - * @param {string} filePath The path to a candidate file. - * @param {ConfigArray} [providedConfig] Optional. The configuration for the file. - * @returns {boolean} `true` if the file is a target. - */ - isTargetPath(filePath, providedConfig) { - const { configArrayFactory, extensionRegExp } = internalSlotsMap.get(this); - - // If `--ext` option is present, use it. - if (extensionRegExp) { - return extensionRegExp.test(filePath); - } - - // `.js` file is target by default. - if (filePath.endsWith('.js')) { - return true; - } - - // Use `overrides[].files` to check additional targets. - const config = - providedConfig || - configArrayFactory.getConfigArrayForFile(filePath, { - ignoreNotFoundError: true, - }); - - return config.isAdditionalTargetPath(filePath); - } - - /** - * Iterate files which are matched by given glob patterns. - * - * @param {string|string[]} patternOrPatterns The glob patterns to iterate files. - * @yields {FileAndConfig} The found files. - */ - *iterateFiles(patternOrPatterns) { - const { globInputPaths, errorOnUnmatchedPattern } = - internalSlotsMap.get(this); - const patterns = Array.isArray(patternOrPatterns) - ? patternOrPatterns - : [patternOrPatterns]; - - debug('Start to iterate files: %o', patterns); - - // The set of paths to remove duplicate. - const set = new Set(); - - for (const pattern of patterns) { - let foundRegardlessOfIgnored = false; - let found = false; - - // Skip empty string. - if (!pattern) { - continue; - } - - // Iterate files of this pattern. - for (const { config, filePath, flag } of this._iterateFiles(pattern)) { - foundRegardlessOfIgnored = true; - if (flag === IGNORED_SILENTLY) { - continue; - } - - found = true; - - // Remove duplicate paths while yielding paths. - if (!set.has(filePath)) { - set.add(filePath); - yield { - config, - filePath, - ignored: flag === IGNORED, - }; - } - } - - // Raise an error if any files were not found. - if (errorOnUnmatchedPattern) { - if (!foundRegardlessOfIgnored) { - throw new NoFilesFoundError( - pattern, - !globInputPaths && isGlob(pattern), - ); - } - - if (!found) { - throw new AllFilesIgnoredError(pattern); - } - } - } - - debug(`Complete iterating files: ${JSON.stringify(patterns)}`); - } - - /** - * Iterate files which are matched by a given glob pattern. - * - * @param {string} pattern The glob pattern to iterate files. - * @returns {IterableIterator} The found files. - */ - _iterateFiles(pattern) { - const { cwd, globInputPaths } = internalSlotsMap.get(this); - const absolutePath = path.resolve(cwd, pattern); - const isDot = dotfilesPattern.test(pattern); - const stat = statSafeSync(absolutePath); - - if (stat && stat.isDirectory()) { - return this._iterateFilesWithDirectory(absolutePath, isDot); - } - - if (stat && stat.isFile()) { - return this._iterateFilesWithFile(absolutePath); - } - - if (globInputPaths && isGlobPattern(pattern)) { - return this._iterateFilesWithGlob(absolutePath, isDot); - } - - return []; - } - - /** - * Iterate a file which is matched by a given path. - * - * @param {string} filePath The path to the target file. - * @returns {IterableIterator} The found files. - * @private - */ - _iterateFilesWithFile(filePath) { - debug(`File: ${filePath}`); - - const { configArrayFactory } = internalSlotsMap.get(this); - const config = configArrayFactory.getConfigArrayForFile(filePath); - const ignored = this._isIgnoredFile(filePath, { config, direct: true }); - const flag = ignored ? IGNORED : NONE; - - return [{ config, filePath, flag }]; - } - - /** - * Iterate files in a given path. - * - * @param {string} directoryPath The path to the target directory. - * @param {boolean} dotfiles If `true` then it doesn't skip dot files by default. - * @returns {IterableIterator} The found files. - * @private - */ - _iterateFilesWithDirectory(directoryPath, dotfiles) { - debug(`Directory: ${directoryPath}`); - - return this._iterateFilesRecursive(directoryPath, { - dotfiles, - recursive: true, - selector: null, - }); - } - - /** - * Iterate files which are matched by a given glob pattern. - * - * @param {string} pattern The glob pattern to iterate files. - * @param {boolean} dotfiles If `true` then it doesn't skip dot files by default. - * @returns {IterableIterator} The found files. - * @private - */ - _iterateFilesWithGlob(pattern, dotfiles) { - debug(`Glob: ${pattern}`); - - const directoryPath = path.resolve(getGlobParent(pattern)); - const globPart = pattern.slice(directoryPath.length + 1); - - /* - * Recursive if there are `**` or path separators in the glob part. - * Otherwise, patterns such as `src/*.js`, it doesn't need recursive. - */ - const recursive = /\*\*|\/|\\/u.test(globPart); - const selector = new Minimatch(pattern, minimatchOpts); - - debug(`recursive? ${recursive}`); - - return this._iterateFilesRecursive(directoryPath, { - dotfiles, - recursive, - selector, - }); - } - - /** - * Iterate files in a given path. - * - * @param {string} directoryPath The path to the target directory. - * @param {object} options The options to iterate files. - * @param {boolean} [options.dotfiles] If `true` then it doesn't skip dot files by default. - * @param {boolean} [options.recursive] If `true` then it dives into sub directories. - * @param {InstanceType} [options.selector] The matcher to choose files. - * @yields {IterableIterator} The found files. - * @private - */ - *_iterateFilesRecursive(directoryPath, options) { - debug(`Enter the directory: ${directoryPath}`); - const { configArrayFactory } = internalSlotsMap.get(this); - - /** @type {ConfigArray|null} */ - let config = null; - - // Enumerate the files of this directory. - for (const entry of readdirSafeSync(directoryPath)) { - const filePath = path.join(directoryPath, entry.name); - - // Check if the file is matched. - if (entry.isFile()) { - if (!config) { - config = configArrayFactory.getConfigArrayForFile( - filePath, - - /* - * We must ignore `ConfigurationNotFoundError` at this - * point because we don't know if target files exist in - * this directory. - */ - { ignoreNotFoundError: true }, - ); - } - - const matched = options.selector - ? // Started with a glob pattern; choose by the pattern. - options.selector.match(filePath) - : // Started with a directory path; choose by file extensions. - this.isTargetPath(filePath, config); - - if (matched) { - const ignored = this._isIgnoredFile(filePath, { ...options, config }); - const flag = ignored ? IGNORED_SILENTLY : NONE; - - debug(`Yield: ${entry.name}${ignored ? ' but ignored' : ''}`); - yield { - config: configArrayFactory.getConfigArrayForFile(filePath), - filePath, - flag, - }; - } else { - debug(`Didn't match: ${entry.name}`); - } - - // Dive into the sub directory. - } else if (options.recursive && entry.isDirectory()) { - if (!config) { - config = configArrayFactory.getConfigArrayForFile(filePath, { - ignoreNotFoundError: true, - }); - } - - const ignored = this._isIgnoredFile(filePath + path.sep, { - ...options, - config, - }); - - if (!ignored) { - yield* this._iterateFilesRecursive(filePath, options); - } - } - } - - debug(`Leave the directory: ${directoryPath}`); - } - - /** - * Check if a given file should be ignored. - * - * @param {string} filePath The path to a file to check. - * @param {object} options Options - * @param {ConfigArray} [options.config] The config for this file. - * @param {boolean} [options.dotfiles] If `true` then this is not ignore dot files by default. - * @param {boolean} [options.direct] If `true` then this is a direct specified file. - * @returns {boolean} `true` if the file should be ignored. - * @private - */ - _isIgnoredFile( - filePath, - { config: providedConfig, dotfiles = false, direct = false }, - ) { - const { configArrayFactory, defaultIgnores, ignoreFlag } = - internalSlotsMap.get(this); - - if (ignoreFlag) { - const config = - providedConfig || - configArrayFactory.getConfigArrayForFile(filePath, { - ignoreNotFoundError: true, - }); - const ignores = config.extractConfig(filePath).ignores || defaultIgnores; - - return ignores(filePath, dotfiles); - } - - return !direct && defaultIgnores(filePath, dotfiles); - } -} - -// ------------------------------------------------------------------------------ -// Public Interface -// ------------------------------------------------------------------------------ - -module.exports = { FileEnumerator }; diff --git a/fixtures/eslint/lib/init/config-initializer.js b/fixtures/eslint/lib/init/config-initializer.js deleted file mode 100644 index 75b5f11d..00000000 --- a/fixtures/eslint/lib/init/config-initializer.js +++ /dev/null @@ -1,768 +0,0 @@ -/** - * @file Config initialization wizard. - * @author Ilya Volodin - */ - -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const path = require('node:path'); -const util = require('node:util'); - -const debug = require('debug')('eslint:config-initializer'); -const inquirer = require('inquirer'); -const ProgressBar = require('progress'); -const semver = require('semver'); - -const recConfig = require('../../conf/eslint-recommended'); -const ConfigOps = require('../shared/config-ops'); -const log = require('../shared/logging'); -const naming = require('../shared/naming'); -const ModuleResolver = require('../shared/relative-module-resolver'); - -const autoconfig = require('./autoconfig.js'); -const ConfigFile = require('./config-file'); -const npmUtils = require('./npm-utils'); -const { getSourceCodeOfFiles } = require('./source-code-utils'); - -// ------------------------------------------------------------------------------ -// Private -// ------------------------------------------------------------------------------ - -const DEFAULT_ECMA_VERSION = 2018; - -/* istanbul ignore next: hard to test fs function */ -/** - * Create .eslintrc file in the current working directory - * - * @param {object} config object that contains user's answers - * @param {string} format The file format to write to. - * @returns {void} - */ -function writeFile(config, format) { - // Default is .js - let extname = '.js'; - - if (format === 'YAML') { - extname = '.yml'; - } else if (format === 'JSON') { - extname = '.json'; - } - - const installedESLint = config.installedESLint; - - delete config.installedESLint; - - ConfigFile.write(config, `./.eslintrc${extname}`); - log.info(`Successfully created .eslintrc${extname} file in ${process.cwd()}`); - - if (installedESLint) { - log.info( - 'ESLint was installed locally. We recommend using this local copy instead of your globally-installed copy.', - ); - } -} - -/** - * Get the peer dependencies of the given module. - * This adds the gotten value to cache at the first time, then reuses it. - * In a process, this function is called twice, but `npmUtils.fetchPeerDependencies` needs to access network which is relatively slow. - * - * @param {string} moduleName The module name to get. - * @returns {object} The peer dependencies of the given module. - * This object is the object of `peerDependencies` field of `package.json`. - * Returns null if npm was not found. - */ -function getPeerDependencies(moduleName) { - let result = getPeerDependencies.cache.get(moduleName); - - if (!result) { - log.info(`Checking peerDependencies of ${moduleName}`); - - result = npmUtils.fetchPeerDependencies(moduleName); - getPeerDependencies.cache.set(moduleName, result); - } - - return result; -} - -getPeerDependencies.cache = new Map(); - -/** - * Return necessary plugins, configs, parsers, etc. based on the config - * - * @param {object} config config object - * @param {boolean} [installESLint] If `false` is given, it does not install eslint. - * @returns {string[]} An array of modules to be installed. - */ -function getModulesList(config, installESLint) { - const modules = {}; - - // Create a list of modules which should be installed based on config - if (config.plugins) { - for (const plugin of config.plugins) { - const moduleName = naming.normalizePackageName(plugin, 'eslint-plugin'); - - modules[moduleName] = 'latest'; - } - } - - if (config.extends) { - const extendList = Array.isArray(config.extends) - ? config.extends - : [config.extends]; - - for (const extend of extendList) { - if (extend.startsWith('eslint:') || extend.startsWith('plugin:')) { - continue; - } - - const moduleName = naming.normalizePackageName(extend, 'eslint-config'); - - modules[moduleName] = 'latest'; - Object.assign(modules, getPeerDependencies(`${moduleName}@latest`)); - } - } - - const parser = - config.parser || (config.parserOptions && config.parserOptions.parser); - - if (parser) { - modules[parser] = 'latest'; - } - - if (installESLint === false) { - delete modules.eslint; - } else { - const installStatus = npmUtils.checkDevDeps(['eslint']); - - // Mark to show messages if it's new installation of eslint. - if (installStatus.eslint === false) { - log.info('Local ESLint installation not found.'); - modules.eslint = modules.eslint || 'latest'; - config.installedESLint = true; - } - } - - return Object.keys(modules).map((name) => `${name}@${modules[name]}`); -} - -/** - * Set the `rules` of a config by examining a user's source code - * - * Note: This clones the config object and returns a new config to avoid mutating - * the original config parameter. - * - * @param {object} answers answers received from inquirer - * @param {object} config config object - * @returns {object} config object with configured rules - */ -function configureRules(answers, config) { - const BAR_TOTAL = 20; - const BAR_SOURCE_CODE_TOTAL = 4; - const newConfig = { ...config }; - const disabledConfigs = {}; - let sourceCodes, registry; - - // Set up a progress bar, as this process can take a long time - const bar = new ProgressBar( - 'Determining Config: :percent [:bar] :elapseds elapsed, eta :etas ', - { - width: 30, - total: BAR_TOTAL, - }, - ); - - bar.tick(0); // Shows the progress bar - - // Get the SourceCode of all chosen files - const patterns = answers.patterns.split(/[\s]+/u); - - try { - sourceCodes = getSourceCodeOfFiles( - patterns, - { baseConfig: newConfig, useEslintrc: false }, - (total) => { - bar.tick(BAR_SOURCE_CODE_TOTAL / total); - }, - ); - } catch (error) { - log.info('\n'); - throw error; - } - - const fileQty = Object.keys(sourceCodes).length; - - if (fileQty === 0) { - log.info('\n'); - throw new Error( - 'Automatic Configuration failed. No files were able to be parsed.', - ); - } - - // Create a registry of rule configs - registry = new autoconfig.Registry(); - registry.populateFromCoreRules(); - - // Lint all files with each rule config in the registry - registry = registry.lintSourceCode(sourceCodes, newConfig, (total) => { - bar.tick((BAR_TOTAL - BAR_SOURCE_CODE_TOTAL) / total); // Subtract out ticks used at beginning - }); - debug(`\nRegistry: ${util.inspect(registry.rules, { depth: null })}`); - - // Create a list of recommended rules, because we don't want to disable them - const recRules = new Set( - Object.keys(recConfig.rules).filter((ruleId) => - ConfigOps.isErrorSeverity(recConfig.rules[ruleId]), - ), - ); - - // Find and disable rules which had no error-free configuration - const failingRegistry = registry.getFailingRulesRegistry(); - - for (const ruleId of Object.keys(failingRegistry.rules)) { - // If the rule is recommended, set it to error, otherwise disable it - disabledConfigs[ruleId] = recRules.has(ruleId) ? 2 : 0; - } - - // Now that we know which rules to disable, strip out configs with errors - registry = registry.stripFailingConfigs(); - - /* - * If there is only one config that results in no errors for a rule, we should use it. - * createConfig will only add rules that have one configuration in the registry. - */ - const singleConfigs = registry.createConfig().rules; - - /* - * The "sweet spot" for number of options in a config seems to be two (severity plus one option). - * Very often, a third option (usually an object) is available to address - * edge cases, exceptions, or unique situations. We will prefer to use a config with - * specificity of two. - */ - const specTwoConfigs = registry.filterBySpecificity(2).createConfig().rules; - - // Maybe a specific combination using all three options works - const specThreeConfigs = registry.filterBySpecificity(3).createConfig().rules; - - // If all else fails, try to use the default (severity only) - const defaultConfigs = registry.filterBySpecificity(1).createConfig().rules; - - // Combine configs in reverse priority order (later take precedence) - newConfig.rules = { - ...disabledConfigs, - ...defaultConfigs, - ...specThreeConfigs, - ...specTwoConfigs, - ...singleConfigs, - }; - - // Make sure progress bar has finished (floating point rounding) - bar.update(BAR_TOTAL); - - // Log out some stats to let the user know what happened - const finalRuleIds = Object.keys(newConfig.rules); - const totalRules = finalRuleIds.length; - const enabledRules = finalRuleIds.filter( - (ruleId) => newConfig.rules[ruleId] !== 0, - ).length; - const resultMessage = [ - `\nEnabled ${enabledRules} out of ${totalRules}`, - `rules based on ${fileQty}`, - `file${fileQty === 1 ? '.' : 's.'}`, - ].join(' '); - - log.info(resultMessage); - - ConfigOps.normalizeToStrings(newConfig); - return newConfig; -} - -/** - * Process user's answers and create config object - * - * @param {object} answers answers received from inquirer - * @returns {object} config object - */ -function processAnswers(answers) { - let config = { - rules: {}, - env: {}, - parserOptions: {}, - extends: [], - }; - - // Set the latest ECMAScript version - config.parserOptions.ecmaVersion = DEFAULT_ECMA_VERSION; - config.env.es6 = true; - config.globals = { - Atomics: 'readonly', - SharedArrayBuffer: 'readonly', - }; - - // Set the module type - if (answers.moduleType === 'esm') { - config.parserOptions.sourceType = 'module'; - } else if (answers.moduleType === 'commonjs') { - config.env.commonjs = true; - } - - // Add in browser and node environments if necessary - for (const env of answers.env) { - config.env[env] = true; - } - - // Add in library information - if (answers.framework === 'react') { - config.parserOptions.ecmaFeatures = { - jsx: true, - }; - config.plugins = ['react']; - config.extends.push('plugin:react/recommended'); - } else if (answers.framework === 'vue') { - config.plugins = ['vue']; - config.extends.push('plugin:vue/essential'); - } - - if (answers.typescript) { - if (answers.framework === 'vue') { - config.parserOptions.parser = '@typescript-eslint/parser'; - } else { - config.parser = '@typescript-eslint/parser'; - } - - if (Array.isArray(config.plugins)) { - config.plugins.push('@typescript-eslint'); - } else { - config.plugins = ['@typescript-eslint']; - } - } - - // Setup rules based on problems/style enforcement preferences - if (answers.purpose === 'problems') { - config.extends.unshift('eslint:recommended'); - } else if (answers.purpose === 'style') { - if (answers.source === 'prompt') { - config.extends.unshift('eslint:recommended'); - config.rules.indent = ['error', answers.indent]; - config.rules.quotes = ['error', answers.quotes]; - config.rules['linebreak-style'] = ['error', answers.linebreak]; - config.rules.semi = ['error', answers.semi ? 'always' : 'never']; - } else if (answers.source === 'auto') { - config = configureRules(answers, config); - config = autoconfig.extendFromRecommended(config); - } - } - - if (answers.typescript && config.extends.includes('eslint:recommended')) { - config.extends.push('plugin:@typescript-eslint/eslint-recommended'); - } - - // Normalize extends - if (config.extends.length === 0) { - delete config.extends; - } else if (config.extends.length === 1) { - config.extends = config.extends[0]; - } - - ConfigOps.normalizeToStrings(config); - return config; -} - -/** - * Get the version of the local ESLint. - * - * @returns {string|null} The version. If the local ESLint was not found, returns null. - */ -function getLocalESLintVersion() { - try { - const eslintPath = ModuleResolver.resolve( - 'eslint', - path.join(process.cwd(), '__placeholder__.js'), - ); - const eslint = require(eslintPath); - - return eslint.linter.version || null; - } catch { - return null; - } -} - -/** - * Get the shareable config name of the chosen style guide. - * - * @param {object} answers The answers object. - * @returns {string} The shareable config name. - */ -function getStyleGuideName(answers) { - if (answers.styleguide === 'airbnb' && answers.framework !== 'react') { - return 'airbnb-base'; - } - - return answers.styleguide; -} - -/** - * Check whether the local ESLint version conflicts with the required version of the chosen shareable config. - * - * @param {object} answers The answers object. - * @returns {boolean} `true` if the local ESLint is found then it conflicts with the required version of the chosen shareable config. - */ -function hasESLintVersionConflict(answers) { - // Get the local ESLint version. - const localESLintVersion = getLocalESLintVersion(); - - if (!localESLintVersion) { - return false; - } - - // Get the required range of ESLint version. - const configName = getStyleGuideName(answers); - const moduleName = `eslint-config-${configName}@latest`; - const peerDependencies = getPeerDependencies(moduleName) || {}; - const requiredESLintVersionRange = peerDependencies.eslint; - - if (!requiredESLintVersionRange) { - return false; - } - - answers.localESLintVersion = localESLintVersion; - answers.requiredESLintVersionRange = requiredESLintVersionRange; - - // Check the version. - if (semver.satisfies(localESLintVersion, requiredESLintVersionRange)) { - answers.installESLint = false; - return false; - } - - return true; -} - -/** - * Install modules. - * - * @param {string[]} modules Modules to be installed. - * @returns {void} - */ -function installModules(modules) { - log.info(`Installing ${modules.join(', ')}`); - npmUtils.installSyncSaveDev(modules); -} - -/* istanbul ignore next: no need to test inquirer */ -/** - * Ask user to install modules. - * - * @param {string[]} modules Array of modules to be installed. - * @param {boolean} packageJsonExists Indicates if package.json is existed. - * @returns {Promise} Answer that indicates if user wants to install. - */ -function askInstallModules(modules, packageJsonExists) { - // If no modules, do nothing. - if (modules.length === 0) { - return Promise.resolve(); - } - - log.info( - "The config that you've selected requires the following dependencies:\n", - ); - log.info(modules.join(' ')); - return inquirer - .prompt([ - { - type: 'confirm', - name: 'executeInstallation', - message: 'Would you like to install them now with npm?', - default: true, - when() { - return modules.length > 0 && packageJsonExists; - }, - }, - ]) - .then(({ executeInstallation }) => { - if (executeInstallation) { - installModules(modules); - } - }); -} - -/* istanbul ignore next: no need to test inquirer */ -/** - * Ask use a few questions on command prompt - * - * @returns {Promise} The promise with the result of the prompt - */ -function promptUser() { - return inquirer - .prompt([ - { - type: 'list', - name: 'purpose', - message: 'How would you like to use ESLint?', - default: 'problems', - choices: [ - { name: 'To check syntax only', value: 'syntax' }, - { name: 'To check syntax and find problems', value: 'problems' }, - { - name: 'To check syntax, find problems, and enforce code style', - value: 'style', - }, - ], - }, - { - type: 'list', - name: 'moduleType', - message: 'What type of modules does your project use?', - default: 'esm', - choices: [ - { name: 'JavaScript modules (import/export)', value: 'esm' }, - { name: 'CommonJS (require/exports)', value: 'commonjs' }, - { name: 'None of these', value: 'none' }, - ], - }, - { - type: 'list', - name: 'framework', - message: 'Which framework does your project use?', - default: 'react', - choices: [ - { name: 'React', value: 'react' }, - { name: 'Vue.js', value: 'vue' }, - { name: 'None of these', value: 'none' }, - ], - }, - { - type: 'confirm', - name: 'typescript', - message: 'Does your project use TypeScript?', - default: false, - }, - { - type: 'checkbox', - name: 'env', - message: 'Where does your code run?', - default: ['browser'], - choices: [ - { name: 'Browser', value: 'browser' }, - { name: 'Node', value: 'node' }, - ], - }, - { - type: 'list', - name: 'source', - message: 'How would you like to define a style for your project?', - default: 'guide', - choices: [ - { name: 'Use a popular style guide', value: 'guide' }, - { name: 'Answer questions about your style', value: 'prompt' }, - { name: 'Inspect your JavaScript file(s)', value: 'auto' }, - ], - when(answers) { - return answers.purpose === 'style'; - }, - }, - { - type: 'list', - name: 'styleguide', - message: 'Which style guide do you want to follow?', - choices: [ - { - name: 'Airbnb: https://github.com/airbnb/javascript', - value: 'airbnb', - }, - { - name: 'Standard: https://github.com/standard/standard', - value: 'standard', - }, - { - name: 'Google: https://github.com/google/eslint-config-google', - value: 'google', - }, - ], - when(answers) { - answers.packageJsonExists = npmUtils.checkPackageJson(); - return answers.source === 'guide' && answers.packageJsonExists; - }, - }, - { - type: 'input', - name: 'patterns', - message: 'Which file(s), path(s), or glob(s) should be examined?', - when(answers) { - return answers.source === 'auto'; - }, - validate(input) { - if (input.trim().length === 0 && input.trim() !== ',') { - return 'You must tell us what code to examine. Try again.'; - } - - return true; - }, - }, - { - type: 'list', - name: 'format', - message: 'What format do you want your config file to be in?', - default: 'JavaScript', - choices: ['JavaScript', 'YAML', 'JSON'], - }, - { - type: 'confirm', - name: 'installESLint', - message(answers) { - const verb = semver.ltr( - answers.localESLintVersion, - answers.requiredESLintVersionRange, - ) - ? 'upgrade' - : 'downgrade'; - - return `The style guide "${answers.styleguide}" requires eslint@${answers.requiredESLintVersionRange}. You are currently using eslint@${answers.localESLintVersion}.\n Do you want to ${verb}?`; - }, - default: true, - when(answers) { - return ( - answers.source === 'guide' && - answers.packageJsonExists && - hasESLintVersionConflict(answers) - ); - }, - }, - ]) - .then((earlyAnswers) => { - // Early exit if no style guide is necessary - if (earlyAnswers.purpose !== 'style') { - const config = processAnswers(earlyAnswers); - const modules = getModulesList(config); - - return askInstallModules(modules, earlyAnswers.packageJsonExists).then( - () => writeFile(config, earlyAnswers.format), - ); - } - - // Early exit if you are using a style guide - if (earlyAnswers.source === 'guide') { - if (!earlyAnswers.packageJsonExists) { - log.info( - 'A package.json is necessary to install plugins such as style guides. Run `npm init` to create a package.json file and try again.', - ); - return; - } - - if ( - earlyAnswers.installESLint === false && - !semver.satisfies( - earlyAnswers.localESLintVersion, - earlyAnswers.requiredESLintVersionRange, - ) - ) { - log.info( - `Note: it might not work since ESLint's version is mismatched with the ${earlyAnswers.styleguide} config.`, - ); - } - - if ( - earlyAnswers.styleguide === 'airbnb' && - earlyAnswers.framework !== 'react' - ) { - earlyAnswers.styleguide = 'airbnb-base'; - } - - const config = processAnswers(earlyAnswers); - - if (Array.isArray(config.extends)) { - config.extends.push(earlyAnswers.styleguide); - } else if (config.extends) { - config.extends = [config.extends, earlyAnswers.styleguide]; - } else { - config.extends = [earlyAnswers.styleguide]; - } - - const modules = getModulesList(config); - - return askInstallModules(modules, earlyAnswers.packageJsonExists).then( - () => writeFile(config, earlyAnswers.format), - ); - } - - if (earlyAnswers.source === 'auto') { - const combinedAnswers = { ...earlyAnswers }; - const config = processAnswers(combinedAnswers); - const modules = getModulesList(config); - - return askInstallModules(modules).then(() => - writeFile(config, earlyAnswers.format), - ); - } - - // Continue with the style questions otherwise... - return inquirer - .prompt([ - { - type: 'list', - name: 'indent', - message: 'What style of indentation do you use?', - default: 'tab', - choices: [ - { name: 'Tabs', value: 'tab' }, - { name: 'Spaces', value: 4 }, - ], - }, - { - type: 'list', - name: 'quotes', - message: 'What quotes do you use for strings?', - default: 'double', - choices: [ - { name: 'Double', value: 'double' }, - { name: 'Single', value: 'single' }, - ], - }, - { - type: 'list', - name: 'linebreak', - message: 'What line endings do you use?', - default: 'unix', - choices: [ - { name: 'Unix', value: 'unix' }, - { name: 'Windows', value: 'windows' }, - ], - }, - { - type: 'confirm', - name: 'semi', - message: 'Do you require semicolons?', - default: true, - }, - ]) - .then((answers) => { - const totalAnswers = { ...earlyAnswers, ...answers }; - - const config = processAnswers(totalAnswers); - const modules = getModulesList(config); - - return askInstallModules(modules).then(() => - writeFile(config, earlyAnswers.format), - ); - }); - }); -} - -// ------------------------------------------------------------------------------ -// Public Interface -// ------------------------------------------------------------------------------ - -const init = { - getModulesList, - hasESLintVersionConflict, - installModules, - processAnswers, - /* istanbul ignore next */ initializeConfig() { - return promptUser(); - }, -}; - -module.exports = init; diff --git a/fixtures/eslint/lib/linter/apply-disable-directives.js b/fixtures/eslint/lib/linter/apply-disable-directives.js deleted file mode 100644 index a8c2f4a6..00000000 --- a/fixtures/eslint/lib/linter/apply-disable-directives.js +++ /dev/null @@ -1,221 +0,0 @@ -/** - * @file A module that filters reported problems based on `eslint-disable` and `eslint-enable` comments - * @author Teddy Katz - */ - -'use strict'; - -const lodash = require('lodash'); - -/** - * Compares the locations of two objects in a source file - * - * @param {{line: number, column: number}} itemA The first object - * @param {{line: number, column: number}} itemB The second object - * @returns {number} A value less than 1 if itemA appears before itemB in the source file, greater than 1 if - * itemA appears after itemB in the source file, or 0 if itemA and itemB have the same location. - */ -function compareLocations(itemA, itemB) { - return itemA.line - itemB.line || itemA.column - itemB.column; -} - -/** - * This is the same as the exported function, except that it - * doesn't handle disable-line and disable-next-line directives, and it always reports unused - * disable directives. - * - * @param {object} options options for applying directives. This is the same as the options - * for the exported function, except that `reportUnusedDisableDirectives` is not supported - * (this function always reports unused disable directives). - * @returns {{problems: Problem[], unusedDisableDirectives: Problem[]}} An object with a list - * of filtered problems and unused eslint-disable directives - */ -function applyDirectives(options) { - const problems = []; - let nextDirectiveIndex = 0; - let currentGlobalDisableDirective = null; - const disabledRuleMap = new Map(); - - // EnabledRules is only used when there is a current global disable directive. - const enabledRules = new Set(); - const usedDisableDirectives = new Set(); - - for (const problem of options.problems) { - while ( - nextDirectiveIndex < options.directives.length && - compareLocations(options.directives[nextDirectiveIndex], problem) <= 0 - ) { - const directive = options.directives[nextDirectiveIndex++]; - - switch (directive.type) { - case 'disable': { - if (directive.ruleId === null) { - currentGlobalDisableDirective = directive; - disabledRuleMap.clear(); - enabledRules.clear(); - } else if (currentGlobalDisableDirective) { - enabledRules.delete(directive.ruleId); - disabledRuleMap.set(directive.ruleId, directive); - } else { - disabledRuleMap.set(directive.ruleId, directive); - } - - break; - } - - case 'enable': { - if (directive.ruleId === null) { - currentGlobalDisableDirective = null; - disabledRuleMap.clear(); - } else if (currentGlobalDisableDirective) { - enabledRules.add(directive.ruleId); - disabledRuleMap.delete(directive.ruleId); - } else { - disabledRuleMap.delete(directive.ruleId); - } - - break; - } - - // No default - } - } - - if (disabledRuleMap.has(problem.ruleId)) { - usedDisableDirectives.add(disabledRuleMap.get(problem.ruleId)); - } else if ( - currentGlobalDisableDirective && - !enabledRules.has(problem.ruleId) - ) { - usedDisableDirectives.add(currentGlobalDisableDirective); - } else { - problems.push(problem); - } - } - - const unusedDisableDirectives = options.directives - .filter( - (directive) => - directive.type === 'disable' && !usedDisableDirectives.has(directive), - ) - .map((directive) => ({ - ruleId: null, - message: directive.ruleId - ? `Unused eslint-disable directive (no problems were reported from '${directive.ruleId}').` - : 'Unused eslint-disable directive (no problems were reported).', - line: directive.unprocessedDirective.line, - column: directive.unprocessedDirective.column, - severity: options.reportUnusedDisableDirectives === 'warn' ? 1 : 2, - nodeType: null, - })); - - return { problems, unusedDisableDirectives }; -} - -/** - * Given a list of directive comments (i.e. metadata about eslint-disable and eslint-enable comments) and a list - * of reported problems, determines which problems should be reported. - * - * @param {object} options Information about directives and problems - * @param {{ - * type: ("disable"|"enable"|"disable-line"|"disable-next-line"), - * ruleId: (string|null), - * line: number, - * column: number - * }} options.directives Directive comments found in the file, with one-based columns. - * Two directive comments can only have the same location if they also have the same type (e.g. a single eslint-disable - * comment for two different rules is represented as two directives). - * @param {{ruleId: (string|null), line: number, column: number}[]} options.problems - * A list of problems reported by rules, sorted by increasing location in the file, with one-based columns. - * @param {"off" | "warn" | "error"} options.reportUnusedDisableDirectives If `"warn"` or `"error"`, adds additional problems for unused directives - * @returns {{ruleId: (string|null), line: number, column: number}[]} - * A list of reported problems that were not disabled by the directive comments. - */ -module.exports = ({ - directives, - problems, - reportUnusedDisableDirectives = 'off', -}) => { - const blockDirectives = directives - .filter( - (directive) => - directive.type === 'disable' || directive.type === 'enable', - ) - .map((directive) => ({ ...directive, unprocessedDirective: directive })) - .sort(compareLocations); - - const lineDirectives = lodash - // eslint-disable-next-line @cloudfour/unicorn/no-array-method-this-argument - .flatMap(directives, (directive) => { - switch (directive.type) { - case 'disable': - case 'enable': { - return []; - } - - case 'disable-line': { - return [ - { - type: 'disable', - line: directive.line, - column: 1, - ruleId: directive.ruleId, - unprocessedDirective: directive, - }, - { - type: 'enable', - line: directive.line + 1, - column: 0, - ruleId: directive.ruleId, - unprocessedDirective: directive, - }, - ]; - } - - case 'disable-next-line': { - return [ - { - type: 'disable', - line: directive.line + 1, - column: 1, - ruleId: directive.ruleId, - unprocessedDirective: directive, - }, - { - type: 'enable', - line: directive.line + 2, - column: 0, - ruleId: directive.ruleId, - unprocessedDirective: directive, - }, - ]; - } - - default: { - throw new TypeError( - `Unrecognized directive type '${directive.type}'`, - ); - } - } - }) - .sort(compareLocations); - - const blockDirectivesResult = applyDirectives({ - problems, - directives: blockDirectives, - reportUnusedDisableDirectives, - }); - const lineDirectivesResult = applyDirectives({ - problems: blockDirectivesResult.problems, - directives: lineDirectives, - reportUnusedDisableDirectives, - }); - - return reportUnusedDisableDirectives === 'off' - ? lineDirectivesResult.problems - : [ - ...lineDirectivesResult.problems, - ...blockDirectivesResult.unusedDisableDirectives, - ...lineDirectivesResult.unusedDisableDirectives, - ].sort(compareLocations); -}; diff --git a/fixtures/eslint/lib/linter/node-event-generator.js b/fixtures/eslint/lib/linter/node-event-generator.js deleted file mode 100644 index 9d312074..00000000 --- a/fixtures/eslint/lib/linter/node-event-generator.js +++ /dev/null @@ -1,376 +0,0 @@ -/** - * @file The event generator for AST nodes. - * @author Toru Nagashima - */ - -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const esquery = require('esquery'); -const lodash = require('lodash'); - -// ------------------------------------------------------------------------------ -// Typedefs -// ------------------------------------------------------------------------------ - -/** - * An object describing an AST selector - * - * @typedef {object} ASTSelector - * @property {string} rawSelector The string that was parsed into this selector - * @property {boolean} isExit `true` if this should be emitted when exiting the node rather than when entering - * @property {object} parsedSelector An object (from esquery) describing the matching behavior of the selector - * @property {string[]|null} listenerTypes A list of node types that could possibly cause the selector to match, - * or `null` if all node types could cause a match - * @property {number} attributeCount The total number of classes, pseudo-classes, and attribute queries in this selector - * @property {number} identifierCount The total number of identifier queries in this selector - */ - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -/** - * Gets the possible types of a selector - * - * @param {object} parsedSelector An object (from esquery) describing the matching behavior of the selector - * @returns {string[]|null} The node types that could possibly trigger this selector, or `null` if all node types could trigger it - */ -function getPossibleTypes(parsedSelector) { - switch (parsedSelector.type) { - case 'identifier': { - return [parsedSelector.value]; - } - - case 'matches': { - const typesForComponents = parsedSelector.selectors.map(getPossibleTypes); - - if (typesForComponents.every(Boolean)) { - return lodash.union(...typesForComponents); - } - - return null; - } - - case 'compound': { - const typesForComponents = parsedSelector.selectors - .map(getPossibleTypes) - .filter(Boolean); - - // If all of the components could match any type, then the compound could also match any type. - if (typesForComponents.length === 0) { - return null; - } - - /* - * If at least one of the components could only match a particular type, the compound could only match - * the intersection of those types. - */ - return lodash.intersection(...typesForComponents); - } - - case 'child': - case 'descendant': - case 'sibling': - case 'adjacent': { - return getPossibleTypes(parsedSelector.right); - } - - default: { - return null; - } - } -} - -/** - * Counts the number of class, pseudo-class, and attribute queries in this selector - * - * @param {object} parsedSelector An object (from esquery) describing the selector's matching behavior - * @returns {number} The number of class, pseudo-class, and attribute queries in this selector - */ -function countClassAttributes(parsedSelector) { - switch (parsedSelector.type) { - case 'child': - case 'descendant': - case 'sibling': - case 'adjacent': { - return ( - countClassAttributes(parsedSelector.left) + - countClassAttributes(parsedSelector.right) - ); - } - - case 'compound': - case 'not': - case 'matches': { - return parsedSelector.selectors.reduce( - (sum, childSelector) => sum + countClassAttributes(childSelector), - 0, - ); - } - - case 'attribute': - case 'field': - case 'nth-child': - case 'nth-last-child': { - return 1; - } - - default: { - return 0; - } - } -} - -/** - * Counts the number of identifier queries in this selector - * - * @param {object} parsedSelector An object (from esquery) describing the selector's matching behavior - * @returns {number} The number of identifier queries - */ -function countIdentifiers(parsedSelector) { - switch (parsedSelector.type) { - case 'child': - case 'descendant': - case 'sibling': - case 'adjacent': { - return ( - countIdentifiers(parsedSelector.left) + - countIdentifiers(parsedSelector.right) - ); - } - - case 'compound': - case 'not': - case 'matches': { - return parsedSelector.selectors.reduce( - (sum, childSelector) => sum + countIdentifiers(childSelector), - 0, - ); - } - - case 'identifier': { - return 1; - } - - default: { - return 0; - } - } -} - -/** - * Compares the specificity of two selector objects, with CSS-like rules. - * - * @param {ASTSelector} selectorA An AST selector descriptor - * @param {ASTSelector} selectorB Another AST selector descriptor - * @returns {number} - * a value less than 0 if selectorA is less specific than selectorB - * a value greater than 0 if selectorA is more specific than selectorB - * a value less than 0 if selectorA and selectorB have the same specificity, and selectorA <= selectorB alphabetically - * a value greater than 0 if selectorA and selectorB have the same specificity, and selectorA > selectorB alphabetically - */ -function compareSpecificity(selectorA, selectorB) { - return ( - selectorA.attributeCount - selectorB.attributeCount || - selectorA.identifierCount - selectorB.identifierCount || - (selectorA.rawSelector <= selectorB.rawSelector ? -1 : 1) - ); -} - -/** - * Parses a raw selector string, and throws a useful error if parsing fails. - * - * @param {string} rawSelector A raw AST selector - * @returns {object} An object (from esquery) describing the matching behavior of this selector - * @throws {Error} An error if the selector is invalid - */ -function tryParseSelector(rawSelector) { - try { - return esquery.parse(rawSelector.replace(/:exit$/u, '')); - } catch (error) { - if ( - error.location && - error.location.start && - typeof error.location.start.offset === 'number' - ) { - throw new SyntaxError( - `Syntax error in selector "${rawSelector}" at position ${error.location.start.offset}: ${error.message}`, - ); - } - - throw error; - } -} - -/** - * Parses a raw selector string, and returns the parsed selector along with specificity and type information. - * - * @param {string} rawSelector A raw AST selector - * @returns {ASTSelector} A selector descriptor - */ -const parseSelector = lodash.memoize((rawSelector) => { - const parsedSelector = tryParseSelector(rawSelector); - - return { - rawSelector, - isExit: rawSelector.endsWith(':exit'), - parsedSelector, - listenerTypes: getPossibleTypes(parsedSelector), - attributeCount: countClassAttributes(parsedSelector), - identifierCount: countIdentifiers(parsedSelector), - }; -}); - -// ------------------------------------------------------------------------------ -// Public Interface -// ------------------------------------------------------------------------------ - -/** - * The event generator for AST nodes. - * This implements below interface. - * - * ```ts - * interface EventGenerator { - * emitter: SafeEmitter; - * enterNode(node: ASTNode): void; - * leaveNode(node: ASTNode): void; - * } - * ``` - */ -class NodeEventGenerator { - /** - * @param {SafeEmitter} emitter - * An SafeEmitter which is the destination of events. This emitter must already - * have registered listeners for all of the events that it needs to listen for. - * (See lib/linter/safe-emitter.js for more details on `SafeEmitter`.) - * @returns {NodeEventGenerator} new instance - */ - constructor(emitter) { - this.emitter = emitter; - this.currentAncestry = []; - this.enterSelectorsByNodeType = new Map(); - this.exitSelectorsByNodeType = new Map(); - this.anyTypeEnterSelectors = []; - this.anyTypeExitSelectors = []; - - for (const rawSelector of emitter.eventNames()) { - const selector = parseSelector(rawSelector); - - if (selector.listenerTypes) { - const typeMap = selector.isExit - ? this.exitSelectorsByNodeType - : this.enterSelectorsByNodeType; - - for (const nodeType of selector.listenerTypes) { - if (!typeMap.has(nodeType)) { - typeMap.set(nodeType, []); - } - - typeMap.get(nodeType).push(selector); - } - - continue; - } - - const selectors = selector.isExit - ? this.anyTypeExitSelectors - : this.anyTypeEnterSelectors; - - selectors.push(selector); - } - - this.anyTypeEnterSelectors.sort(compareSpecificity); - this.anyTypeExitSelectors.sort(compareSpecificity); - for (const selectorList of this.enterSelectorsByNodeType) - selectorList.sort(compareSpecificity); - for (const selectorList of this.exitSelectorsByNodeType) - selectorList.sort(compareSpecificity); - } - - /** - * Checks a selector against a node, and emits it if it matches - * - * @param {ASTNode} node The node to check - * @param {ASTSelector} selector An AST selector descriptor - * @returns {void} - */ - applySelector(node, selector) { - if (esquery.matches(node, selector.parsedSelector, this.currentAncestry)) { - this.emitter.emit(selector.rawSelector, node); - } - } - - /** - * Applies all appropriate selectors to a node, in specificity order - * - * @param {ASTNode} node The node to check - * @param {boolean} isExit `false` if the node is currently being entered, `true` if it's currently being exited - * @returns {void} - */ - applySelectors(node, isExit) { - const selectorsByNodeType = - (isExit - ? this.exitSelectorsByNodeType - : this.enterSelectorsByNodeType - ).get(node.type) || []; - const anyTypeSelectors = isExit - ? this.anyTypeExitSelectors - : this.anyTypeEnterSelectors; - - /* - * SelectorsByNodeType and anyTypeSelectors were already sorted by specificity in the constructor. - * Iterate through each of them, applying selectors in the right order. - */ - let selectorsByTypeIndex = 0; - let anyTypeSelectorsIndex = 0; - - while ( - selectorsByTypeIndex < selectorsByNodeType.length || - anyTypeSelectorsIndex < anyTypeSelectors.length - ) { - if ( - selectorsByTypeIndex >= selectorsByNodeType.length || - (anyTypeSelectorsIndex < anyTypeSelectors.length && - compareSpecificity( - anyTypeSelectors[anyTypeSelectorsIndex], - selectorsByNodeType[selectorsByTypeIndex], - ) < 0) - ) { - this.applySelector(node, anyTypeSelectors[anyTypeSelectorsIndex++]); - } else { - this.applySelector(node, selectorsByNodeType[selectorsByTypeIndex++]); - } - } - } - - /** - * Emits an event of entering AST node. - * - * @param {ASTNode} node A node which was entered. - * @returns {void} - */ - enterNode(node) { - if (node.parent) { - this.currentAncestry.unshift(node.parent); - } - - this.applySelectors(node, false); - } - - /** - * Emits an event of leaving AST node. - * - * @param {ASTNode} node A node which was left. - * @returns {void} - */ - leaveNode(node) { - this.applySelectors(node, true); - this.currentAncestry.shift(); - } -} - -module.exports = NodeEventGenerator; diff --git a/fixtures/eslint/lib/rules/keyword-spacing.js b/fixtures/eslint/lib/rules/keyword-spacing.js deleted file mode 100644 index 67f721a9..00000000 --- a/fixtures/eslint/lib/rules/keyword-spacing.js +++ /dev/null @@ -1,608 +0,0 @@ -/** - * @file Rule to enforce spacing before and after keywords. - * @author Toru Nagashima - */ - -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const astUtils = require('./utils/ast-utils'); -const keywords = require('./utils/keywords'); - -// ------------------------------------------------------------------------------ -// Constants -// ------------------------------------------------------------------------------ - -const PREV_TOKEN = /^[)\]}>]$/u; -const NEXT_TOKEN = /^(?:[([{<~!]|\+\+?|--?)$/u; -const PREV_TOKEN_M = /^[)\]}>*]$/u; -const NEXT_TOKEN_M = /^[{*]$/u; -const TEMPLATE_OPEN_PAREN = /\$\{$/u; -const TEMPLATE_CLOSE_PAREN = /^\}/u; -const CHECK_TYPE = /^(?:JSXElement|RegularExpression|String|Template)$/u; -const KEYS = [ - ...keywords, - 'as', - 'async', - 'await', - 'from', - 'get', - 'let', - 'of', - 'set', - 'yield', -]; - -// Check duplications. -(function () { - KEYS.sort(); - for (let i = 1; i < KEYS.length; ++i) { - if (KEYS[i] === KEYS[i - 1]) { - throw new Error(`Duplication was found in the keyword list: ${KEYS[i]}`); - } - } -})(); - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -/** - * Checks whether or not a given token is a "Template" token ends with "${". - * - * @param {Token} token A token to check. - * @returns {boolean} `true` if the token is a "Template" token ends with "${". - */ -function isOpenParenOfTemplate(token) { - return token.type === 'Template' && TEMPLATE_OPEN_PAREN.test(token.value); -} - -/** - * Checks whether or not a given token is a "Template" token starts with "}". - * - * @param {Token} token A token to check. - * @returns {boolean} `true` if the token is a "Template" token starts with "}". - */ -function isCloseParenOfTemplate(token) { - return token.type === 'Template' && TEMPLATE_CLOSE_PAREN.test(token.value); -} - -// ------------------------------------------------------------------------------ -// Rule Definition -// ------------------------------------------------------------------------------ - -module.exports = { - meta: { - type: 'layout', - - docs: { - description: 'enforce consistent spacing before and after keywords', - category: 'Stylistic Issues', - recommended: false, - url: 'https://eslint.org/docs/rules/keyword-spacing', - }, - - fixable: 'whitespace', - - schema: [ - { - type: 'object', - properties: { - before: { type: 'boolean', default: true }, - after: { type: 'boolean', default: true }, - overrides: { - type: 'object', - properties: Object.fromEntries( - KEYS.map((key) => [ - key, - { - type: 'object', - properties: { - before: { type: 'boolean' }, - after: { type: 'boolean' }, - }, - additionalProperties: false, - }, - ]), - ), - additionalProperties: false, - }, - }, - additionalProperties: false, - }, - ], - messages: { - expectedBefore: 'Expected space(s) before "{{value}}".', - expectedAfter: 'Expected space(s) after "{{value}}".', - unexpectedBefore: 'Unexpected space(s) before "{{value}}".', - unexpectedAfter: 'Unexpected space(s) after "{{value}}".', - }, - }, - - create(context) { - const sourceCode = context.getSourceCode(); - - /** - * Reports a given token if there are not space(s) before the token. - * - * @param {Token} token A token to report. - * @param {RegExp} pattern A pattern of the previous token to check. - * @returns {void} - */ - function expectSpaceBefore(token, pattern) { - const prevToken = sourceCode.getTokenBefore(token); - - if ( - prevToken && - (CHECK_TYPE.test(prevToken.type) || pattern.test(prevToken.value)) && - !isOpenParenOfTemplate(prevToken) && - astUtils.isTokenOnSameLine(prevToken, token) && - !sourceCode.isSpaceBetweenTokens(prevToken, token) - ) { - context.report({ - loc: token.loc.start, - messageId: 'expectedBefore', - data: token, - fix(fixer) { - return fixer.insertTextBefore(token, ' '); - }, - }); - } - } - - /** - * Reports a given token if there are space(s) before the token. - * - * @param {Token} token A token to report. - * @param {RegExp} pattern A pattern of the previous token to check. - * @returns {void} - */ - function unexpectSpaceBefore(token, pattern) { - const prevToken = sourceCode.getTokenBefore(token); - - if ( - prevToken && - (CHECK_TYPE.test(prevToken.type) || pattern.test(prevToken.value)) && - !isOpenParenOfTemplate(prevToken) && - astUtils.isTokenOnSameLine(prevToken, token) && - sourceCode.isSpaceBetweenTokens(prevToken, token) - ) { - context.report({ - loc: token.loc.start, - messageId: 'unexpectedBefore', - data: token, - fix(fixer) { - return fixer.removeRange([prevToken.range[1], token.range[0]]); - }, - }); - } - } - - /** - * Reports a given token if there are not space(s) after the token. - * - * @param {Token} token A token to report. - * @param {RegExp} pattern A pattern of the next token to check. - * @returns {void} - */ - function expectSpaceAfter(token, pattern) { - const nextToken = sourceCode.getTokenAfter(token); - - if ( - nextToken && - (CHECK_TYPE.test(nextToken.type) || pattern.test(nextToken.value)) && - !isCloseParenOfTemplate(nextToken) && - astUtils.isTokenOnSameLine(token, nextToken) && - !sourceCode.isSpaceBetweenTokens(token, nextToken) - ) { - context.report({ - loc: token.loc.start, - messageId: 'expectedAfter', - data: token, - fix(fixer) { - return fixer.insertTextAfter(token, ' '); - }, - }); - } - } - - /** - * Reports a given token if there are space(s) after the token. - * - * @param {Token} token A token to report. - * @param {RegExp} pattern A pattern of the next token to check. - * @returns {void} - */ - function unexpectSpaceAfter(token, pattern) { - const nextToken = sourceCode.getTokenAfter(token); - - if ( - nextToken && - (CHECK_TYPE.test(nextToken.type) || pattern.test(nextToken.value)) && - !isCloseParenOfTemplate(nextToken) && - astUtils.isTokenOnSameLine(token, nextToken) && - sourceCode.isSpaceBetweenTokens(token, nextToken) - ) { - context.report({ - loc: token.loc.start, - messageId: 'unexpectedAfter', - data: token, - fix(fixer) { - return fixer.removeRange([token.range[1], nextToken.range[0]]); - }, - }); - } - } - - /** - * Parses the option object and determines check methods for each keyword. - * - * @param {object|undefined} options The option object to parse. - * @returns {object} - Normalized option object. - * Keys are keywords (there are for every keyword). - * Values are instances of `{"before": function, "after": function}`. - */ - function parseOptions(options = {}) { - const before = options.before !== false; - const after = options.after !== false; - const defaultValue = { - before: before ? expectSpaceBefore : unexpectSpaceBefore, - after: after ? expectSpaceAfter : unexpectSpaceAfter, - }; - const overrides = (options && options.overrides) || {}; - const retv = Object.create(null); - - for (const key of KEYS) { - const override = overrides[key]; - - if (override) { - const thisBefore = 'before' in override ? override.before : before; - const thisAfter = 'after' in override ? override.after : after; - - retv[key] = { - before: thisBefore ? expectSpaceBefore : unexpectSpaceBefore, - after: thisAfter ? expectSpaceAfter : unexpectSpaceAfter, - }; - } else { - retv[key] = defaultValue; - } - } - - return retv; - } - - const checkMethodMap = parseOptions(context.options[0]); - - /** - * Reports a given token if usage of spacing followed by the token is - * invalid. - * - * @param {Token} token A token to report. - * @param {RegExp} [pattern] Optional. A pattern of the previous - * token to check. - * @returns {void} - */ - function checkSpacingBefore(token, pattern) { - checkMethodMap[token.value].before(token, pattern || PREV_TOKEN); - } - - /** - * Reports a given token if usage of spacing preceded by the token is - * invalid. - * - * @param {Token} token A token to report. - * @param {RegExp} [pattern] Optional. A pattern of the next - * token to check. - * @returns {void} - */ - function checkSpacingAfter(token, pattern) { - checkMethodMap[token.value].after(token, pattern || NEXT_TOKEN); - } - - /** - * Reports a given token if usage of spacing around the token is invalid. - * - * @param {Token} token A token to report. - * @returns {void} - */ - function checkSpacingAround(token) { - checkSpacingBefore(token); - checkSpacingAfter(token); - } - - /** - * Reports the first token of a given node if the first token is a keyword - * and usage of spacing around the token is invalid. - * - * @param {ASTNode|null} node A node to report. - * @returns {void} - */ - function checkSpacingAroundFirstToken(node) { - const firstToken = node && sourceCode.getFirstToken(node); - - if (firstToken && firstToken.type === 'Keyword') { - checkSpacingAround(firstToken); - } - } - - /** - * Reports the first token of a given node if the first token is a keyword - * and usage of spacing followed by the token is invalid. - * - * This is used for unary operators (e.g. `typeof`), `function`, and `super`. - * Other rules are handling usage of spacing preceded by those keywords. - * - * @param {ASTNode|null} node A node to report. - * @returns {void} - */ - function checkSpacingBeforeFirstToken(node) { - const firstToken = node && sourceCode.getFirstToken(node); - - if (firstToken && firstToken.type === 'Keyword') { - checkSpacingBefore(firstToken); - } - } - - /** - * Reports the previous token of a given node if the token is a keyword and - * usage of spacing around the token is invalid. - * - * @param {ASTNode|null} node A node to report. - * @returns {void} - */ - function checkSpacingAroundTokenBefore(node) { - if (node) { - const token = sourceCode.getTokenBefore(node, astUtils.isKeywordToken); - - checkSpacingAround(token); - } - } - - /** - * Reports `async` or `function` keywords of a given node if usage of - * spacing around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForFunction(node) { - const firstToken = node && sourceCode.getFirstToken(node); - - if ( - firstToken && - ((firstToken.type === 'Keyword' && firstToken.value === 'function') || - firstToken.value === 'async') - ) { - checkSpacingBefore(firstToken); - } - } - - /** - * Reports `class` and `extends` keywords of a given node if usage of - * spacing around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForClass(node) { - checkSpacingAroundFirstToken(node); - checkSpacingAroundTokenBefore(node.superClass); - } - - /** - * Reports `if` and `else` keywords of a given node if usage of spacing - * around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForIfStatement(node) { - checkSpacingAroundFirstToken(node); - checkSpacingAroundTokenBefore(node.alternate); - } - - /** - * Reports `try`, `catch`, and `finally` keywords of a given node if usage - * of spacing around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForTryStatement(node) { - checkSpacingAroundFirstToken(node); - checkSpacingAroundFirstToken(node.handler); - checkSpacingAroundTokenBefore(node.finalizer); - } - - /** - * Reports `do` and `while` keywords of a given node if usage of spacing - * around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForDoWhileStatement(node) { - checkSpacingAroundFirstToken(node); - checkSpacingAroundTokenBefore(node.test); - } - - /** - * Reports `for` and `in` keywords of a given node if usage of spacing - * around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForForInStatement(node) { - checkSpacingAroundFirstToken(node); - checkSpacingAroundTokenBefore(node.right); - } - - /** - * Reports `for` and `of` keywords of a given node if usage of spacing - * around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForForOfStatement(node) { - if (node.await) { - checkSpacingBefore(sourceCode.getFirstToken(node, 0)); - checkSpacingAfter(sourceCode.getFirstToken(node, 1)); - } else { - checkSpacingAroundFirstToken(node); - } - - checkSpacingAround( - sourceCode.getTokenBefore(node.right, astUtils.isNotOpeningParenToken), - ); - } - - /** - * Reports `import`, `export`, `as`, and `from` keywords of a given node if - * usage of spacing around those keywords is invalid. - * - * This rule handles the `*` token in module declarations. - * - * import*as A from "./a"; /*error Expected space(s) after "import". - * error Expected space(s) before "as". - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForModuleDeclaration(node) { - const firstToken = sourceCode.getFirstToken(node); - - checkSpacingBefore(firstToken, PREV_TOKEN_M); - checkSpacingAfter(firstToken, NEXT_TOKEN_M); - - if (node.type === 'ExportDefaultDeclaration') { - checkSpacingAround(sourceCode.getTokenAfter(firstToken)); - } - - if (node.source) { - const fromToken = sourceCode.getTokenBefore(node.source); - - checkSpacingBefore(fromToken, PREV_TOKEN_M); - checkSpacingAfter(fromToken, NEXT_TOKEN_M); - } - } - - /** - * Reports `as` keyword of a given node if usage of spacing around this - * keyword is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForImportNamespaceSpecifier(node) { - const asToken = sourceCode.getFirstToken(node, 1); - - checkSpacingBefore(asToken, PREV_TOKEN_M); - } - - /** - * Reports `static`, `get`, and `set` keywords of a given node if usage of - * spacing around those keywords is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForProperty(node) { - if (node.static) { - checkSpacingAroundFirstToken(node); - } - - if ( - node.kind === 'get' || - node.kind === 'set' || - ((node.method || node.type === 'MethodDefinition') && node.value.async) - ) { - const token = sourceCode.getTokenBefore(node.key, (tok) => { - switch (tok.value) { - case 'get': - case 'set': - case 'async': { - return true; - } - default: { - return false; - } - } - }); - - if (!token) { - throw new Error( - 'Failed to find token get, set, or async beside method name', - ); - } - - checkSpacingAround(token); - } - } - - /** - * Reports `await` keyword of a given node if usage of spacing before - * this keyword is invalid. - * - * @param {ASTNode} node A node to report. - * @returns {void} - */ - function checkSpacingForAwaitExpression(node) { - checkSpacingBefore(sourceCode.getFirstToken(node)); - } - - return { - // Statements - DebuggerStatement: checkSpacingAroundFirstToken, - WithStatement: checkSpacingAroundFirstToken, - - // Statements - Control flow - BreakStatement: checkSpacingAroundFirstToken, - ContinueStatement: checkSpacingAroundFirstToken, - ReturnStatement: checkSpacingAroundFirstToken, - ThrowStatement: checkSpacingAroundFirstToken, - TryStatement: checkSpacingForTryStatement, - - // Statements - Choice - IfStatement: checkSpacingForIfStatement, - SwitchStatement: checkSpacingAroundFirstToken, - SwitchCase: checkSpacingAroundFirstToken, - - // Statements - Loops - DoWhileStatement: checkSpacingForDoWhileStatement, - ForInStatement: checkSpacingForForInStatement, - ForOfStatement: checkSpacingForForOfStatement, - ForStatement: checkSpacingAroundFirstToken, - WhileStatement: checkSpacingAroundFirstToken, - - // Statements - Declarations - ClassDeclaration: checkSpacingForClass, - ExportNamedDeclaration: checkSpacingForModuleDeclaration, - ExportDefaultDeclaration: checkSpacingForModuleDeclaration, - ExportAllDeclaration: checkSpacingForModuleDeclaration, - FunctionDeclaration: checkSpacingForFunction, - ImportDeclaration: checkSpacingForModuleDeclaration, - VariableDeclaration: checkSpacingAroundFirstToken, - - // Expressions - ArrowFunctionExpression: checkSpacingForFunction, - AwaitExpression: checkSpacingForAwaitExpression, - ClassExpression: checkSpacingForClass, - FunctionExpression: checkSpacingForFunction, - NewExpression: checkSpacingBeforeFirstToken, - Super: checkSpacingBeforeFirstToken, - ThisExpression: checkSpacingBeforeFirstToken, - UnaryExpression: checkSpacingBeforeFirstToken, - YieldExpression: checkSpacingBeforeFirstToken, - - // Others - ImportNamespaceSpecifier: checkSpacingForImportNamespaceSpecifier, - MethodDefinition: checkSpacingForProperty, - Property: checkSpacingForProperty, - }; - }, -}; diff --git a/fixtures/eslint/lib/rules/padding-line-between-statements.js b/fixtures/eslint/lib/rules/padding-line-between-statements.js deleted file mode 100644 index 5525418b..00000000 --- a/fixtures/eslint/lib/rules/padding-line-between-statements.js +++ /dev/null @@ -1,655 +0,0 @@ -/** - * @file Rule to require or disallow newlines between statements - * @author Toru Nagashima - */ - -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const astUtils = require('./utils/ast-utils'); - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -const LT = `[${[...astUtils.LINEBREAKS].join('')}]`; -const PADDING_LINE_SEQUENCE = new RegExp( - String.raw`^(\s*?${LT})\s*${LT}(\s*;?)$`, - 'u', -); -const CJS_EXPORT = /^(?:module\s*\.\s*)?exports(?:\s*\.|\s*\[|$)/u; -const CJS_IMPORT = /^require\(/u; - -/** - * Creates tester which check if a node starts with specific keyword. - * - * @param {string} keyword The keyword to test. - * @returns {object} the created tester. - * @private - */ -function newKeywordTester(keyword) { - return { - test: (node, sourceCode) => - sourceCode.getFirstToken(node).value === keyword, - }; -} - -/** - * Creates tester which check if a node starts with specific keyword and spans a single line. - * - * @param {string} keyword The keyword to test. - * @returns {object} the created tester. - * @private - */ -function newSinglelineKeywordTester(keyword) { - return { - test: (node, sourceCode) => - node.loc.start.line === node.loc.end.line && - sourceCode.getFirstToken(node).value === keyword, - }; -} - -/** - * Creates tester which check if a node starts with specific keyword and spans multiple lines. - * - * @param {string} keyword The keyword to test. - * @returns {object} the created tester. - * @private - */ -function newMultilineKeywordTester(keyword) { - return { - test: (node, sourceCode) => - node.loc.start.line !== node.loc.end.line && - sourceCode.getFirstToken(node).value === keyword, - }; -} - -/** - * Creates tester which check if a node is specific type. - * - * @param {string} type The node type to test. - * @returns {object} the created tester. - * @private - */ -function newNodeTypeTester(type) { - return { - test: (node) => node.type === type, - }; -} - -/** - * Checks the given node is an expression statement of IIFE. - * - * @param {ASTNode} node The node to check. - * @returns {boolean} `true` if the node is an expression statement of IIFE. - * @private - */ -function isIIFEStatement(node) { - if (node.type === 'ExpressionStatement') { - let call = node.expression; - - if (call.type === 'UnaryExpression') { - call = call.argument; - } - - return call.type === 'CallExpression' && astUtils.isFunction(call.callee); - } - - return false; -} - -/** - * Checks whether the given node is a block-like statement. - * This checks the last token of the node is the closing brace of a block. - * - * @param {SourceCode} sourceCode The source code to get tokens. - * @param {ASTNode} node The node to check. - * @returns {boolean} `true` if the node is a block-like statement. - * @private - */ -function isBlockLikeStatement(sourceCode, node) { - // Do-while with a block is a block-like statement. - if (node.type === 'DoWhileStatement' && node.body.type === 'BlockStatement') { - return true; - } - - /* - * IIFE is a block-like statement specially from - * JSCS#disallowPaddingNewLinesAfterBlocks. - */ - if (isIIFEStatement(node)) { - return true; - } - - // Checks the last token is a closing brace of blocks. - const lastToken = sourceCode.getLastToken(node, astUtils.isNotSemicolonToken); - const belongingNode = - lastToken && astUtils.isClosingBraceToken(lastToken) - ? sourceCode.getNodeByRangeIndex(lastToken.range[0]) - : null; - - return ( - Boolean(belongingNode) && - (belongingNode.type === 'BlockStatement' || - belongingNode.type === 'SwitchStatement') - ); -} - -/** - * Check whether the given node is a directive or not. - * - * @param {ASTNode} node The node to check. - * @param {SourceCode} sourceCode The source code object to get tokens. - * @returns {boolean} `true` if the node is a directive. - */ -function isDirective(node, sourceCode) { - return ( - node.type === 'ExpressionStatement' && - (node.parent.type === 'Program' || - (node.parent.type === 'BlockStatement' && - astUtils.isFunction(node.parent.parent))) && - node.expression.type === 'Literal' && - typeof node.expression.value === 'string' && - !astUtils.isParenthesised(sourceCode, node.expression) - ); -} - -/** - * Check whether the given node is a part of directive prologue or not. - * - * @param {ASTNode} node The node to check. - * @param {SourceCode} sourceCode The source code object to get tokens. - * @returns {boolean} `true` if the node is a part of directive prologue. - */ -function isDirectivePrologue(node, sourceCode) { - if (isDirective(node, sourceCode)) { - for (const sibling of node.parent.body) { - if (sibling === node) { - break; - } - - if (!isDirective(sibling, sourceCode)) { - return false; - } - } - - return true; - } - - return false; -} - -/** - * Gets the actual last token. - * - * If a semicolon is semicolon-less style's semicolon, this ignores it. - * For example: - * - * foo() - * ;[1, 2, 3].forEach(bar) - * - * @param {SourceCode} sourceCode The source code to get tokens. - * @param {ASTNode} node The node to get. - * @returns {Token} The actual last token. - * @private - */ -function getActualLastToken(sourceCode, node) { - const semiToken = sourceCode.getLastToken(node); - const prevToken = sourceCode.getTokenBefore(semiToken); - const nextToken = sourceCode.getTokenAfter(semiToken); - const isSemicolonLessStyle = Boolean( - prevToken && - nextToken && - prevToken.range[0] >= node.range[0] && - astUtils.isSemicolonToken(semiToken) && - semiToken.loc.start.line !== prevToken.loc.end.line && - semiToken.loc.end.line === nextToken.loc.start.line, - ); - - return isSemicolonLessStyle ? prevToken : semiToken; -} - -/** - * This returns the concatenation of the first 2 captured strings. - * - * @param {string} _ Unused. Whole matched string. - * @param {string} trailingSpaces The trailing spaces of the first line. - * @param {string} indentSpaces The indentation spaces of the last line. - * @returns {string} The concatenation of trailingSpaces and indentSpaces. - * @private - */ -function replacerToRemovePaddingLines(_, trailingSpaces, indentSpaces) { - return trailingSpaces + indentSpaces; -} - -/** - * Check and report statements for `any` configuration. - * It does nothing. - * - * @returns {void} - * @private - */ -function verifyForAny() {} - -/** - * Check and report statements for `never` configuration. - * This autofix removes blank lines between the given 2 statements. - * However, if comments exist between 2 blank lines, it does not remove those - * blank lines automatically. - * - * @param {RuleContext} context The rule context to report. - * @param {ASTNode} _ Unused. The previous node to check. - * @param {ASTNode} nextNode The next node to check. - * @param {Array} paddingLines The array of token pairs that blank - * lines exist between the pair. - * @returns {void} - * @private - */ -function verifyForNever(context, _, nextNode, paddingLines) { - if (paddingLines.length === 0) { - return; - } - - context.report({ - node: nextNode, - messageId: 'unexpectedBlankLine', - fix(fixer) { - if (paddingLines.length >= 2) { - return null; - } - - const prevToken = paddingLines[0][0]; - const nextToken = paddingLines[0][1]; - const start = prevToken.range[1]; - const end = nextToken.range[0]; - const text = context - .getSourceCode() - .text.slice(start, end) - .replace(PADDING_LINE_SEQUENCE, replacerToRemovePaddingLines); - - return fixer.replaceTextRange([start, end], text); - }, - }); -} - -/** - * Check and report statements for `always` configuration. - * This autofix inserts a blank line between the given 2 statements. - * If the `prevNode` has trailing comments, it inserts a blank line after the - * trailing comments. - * - * @param {RuleContext} context The rule context to report. - * @param {ASTNode} prevNode The previous node to check. - * @param {ASTNode} nextNode The next node to check. - * @param {Array} paddingLines The array of token pairs that blank - * lines exist between the pair. - * @returns {void} - * @private - */ -function verifyForAlways(context, prevNode, nextNode, paddingLines) { - if (paddingLines.length > 0) { - return; - } - - context.report({ - node: nextNode, - messageId: 'expectedBlankLine', - fix(fixer) { - const sourceCode = context.getSourceCode(); - let prevToken = getActualLastToken(sourceCode, prevNode); - const nextToken = - sourceCode.getFirstTokenBetween(prevToken, nextNode, { - includeComments: true, - - /** - * Skip the trailing comments of the previous node. - * This inserts a blank line after the last trailing comment. - * - * For example: - * - * foo(); // trailing comment. - * // comment. - * bar(); - * - * Get fixed to: - * - * foo(); // trailing comment. - * - * // comment. - * bar(); - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is not a trailing comment. - * @private - */ - filter(token) { - if (astUtils.isTokenOnSameLine(prevToken, token)) { - prevToken = token; - return false; - } - - return true; - }, - }) || nextNode; - const insertText = astUtils.isTokenOnSameLine(prevToken, nextToken) - ? '\n\n' - : '\n'; - - return fixer.insertTextAfter(prevToken, insertText); - }, - }); -} - -/** - * Types of blank lines. - * `any`, `never`, and `always` are defined. - * Those have `verify` method to check and report statements. - * - * @private - */ -const PaddingTypes = { - any: { verify: verifyForAny }, - never: { verify: verifyForNever }, - always: { verify: verifyForAlways }, -}; - -/** - * Types of statements. - * Those have `test` method to check it matches to the given statement. - * - * @private - */ -const StatementTypes = { - '*': { test: () => true }, - 'block-like': { - test: (node, sourceCode) => isBlockLikeStatement(sourceCode, node), - }, - 'cjs-export': { - test: (node, sourceCode) => - node.type === 'ExpressionStatement' && - node.expression.type === 'AssignmentExpression' && - CJS_EXPORT.test(sourceCode.getText(node.expression.left)), - }, - 'cjs-import': { - test: (node, sourceCode) => - node.type === 'VariableDeclaration' && - node.declarations.length > 0 && - Boolean(node.declarations[0].init) && - CJS_IMPORT.test(sourceCode.getText(node.declarations[0].init)), - }, - directive: { - test: isDirectivePrologue, - }, - expression: { - test: (node, sourceCode) => - node.type === 'ExpressionStatement' && - !isDirectivePrologue(node, sourceCode), - }, - iife: { - test: isIIFEStatement, - }, - 'multiline-block-like': { - test: (node, sourceCode) => - node.loc.start.line !== node.loc.end.line && - isBlockLikeStatement(sourceCode, node), - }, - 'multiline-expression': { - test: (node, sourceCode) => - node.loc.start.line !== node.loc.end.line && - node.type === 'ExpressionStatement' && - !isDirectivePrologue(node, sourceCode), - }, - - 'multiline-const': newMultilineKeywordTester('const'), - 'multiline-let': newMultilineKeywordTester('let'), - 'multiline-var': newMultilineKeywordTester('var'), - 'singleline-const': newSinglelineKeywordTester('const'), - 'singleline-let': newSinglelineKeywordTester('let'), - 'singleline-var': newSinglelineKeywordTester('var'), - - block: newNodeTypeTester('BlockStatement'), - empty: newNodeTypeTester('EmptyStatement'), - function: newNodeTypeTester('FunctionDeclaration'), - - break: newKeywordTester('break'), - case: newKeywordTester('case'), - class: newKeywordTester('class'), - const: newKeywordTester('const'), - continue: newKeywordTester('continue'), - debugger: newKeywordTester('debugger'), - default: newKeywordTester('default'), - do: newKeywordTester('do'), - export: newKeywordTester('export'), - for: newKeywordTester('for'), - if: newKeywordTester('if'), - import: newKeywordTester('import'), - let: newKeywordTester('let'), - return: newKeywordTester('return'), - switch: newKeywordTester('switch'), - throw: newKeywordTester('throw'), - try: newKeywordTester('try'), - var: newKeywordTester('var'), - while: newKeywordTester('while'), - with: newKeywordTester('with'), -}; - -// ------------------------------------------------------------------------------ -// Rule Definition -// ------------------------------------------------------------------------------ - -module.exports = { - meta: { - type: 'layout', - - docs: { - description: 'require or disallow padding lines between statements', - category: 'Stylistic Issues', - recommended: false, - url: 'https://eslint.org/docs/rules/padding-line-between-statements', - }, - - fixable: 'whitespace', - - schema: { - definitions: { - paddingType: { - enum: Object.keys(PaddingTypes), - }, - statementType: { - anyOf: [ - { enum: Object.keys(StatementTypes) }, - { - type: 'array', - items: { enum: Object.keys(StatementTypes) }, - minItems: 1, - uniqueItems: true, - additionalItems: false, - }, - ], - }, - }, - type: 'array', - items: { - type: 'object', - properties: { - blankLine: { $ref: '#/definitions/paddingType' }, - prev: { $ref: '#/definitions/statementType' }, - next: { $ref: '#/definitions/statementType' }, - }, - additionalProperties: false, - required: ['blankLine', 'prev', 'next'], - }, - additionalItems: false, - }, - - messages: { - unexpectedBlankLine: 'Unexpected blank line before this statement.', - expectedBlankLine: 'Expected blank line before this statement.', - }, - }, - - create(context) { - const sourceCode = context.getSourceCode(); - const configureList = context.options || []; - let scopeInfo = null; - - /** - * Processes to enter to new scope. - * This manages the current previous statement. - * - * @returns {void} - * @private - */ - function enterScope() { - scopeInfo = { - upper: scopeInfo, - prevNode: null, - }; - } - - /** - * Processes to exit from the current scope. - * - * @returns {void} - * @private - */ - function exitScope() { - scopeInfo = scopeInfo.upper; - } - - /** - * Checks whether the given node matches the given type. - * - * @param {ASTNode} node The statement node to check. - * @param {string|string[]} type The statement type to check. - * @returns {boolean} `true` if the statement node matched the type. - * @private - */ - function match(node, type) { - let innerStatementNode = node; - - while (innerStatementNode.type === 'LabeledStatement') { - innerStatementNode = innerStatementNode.body; - } - - if (Array.isArray(type)) { - return type.some(match.bind(null, innerStatementNode)); - } - - return StatementTypes[type].test(innerStatementNode, sourceCode); - } - - /** - * Finds the last matched configure from configureList. - * - * @param {ASTNode} prevNode The previous statement to match. - * @param {ASTNode} nextNode The current statement to match. - * @returns {object} The tester of the last matched configure. - * @private - */ - function getPaddingType(prevNode, nextNode) { - for (let i = configureList.length - 1; i >= 0; --i) { - const configure = configureList[i]; - const matched = - match(prevNode, configure.prev) && match(nextNode, configure.next); - - if (matched) { - return PaddingTypes[configure.blankLine]; - } - } - - return PaddingTypes.any; - } - - /** - * Gets padding line sequences between the given 2 statements. - * Comments are separators of the padding line sequences. - * - * @param {ASTNode} prevNode The previous statement to count. - * @param {ASTNode} nextNode The current statement to count. - * @returns {Array} The array of token pairs. - * @private - */ - function getPaddingLineSequences(prevNode, nextNode) { - const pairs = []; - let prevToken = getActualLastToken(sourceCode, prevNode); - - if (nextNode.loc.start.line - prevToken.loc.end.line >= 2) { - do { - const token = sourceCode.getTokenAfter(prevToken, { - includeComments: true, - }); - - if (token.loc.start.line - prevToken.loc.end.line >= 2) { - pairs.push([prevToken, token]); - } - - prevToken = token; - } while (prevToken.range[0] < nextNode.range[0]); - } - - return pairs; - } - - /** - * Verify padding lines between the given node and the previous node. - * - * @param {ASTNode} node The node to verify. - * @returns {void} - * @private - */ - function verify(node) { - const parentType = node.parent.type; - const validParent = - astUtils.STATEMENT_LIST_PARENTS.has(parentType) || - parentType === 'SwitchStatement'; - - if (!validParent) { - return; - } - - // Save this node as the current previous statement. - const prevNode = scopeInfo.prevNode; - - // Verify. - if (prevNode) { - const type = getPaddingType(prevNode, node); - const paddingLines = getPaddingLineSequences(prevNode, node); - - type.verify(context, prevNode, node, paddingLines); - } - - scopeInfo.prevNode = node; - } - - /** - * Verify padding lines between the given node and the previous node. - * Then process to enter to new scope. - * - * @param {ASTNode} node The node to verify. - * @returns {void} - * @private - */ - function verifyThenEnterScope(node) { - verify(node); - enterScope(); - } - - return { - Program: enterScope, - BlockStatement: enterScope, - SwitchStatement: enterScope, - 'Program:exit': exitScope, - 'BlockStatement:exit': exitScope, - 'SwitchStatement:exit': exitScope, - - ':statement': verify, - - SwitchCase: verifyThenEnterScope, - 'SwitchCase:exit': exitScope, - }; - }, -}; diff --git a/fixtures/eslint/lib/rules/prefer-arrow-callback.js b/fixtures/eslint/lib/rules/prefer-arrow-callback.js deleted file mode 100644 index e2cca98c..00000000 --- a/fixtures/eslint/lib/rules/prefer-arrow-callback.js +++ /dev/null @@ -1,344 +0,0 @@ -/** - * @file A rule to suggest using arrow functions as callbacks. - * @author Toru Nagashima - */ - -'use strict'; - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -/** - * Checks whether or not a given variable is a function name. - * - * @param {eslint-scope.Variable} variable A variable to check. - * @returns {boolean} `true` if the variable is a function name. - */ -function isFunctionName(variable) { - return variable && variable.defs[0].type === 'FunctionName'; -} - -/** - * Checks whether or not a given MetaProperty node equals to a given value. - * - * @param {ASTNode} node A MetaProperty node to check. - * @param {string} metaName The name of `MetaProperty.meta`. - * @param {string} propertyName The name of `MetaProperty.property`. - * @returns {boolean} `true` if the node is the specific value. - */ -function checkMetaProperty(node, metaName, propertyName) { - return node.meta.name === metaName && node.property.name === propertyName; -} - -/** - * Gets the variable object of `arguments` which is defined implicitly. - * - * @param {eslint-scope.Scope} scope A scope to get. - * @returns {eslint-scope.Variable} The found variable object. - */ -function getVariableOfArguments(scope) { - const variables = scope.variables; - - for (const variable of variables) { - if (variable.name === 'arguments') { - /* - * If there was a parameter which is named "arguments", the - * implicit "arguments" is not defined. - * So does fast return with null. - */ - return variable.identifiers.length === 0 ? variable : null; - } - } - - /* istanbul ignore next */ - return null; -} - -/** - * Checks whether or not a given node is a callback. - * - * @param {ASTNode} node A node to check. - * @returns {object} - * {boolean} retv.isCallback - `true` if the node is a callback. - * {boolean} retv.isLexicalThis - `true` if the node is with `.bind(this)`. - */ -function getCallbackInfo(node) { - const retv = { isCallback: false, isLexicalThis: false }; - let currentNode = node; - let parent = node.parent; - - while (currentNode) { - switch (parent.type) { - // Checks parents recursively. - - case 'LogicalExpression': - case 'ConditionalExpression': { - break; - } - - // Checks whether the parent node is `.bind(this)` call. - case 'MemberExpression': { - if ( - parent.object === currentNode && - !parent.property.computed && - parent.property.type === 'Identifier' && - parent.property.name === 'bind' && - parent.parent.type === 'CallExpression' && - parent.parent.callee === parent - ) { - retv.isLexicalThis = - parent.parent.arguments.length === 1 && - parent.parent.arguments[0].type === 'ThisExpression'; - parent = parent.parent; - } else { - return retv; - } - - break; - } - - // Checks whether the node is a callback. - case 'CallExpression': - case 'NewExpression': { - if (parent.callee !== currentNode) { - retv.isCallback = true; - } - - return retv; - } - - default: { - return retv; - } - } - - currentNode = parent; - parent = parent.parent; - } - - /* istanbul ignore next */ - throw new Error('unreachable'); -} - -/** - * Checks whether a simple list of parameters contains any duplicates. This does not handle complex - * parameter lists (e.g. with destructuring), since complex parameter lists are a SyntaxError with duplicate - * parameter names anyway. Instead, it always returns `false` for complex parameter lists. - * - * @param {ASTNode[]} paramsList The list of parameters for a function - * @returns {boolean} `true` if the list of parameters contains any duplicates - */ -function hasDuplicateParams(paramsList) { - return ( - paramsList.every((param) => param.type === 'Identifier') && - paramsList.length !== new Set(paramsList.map((param) => param.name)).size - ); -} - -// ------------------------------------------------------------------------------ -// Rule Definition -// ------------------------------------------------------------------------------ - -module.exports = { - meta: { - type: 'suggestion', - - docs: { - description: 'require using arrow functions for callbacks', - category: 'ECMAScript 6', - recommended: false, - url: 'https://eslint.org/docs/rules/prefer-arrow-callback', - }, - - schema: [ - { - type: 'object', - properties: { - allowNamedFunctions: { - type: 'boolean', - default: false, - }, - allowUnboundThis: { - type: 'boolean', - default: true, - }, - }, - additionalProperties: false, - }, - ], - - fixable: 'code', - - messages: { - preferArrowCallback: 'Unexpected function expression.', - }, - }, - - create(context) { - const options = context.options[0] || {}; - - const allowUnboundThis = options.allowUnboundThis !== false; // Default to true - const allowNamedFunctions = options.allowNamedFunctions; - const sourceCode = context.getSourceCode(); - - /* - * {Array<{this: boolean, super: boolean, meta: boolean}>} - * - this - A flag which shows there are one or more ThisExpression. - * - super - A flag which shows there are one or more Super. - * - meta - A flag which shows there are one or more MethProperty. - */ - let stack = []; - - /** - * Pushes new function scope with all `false` flags. - * - * @returns {void} - */ - function enterScope() { - stack.push({ this: false, super: false, meta: false }); - } - - /** - * Pops a function scope from the stack. - * - * @returns {{this: boolean, super: boolean, meta: boolean}} The information of the last scope. - */ - function exitScope() { - return stack.pop(); - } - - return { - // Reset internal state. - Program() { - stack = []; - }, - - // If there are below, it cannot replace with arrow functions merely. - ThisExpression() { - const info = stack[stack.length - 1]; - - if (info) { - info.this = true; - } - }, - - Super() { - const info = stack[stack.length - 1]; - - if (info) { - info.super = true; - } - }, - - MetaProperty(node) { - const info = stack[stack.length - 1]; - - if (info && checkMetaProperty(node, 'new', 'target')) { - info.meta = true; - } - }, - - // To skip nested scopes. - FunctionDeclaration: enterScope, - 'FunctionDeclaration:exit': exitScope, - - // Main. - FunctionExpression: enterScope, - 'FunctionExpression:exit'(node) { - const scopeInfo = exitScope(); - - // Skip named function expressions - if (allowNamedFunctions && node.id && node.id.name) { - return; - } - - // Skip generators. - if (node.generator) { - return; - } - - // Skip recursive functions. - const nameVar = context.getDeclaredVariables(node)[0]; - - if (isFunctionName(nameVar) && nameVar.references.length > 0) { - return; - } - - // Skip if it's using arguments. - const variable = getVariableOfArguments(context.getScope()); - - if (variable && variable.references.length > 0) { - return; - } - - // Reports if it's a callback which can replace with arrows. - const callbackInfo = getCallbackInfo(node); - - if ( - callbackInfo.isCallback && - (!allowUnboundThis || - !scopeInfo.this || - callbackInfo.isLexicalThis) && - !scopeInfo.super && - !scopeInfo.meta - ) { - context.report({ - node, - messageId: 'preferArrowCallback', - fix(fixer) { - if ( - (!callbackInfo.isLexicalThis && scopeInfo.this) || - hasDuplicateParams(node.params) - ) { - /* - * If the callback function does not have .bind(this) and contains a reference to `this`, there - * is no way to determine what `this` should be, so don't perform any fixes. - * If the callback function has duplicates in its list of parameters (possible in sloppy mode), - * don't replace it with an arrow function, because this is a SyntaxError with arrow functions. - */ - return null; - } - - const paramsLeftParen = - node.params.length > 0 - ? sourceCode.getTokenBefore(node.params[0]) - : sourceCode.getTokenBefore(node.body, 1); - const paramsRightParen = sourceCode.getTokenBefore(node.body); - const asyncKeyword = node.async ? 'async ' : ''; - const paramsFullText = sourceCode.text.slice( - paramsLeftParen.range[0], - paramsRightParen.range[1], - ); - const arrowFunctionText = `${asyncKeyword}${paramsFullText} => ${sourceCode.getText( - node.body, - )}`; - - /* - * If the callback function has `.bind(this)`, replace it with an arrow function and remove the binding. - * Otherwise, just replace the arrow function itself. - */ - const replacedNode = callbackInfo.isLexicalThis - ? node.parent.parent - : node; - - /* - * If the replaced node is part of a BinaryExpression, LogicalExpression, or MemberExpression, then - * the arrow function needs to be parenthesized, because `foo || () => {}` is invalid syntax even - * though `foo || function() {}` is valid. - */ - const needsParens = - replacedNode.parent.type !== 'CallExpression' && - replacedNode.parent.type !== 'ConditionalExpression'; - const replacementText = needsParens - ? `(${arrowFunctionText})` - : arrowFunctionText; - - return fixer.replaceText(replacedNode, replacementText); - }, - }); - } - }, - }; - }, -}; diff --git a/fixtures/eslint/lib/rules/require-atomic-updates.js b/fixtures/eslint/lib/rules/require-atomic-updates.js deleted file mode 100644 index c662f454..00000000 --- a/fixtures/eslint/lib/rules/require-atomic-updates.js +++ /dev/null @@ -1,317 +0,0 @@ -/** - * @file disallow assignments that can lead to race conditions due to usage of `await` or `yield` - * @author Teddy Katz - * @author Toru Nagashima - */ -'use strict'; - -/** - * Make the map from identifiers to each reference. - * - * @param {escope.Scope} scope The scope to get references. - * @param {Map} [outReferenceMap] The map from identifier nodes to each reference object. - * @returns {Map} `referenceMap`. - */ -function createReferenceMap(scope, outReferenceMap = new Map()) { - for (const reference of scope.references) { - outReferenceMap.set(reference.identifier, reference); - } - - for (const childScope of scope.childScopes) { - if (childScope.type !== 'function') { - createReferenceMap(childScope, outReferenceMap); - } - } - - return outReferenceMap; -} - -/** - * Get `reference.writeExpr` of a given reference. - * If it's the read reference of MemberExpression in LHS, returns RHS in order to address `a.b = await a` - * - * @param {escope.Reference} reference The reference to get. - * @returns {Expression|null} The `reference.writeExpr`. - */ -function getWriteExpr(reference) { - if (reference.writeExpr) { - return reference.writeExpr; - } - - let node = reference.identifier; - - while (node) { - const t = node.parent.type; - - if (t === 'AssignmentExpression' && node.parent.left === node) { - return node.parent.right; - } - - if (t === 'MemberExpression' && node.parent.object === node) { - node = node.parent; - continue; - } - - break; - } - - return null; -} - -/** - * Checks if an expression is a variable that can only be observed within the given function. - * - * @param {Variable|null} variable The variable to check - * @param {boolean} isMemberAccess If `true` then this is a member access. - * @returns {boolean} `true` if the variable is local to the given function, and is never referenced in a closure. - */ -function isLocalVariableWithoutEscape(variable, isMemberAccess) { - if (!variable) { - return false; // A global variable which was not defined. - } - - // If the reference is a property access and the variable is a parameter, it handles the variable is not local. - if (isMemberAccess && variable.defs.some((d) => d.type === 'Parameter')) { - return false; - } - - const functionScope = variable.scope.variableScope; - - return variable.references.every( - (reference) => reference.from.variableScope === functionScope, - ); -} - -class SegmentInfo { - constructor() { - this.info = new WeakMap(); - } - - /** - * Initialize the segment information. - * - * @param {PathSegment} segment The segment to initialize. - * @returns {void} - */ - initialize(segment) { - const outdatedReadVariableNames = new Set(); - const freshReadVariableNames = new Set(); - - for (const prevSegment of segment.prevSegments) { - const info = this.info.get(prevSegment); - - if (info) { - for (const variableName of info.outdatedReadVariableNames) { - outdatedReadVariableNames.add(variableName); - } - - for (const variableName of info.freshReadVariableNames) { - freshReadVariableNames.add(variableName); - } - } - } - - this.info.set(segment, { - outdatedReadVariableNames, - freshReadVariableNames, - }); - } - - /** - * Mark a given variable as read on given segments. - * - * @param {PathSegment[]} segments The segments that it read the variable on. - * @param {string} variableName The variable name to be read. - * @returns {void} - */ - markAsRead(segments, variableName) { - for (const segment of segments) { - const info = this.info.get(segment); - - if (info) { - info.freshReadVariableNames.add(variableName); - } - } - } - - /** - * Move `freshReadVariableNames` to `outdatedReadVariableNames`. - * - * @param {PathSegment[]} segments The segments to process. - * @returns {void} - */ - makeOutdated(segments) { - for (const segment of segments) { - const info = this.info.get(segment); - - if (info) { - for (const variableName of info.freshReadVariableNames) { - info.outdatedReadVariableNames.add(variableName); - } - - info.freshReadVariableNames.clear(); - } - } - } - - /** - * Check if a given variable is outdated on the current segments. - * - * @param {PathSegment[]} segments The current segments. - * @param {string} variableName The variable name to check. - * @returns {boolean} `true` if the variable is outdated on the segments. - */ - isOutdated(segments, variableName) { - for (const segment of segments) { - const info = this.info.get(segment); - - if (info && info.outdatedReadVariableNames.has(variableName)) { - return true; - } - } - - return false; - } -} - -// ------------------------------------------------------------------------------ -// Rule Definition -// ------------------------------------------------------------------------------ - -module.exports = { - meta: { - type: 'problem', - - docs: { - description: - 'disallow assignments that can lead to race conditions due to usage of `await` or `yield`', - category: 'Possible Errors', - recommended: false, - url: 'https://eslint.org/docs/rules/require-atomic-updates', - }, - - fixable: null, - schema: [], - - messages: { - nonAtomicUpdate: - 'Possible race condition: `{{value}}` might be reassigned based on an outdated value of `{{value}}`.', - }, - }, - - create(context) { - const sourceCode = context.getSourceCode(); - const assignmentReferences = new Map(); - const segmentInfo = new SegmentInfo(); - let stack = null; - - return { - onCodePathStart(codePath) { - const scope = context.getScope(); - const shouldVerify = - scope.type === 'function' && - (scope.block.async || scope.block.generator); - - stack = { - upper: stack, - codePath, - referenceMap: shouldVerify ? createReferenceMap(scope) : null, - }; - }, - onCodePathEnd() { - stack = stack.upper; - }, - - // Initialize the segment information. - onCodePathSegmentStart(segment) { - segmentInfo.initialize(segment); - }, - - // Handle references to prepare verification. - Identifier(node) { - const { codePath, referenceMap } = stack; - const reference = referenceMap && referenceMap.get(node); - - // Ignore if this is not a valid variable reference. - if (!reference) { - return; - } - - const name = reference.identifier.name; - const variable = reference.resolved; - const writeExpr = getWriteExpr(reference); - const isMemberAccess = - reference.identifier.parent.type === 'MemberExpression'; - - // Add a fresh read variable. - if ( - reference.isRead() && - !(writeExpr && writeExpr.parent.operator === '=') - ) { - segmentInfo.markAsRead(codePath.currentSegments, name); - } - - /* - * Register the variable to verify after ESLint traversed the `writeExpr` node - * if this reference is an assignment to a variable which is referred from other closure. - */ - if ( - writeExpr && - writeExpr.parent.right === writeExpr && // ← exclude variable declarations. - !isLocalVariableWithoutEscape(variable, isMemberAccess) - ) { - let refs = assignmentReferences.get(writeExpr); - - if (!refs) { - refs = []; - assignmentReferences.set(writeExpr, refs); - } - - refs.push(reference); - } - }, - - /* - * Verify assignments. - * If the reference exists in `outdatedReadVariableNames` list, report it. - */ - ':expression:exit'(node) { - const { codePath, referenceMap } = stack; - - // ReferenceMap exists if this is in a resumable function scope. - if (!referenceMap) { - return; - } - - // Mark the read variables on this code path as outdated. - if ( - node.type === 'AwaitExpression' || - node.type === 'YieldExpression' - ) { - segmentInfo.makeOutdated(codePath.currentSegments); - } - - // Verify. - const references = assignmentReferences.get(node); - - if (references) { - assignmentReferences.delete(node); - - for (const reference of references) { - const name = reference.identifier.name; - - if (segmentInfo.isOutdated(codePath.currentSegments, name)) { - context.report({ - node: node.parent, - messageId: 'nonAtomicUpdate', - data: { - value: sourceCode.getText(node.parent.left), - }, - }); - } - } - } - }, - }; - }, -}; diff --git a/fixtures/eslint/lib/rules/utils/ast-utils.js b/fixtures/eslint/lib/rules/utils/ast-utils.js deleted file mode 100644 index f473de24..00000000 --- a/fixtures/eslint/lib/rules/utils/ast-utils.js +++ /dev/null @@ -1,1666 +0,0 @@ -/** - * @file Common utils for AST. - * @author Gyandeep Singh - */ - -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const espree = require('espree'); -const esutils = require('esutils'); -const lodash = require('lodash'); - -const { - breakableTypePattern, - createGlobalLinebreakMatcher, - lineBreakPattern, - shebangPattern, -} = require('../../shared/ast-utils'); - -// ------------------------------------------------------------------------------ -// Helpers -// ------------------------------------------------------------------------------ - -const anyFunctionPattern = - /^(?:Function(?:Declaration|Expression)|ArrowFunctionExpression)$/u; -const anyLoopPattern = /^(?:DoWhile|For|ForIn|ForOf|While)Statement$/u; -const arrayOrTypedArrayPattern = /Array$/u; -const arrayMethodPattern = - /^(?:every|filter|find|findIndex|forEach|map|some)$/u; -const bindOrCallOrApplyPattern = /^(?:bind|call|apply)$/u; -const thisTagPattern = /^[\s*]*@this/mu; - -const COMMENTS_IGNORE_PATTERN = - /^\s*(?:eslint|jshint\s+|jslint\s+|istanbul\s+|globals?\s+|exported\s+|jscs)/u; -const LINEBREAKS = new Set(['\r\n', '\r', '\n', '\u2028', '\u2029']); - -// A set of node types that can contain a list of statements -const STATEMENT_LIST_PARENTS = new Set([ - 'Program', - 'BlockStatement', - 'SwitchCase', -]); - -const DECIMAL_INTEGER_PATTERN = /^(0|[1-9]\d*)$/u; -const OCTAL_ESCAPE_PATTERN = - /^(?:[^\\]|\\[^0-7]|\\0(?![0-9]))*\\(?:[1-7]|0[0-9])/u; - -/** - * Checks reference if is non initializer and writable. - * - * @param {Reference} reference A reference to check. - * @param {int} index The index of the reference in the references. - * @param {Reference[]} references The array that the reference belongs to. - * @returns {boolean} Success/Failure - * @private - */ -function isModifyingReference(reference, index, references) { - const identifier = reference.identifier; - - /* - * Destructuring assignments can have multiple default value, so - * possibly there are multiple writeable references for the same - * identifier. - */ - const modifyingDifferentIdentifier = - index === 0 || references[index - 1].identifier !== identifier; - - return ( - identifier && - reference.init === false && - reference.isWrite() && - modifyingDifferentIdentifier - ); -} - -/** - * Checks whether the given string starts with uppercase or not. - * - * @param {string} s The string to check. - * @returns {boolean} `true` if the string starts with uppercase. - */ -function startsWithUpperCase(s) { - return s[0] !== s[0].toLocaleLowerCase(); -} - -/** - * Checks whether or not a node is a constructor. - * - * @param {ASTNode} node A function node to check. - * @returns {boolean} Wehether or not a node is a constructor. - */ -function isES5Constructor(node) { - return node.id && startsWithUpperCase(node.id.name); -} - -/** - * Finds a function node from ancestors of a node. - * - * @param {ASTNode} node A start node to find. - * @returns {Node|null} A found function node. - */ -function getUpperFunction(node) { - for (let currentNode = node; currentNode; currentNode = currentNode.parent) { - if (anyFunctionPattern.test(currentNode.type)) { - return currentNode; - } - } - - return null; -} - -/** - * Checks whether a given node is a function node or not. - * The following types are function nodes: - * - * - ArrowFunctionExpression - * - FunctionDeclaration - * - FunctionExpression - * - * @param {ASTNode|null} node A node to check. - * @returns {boolean} `true` if the node is a function node. - */ -function isFunction(node) { - return Boolean(node && anyFunctionPattern.test(node.type)); -} - -/** - * Checks whether a given node is a loop node or not. - * The following types are loop nodes: - * - * - DoWhileStatement - * - ForInStatement - * - ForOfStatement - * - ForStatement - * - WhileStatement - * - * @param {ASTNode|null} node A node to check. - * @returns {boolean} `true` if the node is a loop node. - */ -function isLoop(node) { - return Boolean(node && anyLoopPattern.test(node.type)); -} - -/** - * Checks whether the given node is in a loop or not. - * - * @param {ASTNode} node The node to check. - * @returns {boolean} `true` if the node is in a loop. - */ -function isInLoop(node) { - for ( - let currentNode = node; - currentNode && !isFunction(currentNode); - currentNode = currentNode.parent - ) { - if (isLoop(currentNode)) { - return true; - } - } - - return false; -} - -/** - * Checks whether or not a node is `null` or `undefined`. - * - * @param {ASTNode} node A node to check. - * @returns {boolean} Whether or not the node is a `null` or `undefined`. - * @public - */ -function isNullOrUndefined(node) { - return ( - module.exports.isNullLiteral(node) || - (node.type === 'Identifier' && node.name === 'undefined') || - (node.type === 'UnaryExpression' && node.operator === 'void') - ); -} - -/** - * Checks whether or not a node is callee. - * - * @param {ASTNode} node A node to check. - * @returns {boolean} Whether or not the node is callee. - */ -function isCallee(node) { - return node.parent.type === 'CallExpression' && node.parent.callee === node; -} - -/** - * Checks whether or not a node is `Reflect.apply`. - * - * @param {ASTNode} node A node to check. - * @returns {boolean} Whether or not the node is a `Reflect.apply`. - */ -function isReflectApply(node) { - return ( - node.type === 'MemberExpression' && - node.object.type === 'Identifier' && - node.object.name === 'Reflect' && - node.property.type === 'Identifier' && - node.property.name === 'apply' && - node.computed === false - ); -} - -/** - * Checks whether or not a node is `Array.from`. - * - * @param {ASTNode} node A node to check. - * @returns {boolean} Whether or not the node is a `Array.from`. - */ -function isArrayFromMethod(node) { - return ( - node.type === 'MemberExpression' && - node.object.type === 'Identifier' && - arrayOrTypedArrayPattern.test(node.object.name) && - node.property.type === 'Identifier' && - node.property.name === 'from' && - node.computed === false - ); -} - -/** - * Checks whether or not a node is a method which has `thisArg`. - * - * @param {ASTNode} node A node to check. - * @returns {boolean} Whether or not the node is a method which has `thisArg`. - */ -function isMethodWhichHasThisArg(node) { - for ( - let currentNode = node; - currentNode.type === 'MemberExpression' && !currentNode.computed; - currentNode = currentNode.property - ) { - if (currentNode.property.type === 'Identifier') { - return arrayMethodPattern.test(currentNode.property.name); - } - } - - return false; -} - -/** - * Creates the negate function of the given function. - * - * @param {() => void} f The function to negate. - * @returns {() => void} Negated function. - */ -function negate(f) { - return (token) => !f(token); -} - -/** - * Checks whether or not a node has a `@this` tag in its comments. - * - * @param {ASTNode} node A node to check. - * @param {SourceCode} sourceCode A SourceCode instance to get comments. - * @returns {boolean} Whether or not the node has a `@this` tag in its comments. - */ -function hasJSDocThisTag(node, sourceCode) { - const jsdocComment = sourceCode.getJSDocComment(node); - - if (jsdocComment && thisTagPattern.test(jsdocComment.value)) { - return true; - } - - // Checks `@this` in its leading comments for callbacks, - // because callbacks don't have its JSDoc comment. - // e.g. - // sinon.test(/* @this sinon.Sandbox */function() { this.spy(); }); - return sourceCode - .getCommentsBefore(node) - .some((comment) => thisTagPattern.test(comment.value)); -} - -/** - * Determines if a node is surrounded by parentheses. - * - * @param {SourceCode} sourceCode The ESLint source code object - * @param {ASTNode} node The node to be checked. - * @returns {boolean} True if the node is parenthesised. - * @private - */ -function isParenthesised(sourceCode, node) { - const previousToken = sourceCode.getTokenBefore(node); - const nextToken = sourceCode.getTokenAfter(node); - - return ( - Boolean(previousToken && nextToken) && - previousToken.value === '(' && - previousToken.range[1] <= node.range[0] && - nextToken.value === ')' && - nextToken.range[0] >= node.range[1] - ); -} - -/** - * Checks if the given token is an arrow token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is an arrow token. - */ -function isArrowToken(token) { - return token.value === '=>' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a comma token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a comma token. - */ -function isCommaToken(token) { - return token.value === ',' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a dot token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a dot token. - */ -function isDotToken(token) { - return token.value === '.' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a semicolon token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a semicolon token. - */ -function isSemicolonToken(token) { - return token.value === ';' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a colon token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a colon token. - */ -function isColonToken(token) { - return token.value === ':' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is an opening parenthesis token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is an opening parenthesis token. - */ -function isOpeningParenToken(token) { - return token.value === '(' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a closing parenthesis token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a closing parenthesis token. - */ -function isClosingParenToken(token) { - return token.value === ')' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is an opening square bracket token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is an opening square bracket token. - */ -function isOpeningBracketToken(token) { - return token.value === '[' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a closing square bracket token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a closing square bracket token. - */ -function isClosingBracketToken(token) { - return token.value === ']' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is an opening brace token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is an opening brace token. - */ -function isOpeningBraceToken(token) { - return token.value === '{' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a closing brace token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a closing brace token. - */ -function isClosingBraceToken(token) { - return token.value === '}' && token.type === 'Punctuator'; -} - -/** - * Checks if the given token is a comment token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a comment token. - */ -function isCommentToken(token) { - return ( - token.type === 'Line' || token.type === 'Block' || token.type === 'Shebang' - ); -} - -/** - * Checks if the given token is a keyword token or not. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if the token is a keyword token. - */ -function isKeywordToken(token) { - return token.type === 'Keyword'; -} - -/** - * Gets the `(` token of the given function node. - * - * @param {ASTNode} node The function node to get. - * @param {SourceCode} sourceCode The source code object to get tokens. - * @returns {Token} `(` token. - */ -function getOpeningParenOfParams(node, sourceCode) { - return node.id - ? sourceCode.getTokenAfter(node.id, isOpeningParenToken) - : sourceCode.getFirstToken(node, isOpeningParenToken); -} - -/** - * Checks whether or not the tokens of two given nodes are same. - * - * @param {ASTNode} left A node 1 to compare. - * @param {ASTNode} right A node 2 to compare. - * @param {SourceCode} sourceCode The ESLint source code object. - * @returns {boolean} the source code for the given node. - */ -function equalTokens(left, right, sourceCode) { - const tokensL = sourceCode.getTokens(left); - const tokensR = sourceCode.getTokens(right); - - if (tokensL.length !== tokensR.length) { - return false; - } - - for (const [i, element] of tokensL.entries()) { - if ( - element.type !== tokensR[i].type || - element.value !== tokensR[i].value - ) { - return false; - } - } - - return true; -} - -// ------------------------------------------------------------------------------ -// Public Interface -// ------------------------------------------------------------------------------ - -module.exports = { - COMMENTS_IGNORE_PATTERN, - LINEBREAKS, - LINEBREAK_MATCHER: lineBreakPattern, - SHEBANG_MATCHER: shebangPattern, - STATEMENT_LIST_PARENTS, - - /** - * Determines whether two adjacent tokens are on the same line. - * - * @param {object} left The left token object. - * @param {object} right The right token object. - * @returns {boolean} Whether or not the tokens are on the same line. - * @public - */ - isTokenOnSameLine(left, right) { - return left.loc.end.line === right.loc.start.line; - }, - - isNullOrUndefined, - isCallee, - isES5Constructor, - getUpperFunction, - isFunction, - isLoop, - isInLoop, - isArrayFromMethod, - isParenthesised, - createGlobalLinebreakMatcher, - equalTokens, - - isArrowToken, - isClosingBraceToken, - isClosingBracketToken, - isClosingParenToken, - isColonToken, - isCommaToken, - isCommentToken, - isDotToken, - isKeywordToken, - isNotClosingBraceToken: negate(isClosingBraceToken), - isNotClosingBracketToken: negate(isClosingBracketToken), - isNotClosingParenToken: negate(isClosingParenToken), - isNotColonToken: negate(isColonToken), - isNotCommaToken: negate(isCommaToken), - isNotDotToken: negate(isDotToken), - isNotOpeningBraceToken: negate(isOpeningBraceToken), - isNotOpeningBracketToken: negate(isOpeningBracketToken), - isNotOpeningParenToken: negate(isOpeningParenToken), - isNotSemicolonToken: negate(isSemicolonToken), - isOpeningBraceToken, - isOpeningBracketToken, - isOpeningParenToken, - isSemicolonToken, - - /** - * Checks whether or not a given node is a string literal. - * - * @param {ASTNode} node A node to check. - * @returns {boolean} `true` if the node is a string literal. - */ - isStringLiteral(node) { - return ( - (node.type === 'Literal' && typeof node.value === 'string') || - node.type === 'TemplateLiteral' - ); - }, - - /** - * Checks whether a given node is a breakable statement or not. - * The node is breakable if the node is one of the following type: - * - * - DoWhileStatement - * - ForInStatement - * - ForOfStatement - * - ForStatement - * - SwitchStatement - * - WhileStatement - * - * @param {ASTNode} node A node to check. - * @returns {boolean} `true` if the node is breakable. - */ - isBreakableStatement(node) { - return breakableTypePattern.test(node.type); - }, - - /** - * Gets references which are non initializer and writable. - * - * @param {Reference[]} references An array of references. - * @returns {Reference[]} An array of only references which are non initializer and writable. - * @public - */ - getModifyingReferences(references) { - return references.filter(isModifyingReference); - }, - - /** - * Validate that a string passed in is surrounded by the specified character - * - * @param {string} val The text to check. - * @param {string} character The character to see if it's surrounded by. - * @returns {boolean} True if the text is surrounded by the character, false if not. - * @private - */ - isSurroundedBy(val, character) { - return val[0] === character && val[val.length - 1] === character; - }, - - /** - * Returns whether the provided node is an ESLint directive comment or not - * - * @param {Line|Block} node The comment token to be checked - * @returns {boolean} `true` if the node is an ESLint directive comment - */ - isDirectiveComment(node) { - const comment = node.value.trim(); - - return ( - (node.type === 'Line' && comment.indexOf('eslint-') === 0) || - (node.type === 'Block' && - (comment.indexOf('global ') === 0 || - comment.indexOf('eslint ') === 0 || - comment.indexOf('eslint-') === 0)) - ); - }, - - /** - * Gets the trailing statement of a given node. - * - * if (code) - * consequent; - * - * When taking this `IfStatement`, returns `consequent;` statement. - * - * @param {ASTNode} A node to get. - * @returns {ASTNode|null} The trailing statement's node. - */ - getTrailingStatement: esutils.ast.trailingStatement, - - /** - * Finds the variable by a given name in a given scope and its upper scopes. - * - * @param {eslint-scope.Scope} initScope A scope to start find. - * @param {string} name A variable name to find. - * @returns {eslint-scope.Variable|null} A found variable or `null`. - */ - getVariableByName(initScope, name) { - let scope = initScope; - - while (scope) { - const variable = scope.set.get(name); - - if (variable) { - return variable; - } - - scope = scope.upper; - } - - return null; - }, - - /** - * Checks whether or not a given function node is the default `this` binding. - * - * First, this checks the node: - * - * - The function name does not start with uppercase. It's a convention to capitalize the names - * of constructor functions. This check is not performed if `capIsConstructor` is set to `false`. - * - The function does not have a JSDoc comment that has a @this tag. - * - * Next, this checks the location of the node. - * If the location is below, this judges `this` is valid. - * - * - The location is not on an object literal. - * - The location is not assigned to a variable which starts with an uppercase letter. Applies to anonymous - * functions only, as the name of the variable is considered to be the name of the function in this case. - * This check is not performed if `capIsConstructor` is set to `false`. - * - The location is not on an ES2015 class. - * - Its `bind`/`call`/`apply` method is not called directly. - * - The function is not a callback of array methods (such as `.forEach()`) if `thisArg` is given. - * - * @param {ASTNode} node A function node to check. - * @param {SourceCode} sourceCode A SourceCode instance to get comments. - * @param {boolean} [capIsConstructor] `false` disables the assumption that functions which name starts - * with an uppercase or are assigned to a variable which name starts with an uppercase are constructors. - * @returns {boolean} The function node is the default `this` binding. - */ - // eslint-disable-next-line complexity - isDefaultThisBinding(node, sourceCode, { capIsConstructor = true } = {}) { - if ( - (capIsConstructor && isES5Constructor(node)) || - hasJSDocThisTag(node, sourceCode) - ) { - return false; - } - - const isAnonymous = node.id === null; - let currentNode = node; - - while (currentNode) { - const parent = currentNode.parent; - - switch (parent.type) { - /* - * Looks up the destination. - * e.g., obj.foo = nativeFoo || function foo() { ... }; - */ - case 'LogicalExpression': - case 'ConditionalExpression': { - currentNode = parent; - break; - } - - /* - * If the upper function is IIFE, checks the destination of the return value. - * e.g. - * obj.foo = (function() { - * // setup... - * return function foo() { ... }; - * })(); - * obj.foo = (() => - * function foo() { ... } - * )(); - */ - case 'ReturnStatement': { - const func = getUpperFunction(parent); - - if (func === null || !isCallee(func)) { - return true; - } - - currentNode = func.parent; - break; - } - - case 'ArrowFunctionExpression': { - if (currentNode !== parent.body || !isCallee(parent)) { - return true; - } - - currentNode = parent.parent; - break; - } - - /* - * E.g. - * var obj = { foo() { ... } }; - * var obj = { foo: function() { ... } }; - * class A { constructor() { ... } } - * class A { foo() { ... } } - * class A { get foo() { ... } } - * class A { set foo() { ... } } - * class A { static foo() { ... } } - */ - case 'Property': - case 'MethodDefinition': { - return parent.value !== currentNode; - } - - /* - * E.g. - * obj.foo = function foo() { ... }; - * Foo = function() { ... }; - * [obj.foo = function foo() { ... }] = a; - * [Foo = function() { ... }] = a; - */ - case 'AssignmentExpression': - case 'AssignmentPattern': { - if (parent.left.type === 'MemberExpression') { - return false; - } - - if ( - capIsConstructor && - isAnonymous && - parent.left.type === 'Identifier' && - startsWithUpperCase(parent.left.name) - ) { - return false; - } - - return true; - } - - /* - * E.g. - * var Foo = function() { ... }; - */ - case 'VariableDeclarator': { - return !( - capIsConstructor && - isAnonymous && - parent.init === currentNode && - parent.id.type === 'Identifier' && - startsWithUpperCase(parent.id.name) - ); - } - - /* - * E.g. - * var foo = function foo() { ... }.bind(obj); - * (function foo() { ... }).call(obj); - * (function foo() { ... }).apply(obj, []); - */ - case 'MemberExpression': { - return ( - parent.object !== currentNode || - parent.property.type !== 'Identifier' || - !bindOrCallOrApplyPattern.test(parent.property.name) || - !isCallee(parent) || - parent.parent.arguments.length === 0 || - isNullOrUndefined(parent.parent.arguments[0]) - ); - } - - /* - * E.g. - * Reflect.apply(function() {}, obj, []); - * Array.from([], function() {}, obj); - * list.forEach(function() {}, obj); - */ - case 'CallExpression': { - if (isReflectApply(parent.callee)) { - return ( - parent.arguments.length !== 3 || - parent.arguments[0] !== currentNode || - isNullOrUndefined(parent.arguments[1]) - ); - } - - if (isArrayFromMethod(parent.callee)) { - return ( - parent.arguments.length !== 3 || - parent.arguments[1] !== currentNode || - isNullOrUndefined(parent.arguments[2]) - ); - } - - if (isMethodWhichHasThisArg(parent.callee)) { - return ( - parent.arguments.length !== 2 || - parent.arguments[0] !== currentNode || - isNullOrUndefined(parent.arguments[1]) - ); - } - - return true; - } - - // Otherwise `this` is default. - default: { - return true; - } - } - } - - /* istanbul ignore next */ - return true; - }, - - /** - * Get the precedence level based on the node type - * - * @param {ASTNode} node node to evaluate - * @returns {int} precedence level - * @private - */ - // eslint-disable-next-line complexity - getPrecedence(node) { - switch (node.type) { - case 'SequenceExpression': { - return 0; - } - - case 'AssignmentExpression': - case 'ArrowFunctionExpression': - case 'YieldExpression': { - return 1; - } - - case 'ConditionalExpression': { - return 3; - } - - case 'LogicalExpression': { - switch (node.operator) { - case '||': { - return 4; - } - case '&&': { - return 5; - } - - // No default - } - } - - /* Falls through */ - - case 'BinaryExpression': { - switch (node.operator) { - case '|': { - return 6; - } - case '^': { - return 7; - } - case '&': { - return 8; - } - case '==': - case '!=': - case '===': - case '!==': { - return 9; - } - case '<': - case '<=': - case '>': - case '>=': - case 'in': - case 'instanceof': { - return 10; - } - case '<<': - case '>>': - case '>>>': { - return 11; - } - case '+': - case '-': { - return 12; - } - case '*': - case '/': - case '%': { - return 13; - } - case '**': { - return 15; - } - - // No default - } - } - - /* Falls through */ - - case 'UnaryExpression': - case 'AwaitExpression': { - return 16; - } - - case 'UpdateExpression': { - return 17; - } - - case 'CallExpression': - case 'ImportExpression': { - return 18; - } - - case 'NewExpression': { - return 19; - } - - default: { - return 20; - } - } - }, - - /** - * Checks whether the given node is an empty block node or not. - * - * @param {ASTNode|null} node The node to check. - * @returns {boolean} `true` if the node is an empty block. - */ - isEmptyBlock(node) { - return Boolean( - node && node.type === 'BlockStatement' && node.body.length === 0, - ); - }, - - /** - * Checks whether the given node is an empty function node or not. - * - * @param {ASTNode|null} node The node to check. - * @returns {boolean} `true` if the node is an empty function. - */ - isEmptyFunction(node) { - return isFunction(node) && module.exports.isEmptyBlock(node.body); - }, - - /** - * Returns the result of the string conversion applied to the evaluated value of the given expression node, - * if it can be determined statically. - * - * This function returns a `string` value for all `Literal` nodes and simple `TemplateLiteral` nodes only. - * In all other cases, this function returns `null`. - * - * @param {ASTNode} node Expression node. - * @returns {string|null} String value if it can be determined. Otherwise, `null`. - */ - getStaticStringValue(node) { - switch (node.type) { - case 'Literal': { - if (node.value === null) { - if (module.exports.isNullLiteral(node)) { - return String(node.value); // "null" - } - - if (node.regex) { - return `/${node.regex.pattern}/${node.regex.flags}`; - } - - if (node.bigint) { - return node.bigint; - } - - // Otherwise, this is an unknown literal. The function will return null. - } else { - return String(node.value); - } - - break; - } - case 'TemplateLiteral': { - if (node.expressions.length === 0 && node.quasis.length === 1) { - return node.quasis[0].value.cooked; - } - - break; - } - - // No default - } - - return null; - }, - - /** - * Gets the property name of a given node. - * The node can be a MemberExpression, a Property, or a MethodDefinition. - * - * If the name is dynamic, this returns `null`. - * - * For examples: - * - * a.b // => "b" - * a["b"] // => "b" - * a['b'] // => "b" - * a[`b`] // => "b" - * a[100] // => "100" - * a[b] // => null - * a["a" + "b"] // => null - * a[tag`b`] // => null - * a[`${b}`] // => null - * - * let a = {b: 1} // => "b" - * let a = {["b"]: 1} // => "b" - * let a = {['b']: 1} // => "b" - * let a = {[`b`]: 1} // => "b" - * let a = {[100]: 1} // => "100" - * let a = {[b]: 1} // => null - * let a = {["a" + "b"]: 1} // => null - * let a = {[tag`b`]: 1} // => null - * let a = {[`${b}`]: 1} // => null - * - * @param {ASTNode} node The node to get. - * @returns {string|null} The property name if static. Otherwise, null. - */ - getStaticPropertyName(node) { - let prop; - - switch (node && node.type) { - case 'Property': - case 'MethodDefinition': { - prop = node.key; - break; - } - - case 'MemberExpression': { - prop = node.property; - break; - } - - // No default - } - - if (prop) { - if (prop.type === 'Identifier' && !node.computed) { - return prop.name; - } - - return module.exports.getStaticStringValue(prop); - } - - return null; - }, - - /** - * Get directives from directive prologue of a Program or Function node. - * - * @param {ASTNode} node The node to check. - * @returns {ASTNode[]} The directives found in the directive prologue. - */ - getDirectivePrologue(node) { - const directives = []; - - // Directive prologues only occur at the top of files or functions. - if ( - node.type === 'Program' || - node.type === 'FunctionDeclaration' || - node.type === 'FunctionExpression' || - /* - * Do not check arrow functions with implicit return. - * `() => "use strict";` returns the string `"use strict"`. - */ - (node.type === 'ArrowFunctionExpression' && - node.body.type === 'BlockStatement') - ) { - const statements = node.type === 'Program' ? node.body : node.body.body; - - for (const statement of statements) { - if ( - statement.type === 'ExpressionStatement' && - statement.expression.type === 'Literal' - ) { - directives.push(statement); - } else { - break; - } - } - } - - return directives; - }, - - /** - * Determines whether this node is a decimal integer literal. If a node is a decimal integer literal, a dot added - * after the node will be parsed as a decimal point, rather than a property-access dot. - * - * @param {ASTNode} node The node to check. - * @returns {boolean} `true` if this node is a decimal integer. - * @example - * - * 5 // true - * 5. // false - * 5.0 // false - * 05 // false - * 0x5 // false - * 0b101 // false - * 0o5 // false - * 5e0 // false - * '5' // false - * 5n // false - */ - isDecimalInteger(node) { - return ( - node.type === 'Literal' && - typeof node.value === 'number' && - DECIMAL_INTEGER_PATTERN.test(node.raw) - ); - }, - - /** - * Determines whether this token is a decimal integer numeric token. - * This is similar to isDecimalInteger(), but for tokens. - * - * @param {Token} token The token to check. - * @returns {boolean} `true` if this token is a decimal integer. - */ - isDecimalIntegerNumericToken(token) { - return ( - token.type === 'Numeric' && DECIMAL_INTEGER_PATTERN.test(token.value) - ); - }, - - /** - * Gets the name and kind of the given function node. - * - * - `function foo() {}` .................... `function 'foo'` - * - `(function foo() {})` .................. `function 'foo'` - * - `(function() {})` ...................... `function` - * - `function* foo() {}` ................... `generator function 'foo'` - * - `(function* foo() {})` ................. `generator function 'foo'` - * - `(function*() {})` ..................... `generator function` - * - `() => {}` ............................. `arrow function` - * - `async () => {}` ....................... `async arrow function` - * - `({ foo: function foo() {} })` ......... `method 'foo'` - * - `({ foo: function() {} })` ............. `method 'foo'` - * - `({ ['foo']: function() {} })` ......... `method 'foo'` - * - `({ [foo]: function() {} })` ........... `method` - * - `({ foo() {} })` ....................... `method 'foo'` - * - `({ foo: function* foo() {} })` ........ `generator method 'foo'` - * - `({ foo: function*() {} })` ............ `generator method 'foo'` - * - `({ ['foo']: function*() {} })` ........ `generator method 'foo'` - * - `({ [foo]: function*() {} })` .......... `generator method` - * - `({ *foo() {} })` ...................... `generator method 'foo'` - * - `({ foo: async function foo() {} })` ... `async method 'foo'` - * - `({ foo: async function() {} })` ....... `async method 'foo'` - * - `({ ['foo']: async function() {} })` ... `async method 'foo'` - * - `({ [foo]: async function() {} })` ..... `async method` - * - `({ async foo() {} })` ................. `async method 'foo'` - * - `({ get foo() {} })` ................... `getter 'foo'` - * - `({ set foo(a) {} })` .................. `setter 'foo'` - * - `class A { constructor() {} }` ......... `constructor` - * - `class A { foo() {} }` ................. `method 'foo'` - * - `class A { *foo() {} }` ................ `generator method 'foo'` - * - `class A { async foo() {} }` ........... `async method 'foo'` - * - `class A { ['foo']() {} }` ............. `method 'foo'` - * - `class A { *['foo']() {} }` ............ `generator method 'foo'` - * - `class A { async ['foo']() {} }` ....... `async method 'foo'` - * - `class A { [foo]() {} }` ............... `method` - * - `class A { *[foo]() {} }` .............. `generator method` - * - `class A { async [foo]() {} }` ......... `async method` - * - `class A { get foo() {} }` ............. `getter 'foo'` - * - `class A { set foo(a) {} }` ............ `setter 'foo'` - * - `class A { static foo() {} }` .......... `static method 'foo'` - * - `class A { static *foo() {} }` ......... `static generator method 'foo'` - * - `class A { static async foo() {} }` .... `static async method 'foo'` - * - `class A { static get foo() {} }` ...... `static getter 'foo'` - * - `class A { static set foo(a) {} }` ..... `static setter 'foo'` - * - * @param {ASTNode} node The function node to get. - * @returns {string} The name and kind of the function node. - */ - getFunctionNameWithKind(node) { - const parent = node.parent; - const tokens = []; - - if (parent.type === 'MethodDefinition' && parent.static) { - tokens.push('static'); - } - - if (node.async) { - tokens.push('async'); - } - - if (node.generator) { - tokens.push('generator'); - } - - if (node.type === 'ArrowFunctionExpression') { - tokens.push('arrow', 'function'); - } else if ( - parent.type === 'Property' || - parent.type === 'MethodDefinition' - ) { - if (parent.kind === 'constructor') { - return 'constructor'; - } - - if (parent.kind === 'get') { - tokens.push('getter'); - } else if (parent.kind === 'set') { - tokens.push('setter'); - } else { - tokens.push('method'); - } - } else { - tokens.push('function'); - } - - if (node.id) { - tokens.push(`'${node.id.name}'`); - } else { - const name = module.exports.getStaticPropertyName(parent); - - if (name !== null) { - tokens.push(`'${name}'`); - } - } - - return tokens.join(' '); - }, - - /** - * Gets the location of the given function node for reporting. - * - * - `function foo() {}` - * ^^^^^^^^^^^^ - * - `(function foo() {})` - * ^^^^^^^^^^^^ - * - `(function() {})` - * ^^^^^^^^ - * - `function* foo() {}` - * ^^^^^^^^^^^^^ - * - `(function* foo() {})` - * ^^^^^^^^^^^^^ - * - `(function*() {})` - * ^^^^^^^^^ - * - `() => {}` - * ^^ - * - `async () => {}` - * ^^ - * - `({ foo: function foo() {} })` - * ^^^^^^^^^^^^^^^^^ - * - `({ foo: function() {} })` - * ^^^^^^^^^^^^^ - * - `({ ['foo']: function() {} })` - * ^^^^^^^^^^^^^^^^^ - * - `({ [foo]: function() {} })` - * ^^^^^^^^^^^^^^^ - * - `({ foo() {} })` - * ^^^ - * - `({ foo: function* foo() {} })` - * ^^^^^^^^^^^^^^^^^^ - * - `({ foo: function*() {} })` - * ^^^^^^^^^^^^^^ - * - `({ ['foo']: function*() {} })` - * ^^^^^^^^^^^^^^^^^^ - * - `({ [foo]: function*() {} })` - * ^^^^^^^^^^^^^^^^ - * - `({ *foo() {} })` - * ^^^^ - * - `({ foo: async function foo() {} })` - * ^^^^^^^^^^^^^^^^^^^^^^^ - * - `({ foo: async function() {} })` - * ^^^^^^^^^^^^^^^^^^^ - * - `({ ['foo']: async function() {} })` - * ^^^^^^^^^^^^^^^^^^^^^^^ - * - `({ [foo]: async function() {} })` - * ^^^^^^^^^^^^^^^^^^^^^ - * - `({ async foo() {} })` - * ^^^^^^^^^ - * - `({ get foo() {} })` - * ^^^^^^^ - * - `({ set foo(a) {} })` - * ^^^^^^^ - * - `class A { constructor() {} }` - * ^^^^^^^^^^^ - * - `class A { foo() {} }` - * ^^^ - * - `class A { *foo() {} }` - * ^^^^ - * - `class A { async foo() {} }` - * ^^^^^^^^^ - * - `class A { ['foo']() {} }` - * ^^^^^^^ - * - `class A { *['foo']() {} }` - * ^^^^^^^^ - * - `class A { async ['foo']() {} }` - * ^^^^^^^^^^^^^ - * - `class A { [foo]() {} }` - * ^^^^^ - * - `class A { *[foo]() {} }` - * ^^^^^^ - * - `class A { async [foo]() {} }` - * ^^^^^^^^^^^ - * - `class A { get foo() {} }` - * ^^^^^^^ - * - `class A { set foo(a) {} }` - * ^^^^^^^ - * - `class A { static foo() {} }` - * ^^^^^^^^^^ - * - `class A { static *foo() {} }` - * ^^^^^^^^^^^ - * - `class A { static async foo() {} }` - * ^^^^^^^^^^^^^^^^ - * - `class A { static get foo() {} }` - * ^^^^^^^^^^^^^^ - * - `class A { static set foo(a) {} }` - * ^^^^^^^^^^^^^^ - * - * @param {ASTNode} node The function node to get. - * @param {SourceCode} sourceCode The source code object to get tokens. - * @returns {string} The location of the function node for reporting. - */ - getFunctionHeadLoc(node, sourceCode) { - const parent = node.parent; - let start = null; - let end = null; - - if (node.type === 'ArrowFunctionExpression') { - const arrowToken = sourceCode.getTokenBefore(node.body, isArrowToken); - - start = arrowToken.loc.start; - end = arrowToken.loc.end; - } else if ( - parent.type === 'Property' || - parent.type === 'MethodDefinition' - ) { - start = parent.loc.start; - end = getOpeningParenOfParams(node, sourceCode).loc.start; - } else { - start = node.loc.start; - end = getOpeningParenOfParams(node, sourceCode).loc.start; - } - - return { - start: { ...start }, - end: { ...end }, - }; - }, - - /** - * Gets next location when the result is not out of bound, otherwise returns null. - * - * @param {SourceCode} sourceCode The sourceCode - * @param {{line: number, column: number}} location The location - * @returns {{line: number, column: number} | null} Next location - */ - getNextLocation(sourceCode, location) { - const index = sourceCode.getIndexFromLoc(location); - - // Avoid out of bound location - if (index + 1 > sourceCode.text.length) { - return null; - } - - return sourceCode.getLocFromIndex(index + 1); - }, - - /** - * Gets the parenthesized text of a node. This is similar to sourceCode.getText(node), but it also includes any parentheses - * surrounding the node. - * - * @param {SourceCode} sourceCode The source code object - * @param {ASTNode} node An expression node - * @returns {string} The text representing the node, with all surrounding parentheses included - */ - getParenthesisedText(sourceCode, node) { - let leftToken = sourceCode.getFirstToken(node); - let rightToken = sourceCode.getLastToken(node); - - while ( - sourceCode.getTokenBefore(leftToken) && - sourceCode.getTokenBefore(leftToken).type === 'Punctuator' && - sourceCode.getTokenBefore(leftToken).value === '(' && - sourceCode.getTokenAfter(rightToken) && - sourceCode.getTokenAfter(rightToken).type === 'Punctuator' && - sourceCode.getTokenAfter(rightToken).value === ')' - ) { - leftToken = sourceCode.getTokenBefore(leftToken); - rightToken = sourceCode.getTokenAfter(rightToken); - } - - return sourceCode.getText().slice(leftToken.range[0], rightToken.range[1]); - }, - - /* - * Determine if a node has a possiblity to be an Error object - * @param {ASTNode} node ASTNode to check - * @returns {boolean} True if there is a chance it contains an Error obj - */ - couldBeError(node) { - switch (node.type) { - case 'Identifier': - case 'CallExpression': - case 'NewExpression': - case 'MemberExpression': - case 'TaggedTemplateExpression': - case 'YieldExpression': - case 'AwaitExpression': { - return true; - } // Possibly an error object. - - case 'AssignmentExpression': { - return module.exports.couldBeError(node.right); - } - - case 'SequenceExpression': { - const exprs = node.expressions; - - return ( - exprs.length > 0 && - module.exports.couldBeError(exprs[exprs.length - 1]) - ); - } - - case 'LogicalExpression': { - return ( - module.exports.couldBeError(node.left) || - module.exports.couldBeError(node.right) - ); - } - - case 'ConditionalExpression': { - return ( - module.exports.couldBeError(node.consequent) || - module.exports.couldBeError(node.alternate) - ); - } - - default: { - return false; - } - } - }, - - /** - * Determines whether the given node is a `null` literal. - * - * @param {ASTNode} node The node to check - * @returns {boolean} `true` if the node is a `null` literal - */ - isNullLiteral(node) { - /* - * Checking `node.value === null` does not guarantee that a literal is a null literal. - * When parsing values that cannot be represented in the current environment (e.g. unicode - * regexes in Node 4), `node.value` is set to `null` because it wouldn't be possible to - * set `node.value` to a unicode regex. To make sure a literal is actually `null`, check - * `node.regex` instead. Also see: https://github.com/eslint/eslint/issues/8020 - */ - return ( - node.type === 'Literal' && - node.value === null && - !node.regex && - !node.bigint - ); - }, - - /** - * Check if a given node is a numeric literal or not. - * - * @param {ASTNode} node The node to check. - * @returns {boolean} `true` if the node is a number or bigint literal. - */ - isNumericLiteral(node) { - return ( - node.type === 'Literal' && - (typeof node.value === 'number' || Boolean(node.bigint)) - ); - }, - - /** - * Determines whether two tokens can safely be placed next to each other without merging into a single token - * - * @param {Token|string} leftValue The left token. If this is a string, it will be tokenized and the last token will be used. - * @param {Token|string} rightValue The right token. If this is a string, it will be tokenized and the first token will be used. - * @returns {boolean} If the tokens cannot be safely placed next to each other, returns `false`. If the tokens can be placed - * next to each other, behavior is undefined (although it should return `true` in most cases). - */ - // eslint-disable-next-line complexity - canTokensBeAdjacent(leftValue, rightValue) { - const espreeOptions = { - ecmaVersion: espree.latestEcmaVersion, - comment: true, - range: true, - }; - - let leftToken; - - if (typeof leftValue === 'string') { - let tokens; - - try { - tokens = espree.tokenize(leftValue, espreeOptions); - } catch { - return false; - } - - const comments = tokens.comments; - - leftToken = tokens[tokens.length - 1]; - if (comments.length > 0) { - const lastComment = comments[comments.length - 1]; - - if (lastComment.range[0] > leftToken.range[0]) { - leftToken = lastComment; - } - } - } else { - leftToken = leftValue; - } - - if (leftToken.type === 'Shebang') { - return false; - } - - let rightToken; - - if (typeof rightValue === 'string') { - let tokens; - - try { - tokens = espree.tokenize(rightValue, espreeOptions); - } catch { - return false; - } - - const comments = tokens.comments; - - rightToken = tokens[0]; - if (comments.length > 0) { - const firstComment = comments[0]; - - if (firstComment.range[0] < rightToken.range[0]) { - rightToken = firstComment; - } - } - } else { - rightToken = rightValue; - } - - if (leftToken.type === 'Punctuator' || rightToken.type === 'Punctuator') { - if (leftToken.type === 'Punctuator' && rightToken.type === 'Punctuator') { - const PLUS_TOKENS = new Set(['+', '++']); - const MINUS_TOKENS = new Set(['-', '--']); - - return !( - (PLUS_TOKENS.has(leftToken.value) && - PLUS_TOKENS.has(rightToken.value)) || - (MINUS_TOKENS.has(leftToken.value) && - MINUS_TOKENS.has(rightToken.value)) - ); - } - - if (leftToken.type === 'Punctuator' && leftToken.value === '/') { - return !['Block', 'Line', 'RegularExpression'].includes( - rightToken.type, - ); - } - - return true; - } - - if ( - leftToken.type === 'String' || - rightToken.type === 'String' || - leftToken.type === 'Template' || - rightToken.type === 'Template' - ) { - return true; - } - - if ( - leftToken.type !== 'Numeric' && - rightToken.type === 'Numeric' && - rightToken.value.startsWith('.') - ) { - return true; - } - - if ( - leftToken.type === 'Block' || - rightToken.type === 'Block' || - rightToken.type === 'Line' - ) { - return true; - } - - return false; - }, - - /** - * Get the `loc` object of a given name in a `/*globals` directive comment. - * - * @param {SourceCode} sourceCode The source code to convert index to loc. - * @param {Comment} comment The `/*globals` directive comment which include the name. - * @param {string} name The name to find. - * @returns {SourceLocation} The `loc` object. - */ - getNameLocationInGlobalDirectiveComment(sourceCode, comment, name) { - const namePattern = new RegExp( - `[\\s,]${lodash.escapeRegExp(name)}(?:$|[\\s,:])`, - 'gu', - ); - - // To ignore the first text "global". - namePattern.lastIndex = comment.value.indexOf('global') + 6; - - // Search a given variable name. - const match = namePattern.exec(comment.value); - - // Convert the index to loc. - return sourceCode.getLocFromIndex( - comment.range[0] + '/*'.length + (match ? match.index + 1 : 0), - ); - }, - - /** - * Determines whether the given raw string contains an octal escape sequence. - * - * "\1", "\2" ... "\7" - * "\00", "\01" ... "\09" - * - * "\0", when not followed by a digit, is not an octal escape sequence. - * - * @param {string} rawString A string in its raw representation. - * @returns {boolean} `true` if the string contains at least one octal escape sequence. - */ - hasOctalEscapeSequence(rawString) { - return OCTAL_ESCAPE_PATTERN.test(rawString); - }, -}; diff --git a/fixtures/eslint/lib/source-code/source-code.js b/fixtures/eslint/lib/source-code/source-code.js deleted file mode 100644 index f469b6ee..00000000 --- a/fixtures/eslint/lib/source-code/source-code.js +++ /dev/null @@ -1,684 +0,0 @@ -/** - * @file Abstraction of JavaScript source code. - * @author Nicholas C. Zakas - */ -'use strict'; - -// ------------------------------------------------------------------------------ -// Requirements -// ------------------------------------------------------------------------------ - -const { isCommentToken } = require('eslint-utils'); -const lodash = require('lodash'); - -const astUtils = require('../shared/ast-utils'); -const Traverser = require('../shared/traverser'); - -const TokenStore = require('./token-store'); - -// ------------------------------------------------------------------------------ -// Private -// ------------------------------------------------------------------------------ - -/** - * Validates that the given AST has the required information. - * - * @param {ASTNode} ast The Program node of the AST to check. - * @throws {Error} If the AST doesn't contain the correct information. - * @returns {void} - * @private - */ -function validate(ast) { - if (!ast.tokens) { - throw new Error('AST is missing the tokens array.'); - } - - if (!ast.comments) { - throw new Error('AST is missing the comments array.'); - } - - if (!ast.loc) { - throw new Error('AST is missing location information.'); - } - - if (!ast.range) { - throw new Error('AST is missing range information'); - } -} - -/** - * Check to see if its a ES6 export declaration. - * - * @param {ASTNode} astNode An AST node. - * @returns {boolean} whether the given node represents an export declaration. - * @private - */ -function looksLikeExport(astNode) { - return ( - astNode.type === 'ExportDefaultDeclaration' || - astNode.type === 'ExportNamedDeclaration' || - astNode.type === 'ExportAllDeclaration' || - astNode.type === 'ExportSpecifier' - ); -} - -/** - * Merges two sorted lists into a larger sorted list in O(n) time. - * - * @param {Token[]} tokens The list of tokens. - * @param {Token[]} comments The list of comments. - * @returns {Token[]} A sorted list of tokens and comments. - * @private - */ -function sortedMerge(tokens, comments) { - const result = []; - let tokenIndex = 0; - let commentIndex = 0; - - while (tokenIndex < tokens.length || commentIndex < comments.length) { - if ( - commentIndex >= comments.length || - (tokenIndex < tokens.length && - tokens[tokenIndex].range[0] < comments[commentIndex].range[0]) - ) { - result.push(tokens[tokenIndex++]); - } else { - result.push(comments[commentIndex++]); - } - } - - return result; -} - -/** - * Determines if two nodes or tokens overlap. - * - * @param {ASTNode|Token} first The first node or token to check. - * @param {ASTNode|Token} second The second node or token to check. - * @returns {boolean} True if the two nodes or tokens overlap. - * @private - */ -function nodesOrTokensOverlap(first, second) { - return ( - (first.range[0] <= second.range[0] && first.range[1] >= second.range[0]) || - (second.range[0] <= first.range[0] && second.range[1] >= first.range[0]) - ); -} - -/** - * Determines if two nodes or tokens have at least one whitespace character - * between them. Order does not matter. Returns false if the given nodes or - * tokens overlap. - * - * @param {SourceCode} sourceCode The source code object. - * @param {ASTNode|Token} first The first node or token to check between. - * @param {ASTNode|Token} second The second node or token to check between. - * @param {boolean} checkInsideOfJSXText If `true` is present, check inside of JSXText tokens for backward compatibility. - * @returns {boolean} True if there is a whitespace character between - * any of the tokens found between the two given nodes or tokens. - * @public - */ -function isSpaceBetween(sourceCode, first, second, checkInsideOfJSXText) { - if (nodesOrTokensOverlap(first, second)) { - return false; - } - - const [startingNodeOrToken, endingNodeOrToken] = - first.range[1] <= second.range[0] ? [first, second] : [second, first]; - const firstToken = - sourceCode.getLastToken(startingNodeOrToken) || startingNodeOrToken; - const finalToken = - sourceCode.getFirstToken(endingNodeOrToken) || endingNodeOrToken; - let currentToken = firstToken; - - while (currentToken !== finalToken) { - const nextToken = sourceCode.getTokenAfter(currentToken, { - includeComments: true, - }); - - if ( - currentToken.range[1] !== nextToken.range[0] || - /* - * For backward compatibility, check spaces in JSXText. - * https://github.com/eslint/eslint/issues/12614 - */ - (checkInsideOfJSXText && - nextToken !== finalToken && - nextToken.type === 'JSXText' && - /\s/u.test(nextToken.value)) - ) { - return true; - } - - currentToken = nextToken; - } - - return false; -} - -// ------------------------------------------------------------------------------ -// Public Interface -// ------------------------------------------------------------------------------ - -class SourceCode extends TokenStore { - /** - * Represents parsed source code. - * - * @param {string|object} textOrConfig The source code text or config object. - * @param {string} textOrConfig.text The source code text. - * @param {ASTNode} textOrConfig.ast The Program node of the AST representing the code. This AST should be created from the text that BOM was stripped. - * @param {object|null} textOrConfig.parserServices The parser services. - * @param {ScopeManager|null} textOrConfig.scopeManager The scope of this source code. - * @param {object|null} textOrConfig.visitorKeys The visitor keys to traverse AST. - * @param {ASTNode} [astIfNoConfig] The Program node of the AST representing the code. This AST should be created from the text that BOM was stripped. - */ - constructor(textOrConfig, astIfNoConfig) { - let text, ast, parserServices, scopeManager, visitorKeys; - - // Process overloading. - if (typeof textOrConfig === 'string') { - text = textOrConfig; - ast = astIfNoConfig; - } else if (typeof textOrConfig === 'object' && textOrConfig !== null) { - text = textOrConfig.text; - ast = textOrConfig.ast; - parserServices = textOrConfig.parserServices; - scopeManager = textOrConfig.scopeManager; - visitorKeys = textOrConfig.visitorKeys; - } - - validate(ast); - super(ast.tokens, ast.comments); - - /** - * The flag to indicate that the source code has Unicode BOM. - * - * @type boolean - */ - this.hasBOM = text.codePointAt(0) === 0xfe_ff; - - /** - * The original text source code. - * BOM was stripped from this text. - * - * @type string - */ - this.text = this.hasBOM ? text.slice(1) : text; - - /** - * The parsed AST for the source code. - * - * @type ASTNode - */ - this.ast = ast; - - /** - * The parser services of this source code. - * - * @type {object} - */ - this.parserServices = parserServices || {}; - - /** - * The scope of this source code. - * - * @type {ScopeManager|null} - */ - this.scopeManager = scopeManager || null; - - /** - * The visitor keys to traverse AST. - * - * @type {object} - */ - this.visitorKeys = visitorKeys || Traverser.DEFAULT_VISITOR_KEYS; - - // Check the source text for the presence of a shebang since it is parsed as a standard line comment. - const shebangMatched = this.text.match(astUtils.shebangPattern); - const hasShebang = - shebangMatched && - ast.comments.length > 0 && - ast.comments[0].value === shebangMatched[1]; - - if (hasShebang) { - ast.comments[0].type = 'Shebang'; - } - - this.tokensAndComments = sortedMerge(ast.tokens, ast.comments); - - /** - * The source code split into lines according to ECMA-262 specification. - * This is done to avoid each rule needing to do so separately. - * - * @type string[] - */ - this.lines = []; - this.lineStartIndices = [0]; - - const lineEndingPattern = astUtils.createGlobalLinebreakMatcher(); - let match; - - /* - * Previously, this was implemented using a regex that - * matched a sequence of non-linebreak characters followed by a - * linebreak, then adding the lengths of the matches. However, - * this caused a catastrophic backtracking issue when the end - * of a file contained a large number of non-newline characters. - * To avoid this, the current implementation just matches newlines - * and uses match.index to get the correct line start indices. - */ - while ((match = lineEndingPattern.exec(this.text))) { - this.lines.push( - this.text.slice( - this.lineStartIndices[this.lineStartIndices.length - 1], - match.index, - ), - ); - this.lineStartIndices.push(match.index + match[0].length); - } - - this.lines.push( - this.text.slice(this.lineStartIndices[this.lineStartIndices.length - 1]), - ); - - // Cache for comments found using getComments(). - this._commentCache = new WeakMap(); - - // Don't allow modification of this object - Object.freeze(this); - Object.freeze(this.lines); - } - - /** - * Split the source code into multiple lines based on the line delimiters. - * - * @param {string} text Source code as a string. - * @returns {string[]} Array of source code lines. - * @public - */ - static splitLines(text) { - return text.split(astUtils.createGlobalLinebreakMatcher()); - } - - /** - * Gets the source code for the given node. - * - * @param {ASTNode} [node] The AST node to get the text for. - * @param {int} [beforeCount] The number of characters before the node to retrieve. - * @param {int} [afterCount] The number of characters after the node to retrieve. - * @returns {string} The text representing the AST node. - * @public - */ - getText(node, beforeCount, afterCount) { - if (node) { - return this.text.slice( - Math.max(node.range[0] - (beforeCount || 0), 0), - node.range[1] + (afterCount || 0), - ); - } - - return this.text; - } - - /** - * Gets the entire source text split into an array of lines. - * - * @returns {Array} The source text as an array of lines. - * @public - */ - getLines() { - return this.lines; - } - - /** - * Retrieves an array containing all comments in the source code. - * - * @returns {ASTNode[]} An array of comment nodes. - * @public - */ - getAllComments() { - return this.ast.comments; - } - - /** - * Gets all comments for the given node. - * - * @param {ASTNode} node The AST node to get the comments for. - * @returns {object} An object containing a leading and trailing array - * of comments indexed by their position. - * @public - */ - // eslint-disable-next-line complexity - getComments(node) { - if (this._commentCache.has(node)) { - return this._commentCache.get(node); - } - - const comments = { - leading: [], - trailing: [], - }; - - /* - * Return all comments as leading comments of the Program node when - * there is no executable code. - */ - if (node.type === 'Program') { - if (node.body.length === 0) { - comments.leading = node.comments; - } - } else { - /* - * Return comments as trailing comments of nodes that only contain - * comments (to mimic the comment attachment behavior present in Espree). - */ - if ( - ((node.type === 'BlockStatement' || node.type === 'ClassBody') && - node.body.length === 0) || - (node.type === 'ObjectExpression' && node.properties.length === 0) || - (node.type === 'ArrayExpression' && node.elements.length === 0) || - (node.type === 'SwitchStatement' && node.cases.length === 0) - ) { - comments.trailing = this.getTokens(node, { - includeComments: true, - filter: isCommentToken, - }); - } - - /* - * Iterate over tokens before and after node and collect comment tokens. - * Do not include comments that exist outside of the parent node - * to avoid duplication. - */ - let currentToken = this.getTokenBefore(node, { includeComments: true }); - - while (currentToken && isCommentToken(currentToken)) { - if (node.parent && currentToken.start < node.parent.start) { - break; - } - - comments.leading.push(currentToken); - currentToken = this.getTokenBefore(currentToken, { - includeComments: true, - }); - } - - comments.leading.reverse(); - - currentToken = this.getTokenAfter(node, { includeComments: true }); - - while (currentToken && isCommentToken(currentToken)) { - if (node.parent && currentToken.end > node.parent.end) { - break; - } - - comments.trailing.push(currentToken); - currentToken = this.getTokenAfter(currentToken, { - includeComments: true, - }); - } - } - - this._commentCache.set(node, comments); - return comments; - } - - /** - * Retrieves the JSDoc comment for a given node. - * - * @param {ASTNode} node The AST node to get the comment for. - * @returns {Token|null} The Block comment token containing the JSDoc comment - * for the given node or null if not found. - * @public - * @deprecated - */ - getJSDocComment(node) { - /** - * Checks for the presence of a JSDoc comment for the given node and returns it. - * - * @param {ASTNode} astNode The AST node to get the comment for. - * @returns {Token|null} The Block comment token containing the JSDoc comment - * for the given node or null if not found. - * @private - */ - // eslint-disable-next-line @cloudfour/unicorn/consistent-function-scoping - const findJSDocComment = (astNode) => { - const tokenBefore = this.getTokenBefore(astNode, { - includeComments: true, - }); - - if ( - tokenBefore && - isCommentToken(tokenBefore) && - tokenBefore.type === 'Block' && - tokenBefore.value.charAt(0) === '*' && - astNode.loc.start.line - tokenBefore.loc.end.line <= 1 - ) { - return tokenBefore; - } - - return null; - }; - - let parent = node.parent; - - switch (node.type) { - case 'ClassDeclaration': - case 'FunctionDeclaration': { - return findJSDocComment(looksLikeExport(parent) ? parent : node); - } - - case 'ClassExpression': { - return findJSDocComment(parent.parent); - } - - case 'ArrowFunctionExpression': - case 'FunctionExpression': { - if ( - parent.type !== 'CallExpression' && - parent.type !== 'NewExpression' - ) { - while ( - this.getCommentsBefore(parent).length === 0 && - !/Function/u.test(parent.type) && - parent.type !== 'MethodDefinition' && - parent.type !== 'Property' - ) { - parent = parent.parent; - - if (!parent) { - break; - } - } - - if ( - parent && - parent.type !== 'FunctionDeclaration' && - parent.type !== 'Program' - ) { - return findJSDocComment(parent); - } - } - - return findJSDocComment(node); - } - - // Falls through - default: { - return null; - } - } - } - - /** - * Gets the deepest node containing a range index. - * - * @param {int} index Range index of the desired node. - * @returns {ASTNode} The node if found or null if not found. - * @public - */ - getNodeByRangeIndex(index) { - let result = null; - - Traverser.traverse(this.ast, { - visitorKeys: this.visitorKeys, - enter(node) { - if (node.range[0] <= index && index < node.range[1]) { - result = node; - } else { - this.skip(); - } - }, - leave(node) { - if (node === result) { - this.break(); - } - }, - }); - - return result; - } - - /** - * Determines if two nodes or tokens have at least one whitespace character - * between them. Order does not matter. Returns false if the given nodes or - * tokens overlap. - * - * @param {ASTNode|Token} first The first node or token to check between. - * @param {ASTNode|Token} second The second node or token to check between. - * @returns {boolean} True if there is a whitespace character between - * any of the tokens found between the two given nodes or tokens. - * @public - */ - isSpaceBetween(first, second) { - return isSpaceBetween(this, first, second, false); - } - - /** - * Determines if two nodes or tokens have at least one whitespace character - * between them. Order does not matter. Returns false if the given nodes or - * tokens overlap. - * For backward compatibility, this method returns true if there are - * `JSXText` tokens that contain whitespaces between the two. - * - * @param {ASTNode|Token} first The first node or token to check between. - * @param {ASTNode|Token} second The second node or token to check between. - * @returns {boolean} True if there is a whitespace character between - * any of the tokens found between the two given nodes or tokens. - * @deprecated in favor of isSpaceBetween(). - * @public - */ - isSpaceBetweenTokens(first, second) { - return isSpaceBetween(this, first, second, true); - } - - /** - * Converts a source text index into a (line, column) pair. - * - * @param {number} index The index of a character in a file - * @returns {object} A {line, column} location object with a 0-indexed column - * @public - */ - getLocFromIndex(index) { - if (typeof index !== 'number') { - throw new TypeError('Expected `index` to be a number.'); - } - - if (index < 0 || index > this.text.length) { - throw new RangeError( - `Index out of range (requested index ${index}, but source text has length ${this.text.length}).`, - ); - } - - /* - * For an argument of this.text.length, return the location one "spot" past the last character - * of the file. If the last character is a linebreak, the location will be column 0 of the next - * line; otherwise, the location will be in the next column on the same line. - * - * See getIndexFromLoc for the motivation for this special case. - */ - if (index === this.text.length) { - return { - line: this.lines.length, - column: this.lines[this.lines.length - 1].length, - }; - } - - /* - * To figure out which line rangeIndex is on, determine the last index at which rangeIndex could - * be inserted into lineIndices to keep the list sorted. - */ - const lineNumber = lodash.sortedLastIndex(this.lineStartIndices, index); - - return { - line: lineNumber, - column: index - this.lineStartIndices[lineNumber - 1], - }; - } - - /** - * Converts a (line, column) pair into a range index. - * - * @param {object} loc A line/column location - * @param {number} loc.line The line number of the location (1-indexed) - * @param {number} loc.column The column number of the location (0-indexed) - * @returns {number} The range index of the location in the file. - * @public - */ - getIndexFromLoc(loc) { - if ( - typeof loc !== 'object' || - typeof loc.line !== 'number' || - typeof loc.column !== 'number' - ) { - throw new TypeError( - 'Expected `loc` to be an object with numeric `line` and `column` properties.', - ); - } - - if (loc.line <= 0) { - throw new RangeError( - `Line number out of range (line ${loc.line} requested). Line numbers should be 1-based.`, - ); - } - - if (loc.line > this.lineStartIndices.length) { - throw new RangeError( - `Line number out of range (line ${loc.line} requested, but only ${this.lineStartIndices.length} lines present).`, - ); - } - - const lineStartIndex = this.lineStartIndices[loc.line - 1]; - const lineEndIndex = - loc.line === this.lineStartIndices.length - ? this.text.length - : this.lineStartIndices[loc.line]; - const positionIndex = lineStartIndex + loc.column; - - /* - * By design, getIndexFromLoc({ line: lineNum, column: 0 }) should return the start index of - * the given line, provided that the line number is valid element of this.lines. Since the - * last element of this.lines is an empty string for files with trailing newlines, add a - * special case where getting the index for the first location after the end of the file - * will return the length of the file, rather than throwing an error. This allows rules to - * use getIndexFromLoc consistently without worrying about edge cases at the end of a file. - */ - if ( - (loc.line === this.lineStartIndices.length && - positionIndex > lineEndIndex) || - (loc.line < this.lineStartIndices.length && positionIndex >= lineEndIndex) - ) { - throw new RangeError( - `Column number out of range (column ${ - loc.column - } requested, but the length of line ${loc.line} is ${ - lineEndIndex - lineStartIndex - }).`, - ); - } - - return positionIndex; - } -} - -module.exports = SourceCode; diff --git a/fixtures/eslint/tools/code-sample-minimizer.js b/fixtures/eslint/tools/code-sample-minimizer.js deleted file mode 100644 index e50f6063..00000000 --- a/fixtures/eslint/tools/code-sample-minimizer.js +++ /dev/null @@ -1,236 +0,0 @@ -'use strict'; - -const assert = require('node:assert'); - -const evk = require('eslint-visitor-keys'); -const espree = require('espree'); -const recast = require('recast'); - -/** - * Determines whether an AST node could be an expression, based on the type - * - * @param {ASTNode} node The node - * @returns {boolean} `true` if the node could be an expression - */ -function isMaybeExpression(node) { - return ( - node.type.endsWith('Expression') || - node.type === 'Identifier' || - node.type === 'MetaProperty' || - node.type.endsWith('Literal') - ); -} - -/** - * Determines whether an AST node is a statement - * - * @param {ASTNode} node The node - * @returns {boolean} `true` if the node is a statement - */ -function isStatement(node) { - return node.type.endsWith('Statement') || node.type.endsWith('Declaration'); -} - -/** - * Given "bad" source text (e.g. an code sample that causes a rule to crash), tries to return a smaller - * piece of source text which is also "bad", to make it easier for a human to figure out where the - * problem is. - * - * @param {object} options Options to process - * @param {string} options.sourceText Initial piece of "bad" source text - * @param {function(string): boolean} options.predicate A predicate that returns `true` for bad source text and `false` for good source text - * @param {Parser} [options.parser] The parser used to parse the source text. Defaults to a modified - * version of espree that uses recent parser options. - * @param {object} [options.visitorKeys] The visitor keys of the AST. Defaults to eslint-visitor-keys. - * @returns {string} Another piece of "bad" source text, which may or may not be smaller than the original source text. - */ -function reduceBadExampleSize({ - sourceText, - predicate, - parser = { - parse: (code, options) => - espree.parse(code, { - ...options, - loc: true, - range: true, - raw: true, - tokens: true, - comment: true, - eslintVisitorKeys: true, - eslintScopeManager: true, - ecmaVersion: 2018, - sourceType: 'script', - }), - }, - visitorKeys = evk.KEYS, -}) { - let counter = 0; - - /** - * Returns a new unique identifier - * - * @returns {string} A name for a new identifier - */ - function generateNewIdentifierName() { - return `$${counter++}`; - } - - /** - * Determines whether a source text sample is "bad" - * - * @param {string} updatedSourceText The sample - * @returns {boolean} `true` if the sample is "bad" - */ - function reproducesBadCase(updatedSourceText) { - try { - parser.parse(updatedSourceText); - } catch { - return false; - } - - return predicate(updatedSourceText); - } - - assert( - reproducesBadCase(sourceText), - 'Original source text should reproduce issue', - ); - const parseResult = recast.parse(sourceText, { parser }); - - /** - * Recursively removes descendant subtrees of the given AST node and replaces - * them with simplified variants to produce a simplified AST which is still considered "bad". - * - * @param {ASTNode} node An AST node to prune. May be mutated by this call, but the - * resulting AST will still produce "bad" source code. - * @returns {void} - */ - function pruneIrrelevantSubtrees(node) { - for (const key of visitorKeys[node.type]) { - if (Array.isArray(node[key])) { - for (let index = node[key].length - 1; index >= 0; index--) { - const [childNode] = node[key].splice(index, 1); - - if (!reproducesBadCase(recast.print(parseResult).code)) { - node[key].splice(index, 0, childNode); - // eslint-disable-next-line max-depth - if (childNode) { - pruneIrrelevantSubtrees(childNode); - } - } - } - } else if (typeof node[key] === 'object' && node[key] !== null) { - const childNode = node[key]; - - if (isMaybeExpression(childNode)) { - node[key] = { - type: 'Identifier', - name: generateNewIdentifierName(), - range: childNode.range, - }; - if (!reproducesBadCase(recast.print(parseResult).code)) { - node[key] = childNode; - pruneIrrelevantSubtrees(childNode); - } - } else if (isStatement(childNode)) { - node[key] = { type: 'EmptyStatement', range: childNode.range }; - if (!reproducesBadCase(recast.print(parseResult).code)) { - node[key] = childNode; - pruneIrrelevantSubtrees(childNode); - } - } - } - } - } - - /** - * Recursively tries to extract a descendant node from the AST that is "bad" on its own - * - * @param {ASTNode} node A node which produces "bad" source code - * @returns {ASTNode} A descendent of `node` which is also bad - */ - function extractRelevantChild(node) { - const childNodes = visitorKeys[node.type].flatMap((key) => - Array.isArray(node[key]) ? node[key] : [node[key]], - ); - - for (const childNode of childNodes) { - if (!childNode) { - continue; - } - - if (isMaybeExpression(childNode)) { - if (reproducesBadCase(recast.print(childNode).code)) { - return extractRelevantChild(childNode); - } - } else if (isStatement(childNode)) { - if (reproducesBadCase(recast.print(childNode).code)) { - return extractRelevantChild(childNode); - } - } else { - const childResult = extractRelevantChild(childNode); - - if (reproducesBadCase(recast.print(childResult).code)) { - return childResult; - } - } - } - - return node; - } - - /** - * Removes and simplifies comments from the source text - * - * @param {string} text A piece of "bad" source text - * @returns {string} A piece of "bad" source text with fewer and/or simpler comments. - */ - function removeIrrelevantComments(text) { - const ast = parser.parse(text); - - if (ast.comments) { - for (const comment of ast.comments) { - for (const potentialSimplification of [ - // Try deleting the comment - `${text.slice(0, comment.range[0])}${text.slice(comment.range[1])}`, - - // Try replacing the comment with a space - `${text.slice(0, comment.range[0])} ${text.slice(comment.range[1])}`, - - // Try deleting the contents of the comment - text.slice(0, comment.range[0] + 2) + - text.slice( - comment.type === 'Block' - ? comment.range[1] - 2 - : comment.range[1], - ), - ]) { - if (reproducesBadCase(potentialSimplification)) { - return removeIrrelevantComments(potentialSimplification); - } - } - } - } - - return text; - } - - pruneIrrelevantSubtrees(parseResult.program); - const relevantChild = recast.print( - extractRelevantChild(parseResult.program), - ).code; - - assert( - reproducesBadCase(relevantChild), - 'Extracted relevant source text should reproduce issue', - ); - const result = removeIrrelevantComments(relevantChild); - - assert( - reproducesBadCase(result), - 'Source text with irrelevant comments removed should reproduce issue', - ); - return result; -} - -module.exports = reduceBadExampleSize; diff --git a/fixtures/got/benchmark/index.ts b/fixtures/got/benchmark/index.ts deleted file mode 100644 index 7125ebb8..00000000 --- a/fixtures/got/benchmark/index.ts +++ /dev/null @@ -1,228 +0,0 @@ -'use strict'; -import { URL } from 'node:url'; -import axios from 'axios'; -import fetch from 'node-fetch'; -import got from '../source'; -import PromisableRequest from '../source/as-promise/core'; -import Request, { kIsNormalizedAlready } from '../source/core'; -import https = require('https'); -import Benchmark = require('benchmark'); -import request = require('request'); - -const { normalizeArguments } = PromisableRequest; - -// Configuration -const httpsAgent = new https.Agent({ - keepAlive: true, - rejectUnauthorized: false, -}); - -const url = new URL('https://127.0.0.1:8080'); -const urlString = url.toString(); - -const gotOptions = { - agent: { - https: httpsAgent, - }, - https: { - rejectUnauthorized: false, - }, - retry: 0, -}; - -const normalizedGotOptions = normalizeArguments(url, gotOptions); -normalizedGotOptions[kIsNormalizedAlready] = true; - -const requestOptions = { - strictSSL: false, - agent: httpsAgent, -}; - -const fetchOptions = { - agent: httpsAgent, -}; - -const axiosOptions = { - url: urlString, - httpsAgent, - https: { - rejectUnauthorized: false, - }, -}; - -const axiosStreamOptions: typeof axiosOptions & { responseType: 'stream' } = { - ...axiosOptions, - responseType: 'stream', -}; - -const httpsOptions = { - https: { - rejectUnauthorized: false, - }, - agent: httpsAgent, -}; - -const suite = new Benchmark.Suite(); - -// Benchmarking -suite - .add('got - promise', { - defer: true, - fn: async (deferred: { resolve: () => void }) => { - await got(url, gotOptions); - deferred.resolve(); - }, - }) - .add('got - stream', { - defer: true, - fn: (deferred: { resolve: () => void }) => { - got - .stream(url, gotOptions) - .resume() - .once('end', () => { - deferred.resolve(); - }); - }, - }) - .add('got - promise core', { - defer: true, - fn: (deferred: { resolve: () => void }) => { - const stream = new PromisableRequest(url, gotOptions); - stream.resume().once('end', () => { - deferred.resolve(); - }); - }, - }) - .add('got - stream core', { - defer: true, - fn: (deferred: { resolve: () => void }) => { - const stream = new Request(url, gotOptions); - stream.resume().once('end', () => { - deferred.resolve(); - }); - }, - }) - .add('got - stream core - normalized options', { - defer: true, - fn: (deferred: { resolve: () => void }) => { - const stream = new Request(undefined as any, normalizedGotOptions); - stream.resume().once('end', () => { - deferred.resolve(); - }); - }, - }) - .add('request - callback', { - defer: true, - fn: (deferred: { resolve: () => void }) => { - request(urlString, requestOptions, (error?: Error) => { - if (error) { - throw error; - } - - deferred.resolve(); - }); - }, - }) - .add('request - stream', { - defer: true, - fn: (deferred: { resolve: () => void }) => { - const stream = request(urlString, requestOptions); - stream.resume(); - stream.once('end', () => { - deferred.resolve(); - }); - }, - }) - .add('node-fetch - promise', { - defer: true, - fn: async (deferred: { resolve: () => void }) => { - const response = await fetch(url, fetchOptions); - await response.text(); - - deferred.resolve(); - }, - }) - .add('node-fetch - stream', { - defer: true, - fn: async (deferred: { resolve: () => void }) => { - const { body } = await fetch(url, fetchOptions); - - body.resume(); - body.once('end', () => { - deferred.resolve(); - }); - }, - }) - .add('axios - promise', { - defer: true, - fn: async (deferred: { resolve: () => void }) => { - await axios.request(axiosOptions); - deferred.resolve(); - }, - }) - .add('axios - stream', { - defer: true, - fn: async (deferred: { resolve: () => void }) => { - const { data } = await axios.request(axiosStreamOptions); - data.resume(); - data.once('end', () => { - deferred.resolve(); - }); - }, - }) - .add('https - stream', { - defer: true, - fn: (deferred: { resolve: () => void }) => { - https - .request(urlString, httpsOptions, (response) => { - response.resume(); - response.once('end', () => { - deferred.resolve(); - }); - }) - .end(); - }, - }) - .on('cycle', (event: Benchmark.Event) => { - console.log(String(event.target)); - }) - .on('complete', function (this: any) { - console.log(`Fastest is ${this.filter('fastest').map('name') as string}`); - - internalBenchmark(); - }) - .run(); - -const internalBenchmark = (): void => { - console.log(); - - const internalSuite = new Benchmark.Suite(); - internalSuite - .add('got - normalize options', { - fn: () => { - normalizeArguments(url, gotOptions); - }, - }) - .on('cycle', (event: Benchmark.Event) => { - console.log(String(event.target)); - }); - - internalSuite.run(); -}; - -// Results (i7-7700k, CPU governor: performance): -// got - promise x 3,204 ops/sec ±5.27% (73 runs sampled) -// got - stream x 5,045 ops/sec ±3.85% (77 runs sampled) -// got - promise core x 6,499 ops/sec ±3.67% (77 runs sampled) -// got - stream core x 7,047 ops/sec ±2.32% (83 runs sampled) -// got - stream core - normalized options x 7,313 ops/sec ±2.79% (85 runs sampled) -// request - callback x 6,918 ops/sec ±5.76% (73 runs sampled) -// request - stream x 7,746 ops/sec ±3.20% (82 runs sampled) -// node-fetch - promise x 7,011 ops/sec ±7.54% (75 runs sampled) -// node-fetch - stream x 7,941 ops/sec ±4.52% (82 runs sampled) -// axios - promise x 6,788 ops/sec ±3.32% (80 runs sampled) -// axios - stream x 8,584 ops/sec ±2.23% (81 runs sampled) -// https - stream x 10,465 ops/sec ±2.89% (73 runs sampled) -// Fastest is https - stream - -// got - normalize options x 166,389 ops/sec ±0.63% (91 runs sampled) diff --git a/fixtures/got/source/as-promise/calculate-retry-delay.ts b/fixtures/got/source/as-promise/calculate-retry-delay.ts deleted file mode 100644 index 03dff72c..00000000 --- a/fixtures/got/source/as-promise/calculate-retry-delay.ts +++ /dev/null @@ -1,68 +0,0 @@ -import type { RetryObject, RetryFunction } from './types'; -import { ParseError, HTTPError, MaxRedirectsError } from './types'; - -type Returns unknown, V> = ( - ...args: Parameters -) => V; - -const retryAfterStatusCodes: ReadonlySet = new Set([413, 429, 503]); - -const isErrorWithResponse = ( - error: RetryObject['error'], -): error is HTTPError | ParseError | MaxRedirectsError => - error instanceof HTTPError || - error instanceof ParseError || - error instanceof MaxRedirectsError; - -const calculateRetryDelay: Returns = ({ - attemptCount, - retryOptions, - error, -}) => { - if (attemptCount > retryOptions.limit) { - return 0; - } - - const hasMethod = retryOptions.methods.includes(error.options.method); - const hasErrorCode = retryOptions.errorCodes.includes(error.code); - const hasStatusCode = - isErrorWithResponse(error) && - retryOptions.statusCodes.includes(error.response.statusCode); - if (!hasMethod || (!hasErrorCode && !hasStatusCode)) { - return 0; - } - - if (isErrorWithResponse(error)) { - const { response } = error; - if ( - response && - 'retry-after' in response.headers && - retryAfterStatusCodes.has(response.statusCode) - ) { - let after = Number(response.headers['retry-after']); - if (Number.isNaN(after)) { - after = Date.parse(response.headers['retry-after']) - Date.now(); - } else { - after *= 1000; - } - - if ( - retryOptions.maxRetryAfter === undefined || - after > retryOptions.maxRetryAfter - ) { - return 0; - } - - return after; - } - - if (response.statusCode === 413) { - return 0; - } - } - - const noise = Math.random() * 100; - return 2 ** (attemptCount - 1) * 1000 + noise; -}; - -export default calculateRetryDelay; diff --git a/fixtures/got/source/as-promise/core.ts b/fixtures/got/source/as-promise/core.ts deleted file mode 100644 index 49fb1c53..00000000 --- a/fixtures/got/source/as-promise/core.ts +++ /dev/null @@ -1,191 +0,0 @@ -import type { URL } from 'node:url'; -import is, { assert } from '@sindresorhus/is'; -import type { - Options, - NormalizedOptions, - Defaults, - ResponseType, - Response, -} from './types'; -import { ParseError } from './types'; -import type { Method, ParseJsonFunction } from '../core'; -import Request, { knownHookEvents, RequestError } from '../core'; - -if (!knownHookEvents.includes('beforeRetry' as any)) { - knownHookEvents.push('beforeRetry' as any, 'afterResponse' as any); -} - -export const knownBodyTypes = ['json', 'buffer', 'text']; - -export const parseBody = ( - response: Response, - responseType: string | ResponseType, - parseJson: ParseJsonFunction, - encoding?: BufferEncoding, -): unknown => { - const { rawBody } = response; - - try { - if (responseType === 'text') { - return rawBody.toString(encoding); - } - - if (responseType === 'json') { - return rawBody.length === 0 ? '' : parseJson(rawBody.toString()); - } - - if (responseType === 'buffer') { - return Buffer.from(rawBody); - } - - throw new ParseError( - { - message: `Unknown body type '${responseType}'`, - name: 'Error', - }, - response, - ); - } catch (error) { - throw new ParseError(error, response); - } -}; - -export default class PromisableRequest extends Request { - ['constructor']: typeof PromisableRequest; - declare options: NormalizedOptions; - - static normalizeArguments( - url?: string | URL, - nonNormalizedOptions?: Options, - defaults?: Defaults, - ): NormalizedOptions { - const options = super.normalizeArguments( - url, - nonNormalizedOptions, - defaults, - ); - - if (is.null_(options.encoding)) { - throw new TypeError( - 'To get a Buffer, set `options.responseType` to `buffer` instead', - ); - } - - assert.any([is.string, is.undefined], options.encoding); - assert.any([is.boolean, is.undefined], options.resolveBodyOnly); - assert.any([is.boolean, is.undefined], options.methodRewriting); - assert.any([is.boolean, is.undefined], options.isStream); - assert.any([is.string, is.undefined], options.responseType); - - // `options.responseType` - if (options.responseType === undefined) { - options.responseType = 'text'; - } - - // `options.retry` - const { retry } = options; - - options.retry = defaults - ? { ...defaults.retry } - : { - calculateDelay: (retryObject) => retryObject.computedValue, - limit: 0, - methods: [], - statusCodes: [], - errorCodes: [], - maxRetryAfter: undefined, - }; - - if (is.object(retry)) { - options.retry = { - ...options.retry, - ...retry, - }; - - options.retry.methods = [ - ...new Set( - options.retry.methods.map((method) => method.toUpperCase() as Method), - ), - ]; - options.retry.statusCodes = [...new Set(options.retry.statusCodes)]; - options.retry.errorCodes = [...new Set(options.retry.errorCodes)]; - } else if (is.number(retry)) { - options.retry.limit = retry; - } - - if (is.undefined(options.retry.maxRetryAfter)) { - options.retry.maxRetryAfter = Math.min( - // TypeScript is not smart enough to handle `.filter(x => is.number(x))`. - ...[options.timeout.request, options.timeout.connect].filter(is.number), - ); - } - - // `options.pagination` - if (is.object(options.pagination)) { - if (defaults) { - options.pagination = { - ...defaults.pagination, - ...options.pagination, - }; - } - - const { pagination } = options; - - if (!is.function_(pagination.transform)) { - throw new Error('`options.pagination.transform` must be implemented'); - } - - if (!is.function_(pagination.shouldContinue)) { - throw new Error( - '`options.pagination.shouldContinue` must be implemented', - ); - } - - if (!is.function_(pagination.filter)) { - throw new TypeError('`options.pagination.filter` must be implemented'); - } - - if (!is.function_(pagination.paginate)) { - throw new Error('`options.pagination.paginate` must be implemented'); - } - } - - // JSON mode - if ( - options.responseType === 'json' && - options.headers.accept === undefined - ) { - options.headers.accept = 'application/json'; - } - - return options; - } - - static mergeOptions(...sources: Options[]): NormalizedOptions { - let mergedOptions: NormalizedOptions | undefined; - - for (const source of sources) { - mergedOptions = PromisableRequest.normalizeArguments( - undefined, - source, - mergedOptions, - ); - } - - return mergedOptions; - } - - _beforeError(error: Error): void { - if (this.destroyed) { - return; - } - - if (!(error instanceof RequestError)) { - error = new RequestError(error.message, error, this); - } - - // Let the promise decide whether to abort or not - // It is also responsible for the `beforeError` hook - this.emit('error', error); - } -} diff --git a/fixtures/got/source/as-promise/types.ts b/fixtures/got/source/as-promise/types.ts deleted file mode 100644 index ec322695..00000000 --- a/fixtures/got/source/as-promise/types.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { CancelError } from 'p-cancelable'; -import type { - NormalizedOptions, - Options, - Response, - Method, - TimeoutError, - RequestEvents, -} from '../core'; -import { RequestError } from '../core'; -import PCancelable = require('p-cancelable'); - -export type ResponseType = 'json' | 'buffer' | 'text'; - -export interface RetryObject { - attemptCount: number; - retryOptions: RequiredRetryOptions; - error: TimeoutError | RequestError; - computedValue: number; -} - -export type RetryFunction = ( - retryObject: RetryObject, -) => number | Promise; - -export interface RequiredRetryOptions { - limit: number; - methods: Method[]; - statusCodes: number[]; - errorCodes: string[]; - calculateDelay: RetryFunction; - maxRetryAfter?: number; -} - -export interface PaginationOptions { - pagination?: { - transform?: (response: Response) => Promise | T[]; - filter?: (item: T, allItems: T[], currentItems: T[]) => boolean; - paginate?: ( - response: Response, - allItems: T[], - currentItems: T[], - ) => Options | false; - shouldContinue?: (item: T, allItems: T[], currentItems: T[]) => boolean; - countLimit?: number; - backoff?: number; - requestLimit?: number; - stackAllItems?: boolean; - }; -} - -export type BeforeRetryHook = ( - options: NormalizedOptions, - error?: RequestError, - retryCount?: number, -) => void | Promise; -export type AfterResponseHook = ( - response: Response, - retryWithMergedOptions: (options: Options) => CancelableRequest, -) => - | Response - | CancelableRequest - | Promise>; - -// These should be merged into Options in core/index.ts -// eslint-disable-next-line @cloudfour/typescript-eslint/no-namespace -export namespace PromiseOnly { - export interface Hooks { - beforeRetry?: BeforeRetryHook[]; - afterResponse?: AfterResponseHook[]; - } - - export interface Options extends PaginationOptions { - responseType?: ResponseType; - resolveBodyOnly?: boolean; - retry?: Partial | number; - isStream?: boolean; - encoding?: BufferEncoding; - } - - export interface NormalizedOptions { - responseType: ResponseType; - resolveBodyOnly: boolean; - retry: RequiredRetryOptions; - isStream: boolean; - encoding?: BufferEncoding; - pagination?: Required['pagination']>; - } - - export interface Defaults { - responseType: ResponseType; - resolveBodyOnly: boolean; - retry: RequiredRetryOptions; - isStream: boolean; - pagination?: Required['pagination']>; - } - - export type HookEvent = 'beforeRetry' | 'afterResponse'; -} - -export class ParseError extends RequestError { - declare readonly response: Response; - - constructor(error: Error, response: Response) { - const { options } = response.request; - - super( - `${error.message} in "${options.url.toString()}"`, - error, - response.request, - ); - this.name = 'ParseError'; - - Object.defineProperty(this, 'response', { - enumerable: false, - value: response, - }); - } -} - -export interface CancelableRequest< - T extends Response | Response['body'] = Response['body'], -> extends PCancelable, - RequestEvents> { - json: () => CancelableRequest; - buffer: () => CancelableRequest; - text: () => CancelableRequest; -} - -export { CancelError }; -export * from '../core'; diff --git a/fixtures/got/source/core/utils/options-to-url.ts b/fixtures/got/source/core/utils/options-to-url.ts deleted file mode 100644 index d954ed6e..00000000 --- a/fixtures/got/source/core/utils/options-to-url.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* istanbul ignore file: deprecated */ -import { URL } from 'node:url'; - -export interface URLOptions { - href?: string; - protocol?: string; - host?: string; - hostname?: string; - port?: string | number; - pathname?: string; - search?: string; - searchParams?: unknown; - path?: string; -} - -const keys: Exclude[] = [ - 'protocol', - 'host', - 'hostname', - 'port', - 'pathname', - 'search', -]; - -export default (origin: string, options: URLOptions): URL => { - if (options.path) { - if (options.pathname) { - throw new TypeError( - 'Parameters `path` and `pathname` are mutually exclusive.', - ); - } - - if (options.search) { - throw new TypeError( - 'Parameters `path` and `search` are mutually exclusive.', - ); - } - - if (options.searchParams) { - throw new TypeError( - 'Parameters `path` and `searchParams` are mutually exclusive.', - ); - } - } - - if (options.search && options.searchParams) { - throw new TypeError( - 'Parameters `search` and `searchParams` are mutually exclusive.', - ); - } - - if (!origin) { - if (!options.protocol) { - throw new TypeError('No URL protocol specified'); - } - - origin = `${options.protocol}//${options.hostname ?? options.host ?? ''}`; - } - - const url = new URL(origin); - - if (options.path) { - const searchIndex = options.path.indexOf('?'); - if (searchIndex === -1) { - options.pathname = options.path; - } else { - options.pathname = options.path.slice(0, searchIndex); - options.search = options.path.slice(searchIndex + 1); - } - - delete options.path; - } - - for (const key of keys) { - if (options[key]) { - url[key] = options[key].toString(); - } - } - - return url; -}; diff --git a/fixtures/got/source/core/utils/timed-out.ts b/fixtures/got/source/core/utils/timed-out.ts deleted file mode 100644 index 97fed930..00000000 --- a/fixtures/got/source/core/utils/timed-out.ts +++ /dev/null @@ -1,217 +0,0 @@ -import type { ClientRequest, IncomingMessage } from 'node:http'; -import unhandler from './unhandle'; -import net = require('net'); - -const reentry: unique symbol = Symbol('reentry'); -const noop = (): void => {}; - -interface TimedOutOptions { - host?: string; - hostname?: string; - protocol?: string; -} - -export interface Delays { - lookup?: number; - connect?: number; - secureConnect?: number; - socket?: number; - response?: number; - send?: number; - request?: number; -} - -export type ErrorCode = - | 'ETIMEDOUT' - | 'ECONNRESET' - | 'EADDRINUSE' - | 'ECONNREFUSED' - | 'EPIPE' - | 'ENOTFOUND' - | 'ENETUNREACH' - | 'EAI_AGAIN'; - -export class TimeoutError extends Error { - code: ErrorCode; - - constructor( - threshold: number, - public event: string, - ) { - super(`Timeout awaiting '${event}' for ${threshold}ms`); - - this.name = 'TimeoutError'; - this.code = 'ETIMEDOUT'; - } -} - -export default ( - request: ClientRequest, - delays: Delays, - options: TimedOutOptions, -): (() => void) => { - if (reentry in request) { - return noop; - } - - request[reentry] = true; - const cancelers: (typeof noop)[] = []; - const { once, unhandleAll } = unhandler(); - - const addTimeout = ( - delay: number, - callback: (delay: number, event: string) => void, - event: string, - ): typeof noop => { - const timeout = setTimeout( - callback, - delay, - delay, - event, - ) as unknown as NodeJS.Timeout; - - timeout.unref(); - - const cancel = (): void => { - clearTimeout(timeout); - }; - - cancelers.push(cancel); - - return cancel; - }; - - const { host, hostname } = options; - - const timeoutHandler = (delay: number, event: string): void => { - request.destroy(new TimeoutError(delay, event)); - }; - - const cancelTimeouts = (): void => { - for (const cancel of cancelers) { - cancel(); - } - - unhandleAll(); - }; - - request.once('error', (error) => { - cancelTimeouts(); - - // Save original behavior - /* istanbul ignore next */ - if (request.listenerCount('error') === 0) { - throw error; - } - }); - - request.once('close', cancelTimeouts); - - once(request, 'response', (response: IncomingMessage): void => { - once(response, 'end', cancelTimeouts); - }); - - if (typeof delays.request !== 'undefined') { - addTimeout(delays.request, timeoutHandler, 'request'); - } - - if (typeof delays.socket !== 'undefined') { - const socketTimeoutHandler = (): void => { - timeoutHandler(delays.socket, 'socket'); - }; - - request.setTimeout(delays.socket, socketTimeoutHandler); - - // `request.setTimeout(0)` causes a memory leak. - // We can just remove the listener and forget about the timer - it's unreffed. - // See https://github.com/sindresorhus/got/issues/690 - cancelers.push(() => { - request.removeListener('timeout', socketTimeoutHandler); - }); - } - - once(request, 'socket', (socket: net.Socket): void => { - const { socketPath } = request as ClientRequest & { socketPath?: string }; - - /* istanbul ignore next: hard to test */ - if (socket.connecting) { - const hasPath = Boolean( - socketPath ?? net.isIP(hostname ?? host ?? '') !== 0, - ); - - if ( - typeof delays.lookup !== 'undefined' && - !hasPath && - typeof socket.address().address === 'undefined' - ) { - const cancelTimeout = addTimeout( - delays.lookup, - timeoutHandler, - 'lookup', - ); - once(socket, 'lookup', cancelTimeout); - } - - if (typeof delays.connect !== 'undefined') { - const timeConnect = (): (() => void) => - addTimeout(delays.connect, timeoutHandler, 'connect'); - - if (hasPath) { - once(socket, 'connect', timeConnect()); - } else { - once(socket, 'lookup', (error: Error | null): void => { - if (error === null) { - once(socket, 'connect', timeConnect()); - } - }); - } - } - - if ( - typeof delays.secureConnect !== 'undefined' && - options.protocol === 'https:' - ) { - once(socket, 'connect', (): void => { - const cancelTimeout = addTimeout( - delays.secureConnect, - timeoutHandler, - 'secureConnect', - ); - once(socket, 'secureConnect', cancelTimeout); - }); - } - } - - if (typeof delays.send !== 'undefined') { - const timeRequest = (): (() => void) => - addTimeout(delays.send, timeoutHandler, 'send'); - /* istanbul ignore next: hard to test */ - if (socket.connecting) { - once(socket, 'connect', (): void => { - once(request, 'upload-complete', timeRequest()); - }); - } else { - once(request, 'upload-complete', timeRequest()); - } - } - }); - - if (typeof delays.response !== 'undefined') { - once(request, 'upload-complete', (): void => { - const cancelTimeout = addTimeout( - delays.response, - timeoutHandler, - 'response', - ); - once(request, 'response', cancelTimeout); - }); - } - - return cancelTimeouts; -}; - -declare module 'http' { - interface ClientRequest { - [reentry]: boolean; - } -} diff --git a/fixtures/got/source/create.ts b/fixtures/got/source/create.ts deleted file mode 100644 index da57720e..00000000 --- a/fixtures/got/source/create.ts +++ /dev/null @@ -1,346 +0,0 @@ -import type { URL } from 'node:url'; -import { CancelError } from 'p-cancelable'; -import is from '@sindresorhus/is'; -import type { - // Options - Options, - NormalizedOptions, - - // Hooks - InitHook, -} from './as-promise'; -import asPromise, { - // Request & Response - PromisableRequest, - Response, - - // Errors - ParseError, - RequestError, - CacheError, - ReadError, - HTTPError, - MaxRedirectsError, - TimeoutError, - UnsupportedProtocolError, - UploadError, -} from './as-promise'; -import type { - GotReturn, - ExtendOptions, - Got, - HTTPAlias, - HandlerFunction, - InstanceDefaults, - GotPaginate, - GotStream, - GotRequestFunction, - OptionsWithPagination, - StreamOptions, -} from './types'; -import createRejection from './as-promise/create-rejection'; -import Request, { - kIsNormalizedAlready, - setNonEnumerableProperties, -} from './core'; -import deepFreeze from './utils/deep-freeze'; - -const errors = { - RequestError, - CacheError, - ReadError, - HTTPError, - MaxRedirectsError, - TimeoutError, - ParseError, - CancelError, - UnsupportedProtocolError, - UploadError, -}; - -// The `delay` package weighs 10KB (!) -const delay = async (ms: number) => - new Promise((resolve) => setTimeout(resolve, ms)); - -const { normalizeArguments, mergeOptions } = PromisableRequest; - -const getPromiseOrStream = (options: NormalizedOptions): GotReturn => - options.isStream ? new Request(options.url, options) : asPromise(options); - -const isGotInstance = (value: Got | ExtendOptions): value is Got => - 'defaults' in value && 'options' in value.defaults; - -const aliases: readonly HTTPAlias[] = [ - 'get', - 'post', - 'put', - 'patch', - 'head', - 'delete', -]; - -export const defaultHandler: HandlerFunction = (options, next) => next(options); - -/** - * @param hooks This is an example parameter description - */ -const callInitHooks = ( - hooks: InitHook[] | undefined, - options?: Options, -): void => { - if (hooks) { - for (const hook of hooks) { - hook(options); - } - } -}; - -const create = (defaults: InstanceDefaults): Got => { - // Proxy properties from next handlers - defaults._rawHandlers = defaults.handlers; - defaults.handlers = defaults.handlers.map((fn) => (options, next) => { - // This will be assigned by assigning result - let root!: ReturnType; - - const result = fn(options, (newOptions) => { - root = next(newOptions); - return root; - }); - - if (result !== root && !options.isStream && root) { - const typedResult = result as Promise; - - const { - then: promiseThen, - catch: promiseCatch, - finally: promiseFianlly, - } = typedResult; - Object.setPrototypeOf(typedResult, Object.getPrototypeOf(root)); - Object.defineProperties( - typedResult, - Object.getOwnPropertyDescriptors(root), - ); - - // These should point to the new promise - typedResult.then = promiseThen; - typedResult.catch = promiseCatch; - typedResult.finally = promiseFianlly; - } - - return result; - }); - - // Got interface - const got: Got = ((url: string | URL, options?: Options): GotReturn => { - let iteration = 0; - const iterateHandlers = (newOptions: NormalizedOptions): GotReturn => - defaults.handlers[iteration++]( - newOptions, - iteration === defaults.handlers.length - ? getPromiseOrStream - : iterateHandlers, - ); - - if (is.plainObject(url)) { - const mergedOptions = { - ...(url as Options), - ...options, - }; - - setNonEnumerableProperties([url as Options, options], mergedOptions); - - url = undefined as any; - } - - try { - // Call `init` hooks - let initHookError: Error | undefined; - try { - callInitHooks(defaults.options.hooks.init, options); - callInitHooks(options?.hooks?.init, options); - } catch (error) { - initHookError = error; - } - - // Normalize options & call handlers - const normalizedOptions = normalizeArguments( - url, - options, - defaults.options, - ); - normalizedOptions[kIsNormalizedAlready] = true; - - if (initHookError) { - throw new RequestError( - initHookError.message, - initHookError, - normalizedOptions, - ); - } - - return iterateHandlers(normalizedOptions); - } catch (error) { - if (options?.isStream) { - throw error; - } else { - return createRejection( - error, - defaults.options.hooks.beforeError, - options?.hooks?.beforeError, - ); - } - } - }) as Got; - - got.extend = (...instancesOrOptions) => { - const optionsArray: Options[] = [defaults.options]; - let handlers: HandlerFunction[] = [...defaults._rawHandlers]; - let isMutableDefaults: boolean | undefined; - - for (const value of instancesOrOptions) { - if (isGotInstance(value)) { - optionsArray.push(value.defaults.options); - handlers.push(...value.defaults._rawHandlers); - isMutableDefaults = value.defaults.mutableDefaults; - } else { - optionsArray.push(value); - - if ('handlers' in value) { - handlers.push(...value.handlers); - } - - isMutableDefaults = value.mutableDefaults; - } - } - - handlers = handlers.filter((handler) => handler !== defaultHandler); - - if (handlers.length === 0) { - handlers.push(defaultHandler); - } - - return create({ - options: mergeOptions(...optionsArray), - handlers, - mutableDefaults: Boolean(isMutableDefaults), - }); - }; - - // Pagination - const paginateEach = async function* ( - url: string | URL, - options?: OptionsWithPagination, - ) { - let normalizedOptions = normalizeArguments(url, options, defaults.options); - normalizedOptions.resolveBodyOnly = false; - - const pagination = normalizedOptions.pagination; - - if (!is.object(pagination)) { - throw new TypeError('`options.pagination` must be implemented'); - } - - const all: T[] = []; - let { countLimit } = pagination; - - let numberOfRequests = 0; - while (numberOfRequests < pagination.requestLimit) { - if (numberOfRequests !== 0) { - // eslint-disable-next-line no-await-in-loop - await delay(pagination.backoff); - } - - // eslint-disable-next-line no-await-in-loop - const result = await got(normalizedOptions); - - // eslint-disable-next-line no-await-in-loop - const parsed = await pagination.transform(result); - const current: T[] = []; - - for (const item of parsed) { - if (pagination.filter(item, all, current)) { - if (!pagination.shouldContinue(item, all, current)) { - return; - } - - yield item; - - if (pagination.stackAllItems) { - all.push(item as T); - } - - current.push(item as T); - - if (--countLimit <= 0) { - return; - } - } - } - - const optionsToMerge = pagination.paginate(result, all, current); - - if (optionsToMerge === false) { - return; - } - - if (optionsToMerge === result.request.options) { - normalizedOptions = result.request.options; - } else if (optionsToMerge !== undefined) { - normalizedOptions = normalizeArguments( - undefined, - optionsToMerge, - normalizedOptions, - ); - } - - numberOfRequests++; - } - }; - - got.paginate = (( - url: string | URL, - options?: OptionsWithPagination, - ) => paginateEach(url, options)) as GotPaginate; - - got.paginate.all = (async ( - url: string | URL, - options?: OptionsWithPagination, - ) => { - const results: T[] = []; - - for await (const item of got.paginate(url, options)) { - results.push(item); - } - - return results; - }) as GotPaginate['all']; - - // For those who like very descriptive names - got.paginate.each = paginateEach as GotPaginate['each']; - - // Stream API - got.stream = ((url: string | URL, options?: StreamOptions) => - got(url, { ...options, isStream: true })) as GotStream; - - // Shortcuts - for (const method of aliases) { - got[method] = ((url: string | URL, options?: Options): GotReturn => - got(url, { ...options, method })) as GotRequestFunction; - - got.stream[method] = ((url: string | URL, options?: StreamOptions) => - got(url, { ...options, method, isStream: true })) as GotStream; - } - - Object.assign(got, { ...errors, mergeOptions }); - Object.defineProperty(got, 'defaults', { - value: defaults.mutableDefaults ? defaults : deepFreeze(defaults), - writable: defaults.mutableDefaults, - configurable: defaults.mutableDefaults, - enumerable: true, - }); - - return got; -}; - -export default create; -export * from './types'; diff --git a/fixtures/load-repo.mjs b/fixtures/load-repo.mjs deleted file mode 100755 index f406e366..00000000 --- a/fixtures/load-repo.mjs +++ /dev/null @@ -1,232 +0,0 @@ -#!/usr/bin/env node - -import { spawn } from 'node:child_process'; -import { existsSync } from 'node:fs'; -import { readFile, writeFile } from 'node:fs/promises'; -import { createRequire } from 'node:module'; -import { dirname, join } from 'node:path'; -import { fileURLToPath } from 'node:url'; - -import * as babelDefault from '@babel/core'; -import rm from 'eliminate'; -import { ESLint } from 'eslint'; -// eslint-disable-next-line @cloudfour/n/file-extension-in-import -import kleur from 'kleur'; -import mkdir from 'mkdirplz'; -import walk from 'powerwalker'; -import { format } from 'prettier'; -import prompts from 'prompts'; - -const fixturesDir = dirname(fileURLToPath(import.meta.url)); -const reposDir = join(fixturesDir, 'repos'); -const require = createRequire(import.meta.url); -const prettierOpts = { - parser: 'typescript', - ...require('../package.json').prettier, -}; -const { parseAsync, traverse } = babelDefault.default; - -// Make process exit when a promise rejection is not handled -process.on('unhandledRejection', (error) => { - throw error; -}); - -/** - * Wraps child_process.spawn to make it promise-friendly and output to stderr/stdout - * - * @param {string} command - * @param {readonly string[]} args - * @param {import("child_process").SpawnOptionsWithoutStdio} [opts] - */ -const runCommand = (command, args, opts) => - new Promise((resolve, reject) => { - const child = spawn(command, args, { - ...opts, - stdio: [process.stdin, process.stdout, process.stderr], - }); - child.on('exit', (code) => { - if (code === 0) resolve(); - else reject(code); - }); - }); - -/** - * @param {string} name - */ -const getRepoDir = (name) => join(reposDir, name); - -/** - * @param {string} name - * @param {string} url - */ -const cloneRepo = async (name, url) => { - console.log(kleur.bold().blue(`Cloning repo: ${name} from ${url}`)); - // Clear out all existing repos - if (existsSync(reposDir)) await rm(reposDir); - await mkdir(reposDir); - await runCommand('git', ['clone', url, getRepoDir(name), '--depth', '1']); - console.log(kleur.bold().blue(`Done cloning repo: ${name}`)); -}; - -const { url } = await prompts({ - name: 'url', - type: 'text', - message: 'GitHub Repo URL', -}); -const name = url.replace(/\.git$/, '').replace(/.*\//, ''); -await cloneRepo(name, url); -/** @type {string[]} */ -const files = await walk(name, { filesonly: true, cwd: reposDir }); - -console.log(kleur.bold().blue('Looking for files to lint')); - -const interestingFiles = await Promise.all( - files - .filter( - (f) => - f.match(/.[jt]sx?$/) && - !f.endsWith('.d.ts') && // ignore declaration files - !f.replace(name, '').includes('test'), - ) - .map(async (file) => { - const contents = await readFile(join(reposDir, file), 'utf8'); - return { file, contents }; - }), -); - -const eslint = new ESLint({ - fix: true, - overrideConfigFile: join(fixturesDir, '.eslintrc.js'), - ignore: false, -}); - -const filesWithNumNodeTypesPromises = interestingFiles.map( - async ({ file, contents }) => { - const seenNodeTypes = new Set(); - let numNodes = 0; - let parsed; - /** - * This should be returned if the file is invalid - * This could happen if there is a parsing error or if it is empty - * or if it has too many linting errors, etc - */ - const invalidResult = { - file, - contents, - score: 0, - numLintErrors: 0, - numNodeTypes: 0, - loc: 0, - }; - const filenameRelative = join(reposDir, file); - try { - // Attempts to parse each file with babel - // Traverses the file and counts up the number of node types and number of nodes - // Files with more node types tend to be more interesting and better candidates for lint testing - parsed = await parseAsync(contents, { - parserOpts: { - plugins: [ - 'typescript', - 'jsx', - 'classProperties', - 'dynamicImport', - 'nullishCoalescingOperator', - 'optionalChaining', - ], - }, - filenameRelative, - }); - } catch { - return invalidResult; - } - - traverse(parsed, { - enter(path) { - numNodes++; - seenNodeTypes.add(path.type); - }, - }); - - const numNodeTypes = seenNodeTypes.size; - - let eslintReport; - try { - const lintResult = await eslint.lintFiles([ - join(fixturesDir, 'repos', file), - ]); - eslintReport = lintResult[0]; - } catch (error) { - console.log('eslint error', file, error); - return invalidResult; - } - - const numLintErrors = eslintReport.errorCount + eslintReport.warningCount; - const eslintFixedContents = eslintReport.output || contents; - - let prettifiedContents; - - try { - prettifiedContents = format(eslintFixedContents, prettierOpts); - } catch (error) { - console.log('prettier error', file, error); - return invalidResult; - } - - // Generates a "score" to a file based on the # of nodes, # of node types - // Used for sorting - // Each part of the score has a weighting. - // NumLintErrors is weighted negatively because files with more lint errors should have a lower score - // NumNodeTypes is weighted much more strongly compared to numNodes - // because files tend to have a lot of nodes compared to the number of node types - const score = numNodeTypes * 10 + numNodes / 1000 - numLintErrors * 30; - return { - file, - contents: prettifiedContents, - score, - numLintErrors, - numNodeTypes, - loc: contents.split('\n').length, - }; - }, -); - -const filesWithNumNodeTypes = await Promise.all(filesWithNumNodeTypesPromises); - -const sortedFiles = filesWithNumNodeTypes - // Make sure it parsed correctly, has a reasonable number of errors, and is not too short - .filter((file) => file.score > 0 && file.numLintErrors < 100 && file.loc > 50) - .sort((a, b) => b.score - a.score) - .slice(0, 50); - -const { chosenFiles } = await prompts({ - name: 'chosenFiles', - type: 'multiselect', - choices: sortedFiles.map((file) => ({ - title: file.file, - value: file, - description: `${file.numLintErrors} lint errors, ${file.loc} loc, ${file.numNodeTypes} node types`, - })), - message: 'Choose files to import', -}); - -if (chosenFiles.length === 0) { - console.log(kleur.bold().yellow('No files selected for import')); -} else { - await Promise.all( - chosenFiles.map(async ({ file, contents }) => { - const outPath = join(fixturesDir, file); - await mkdir(dirname(outPath)); - await writeFile(outPath, contents); - }), - ); - - console.log(kleur.bold().blue('Imported files')); - - await runCommand('npm', ['run', 'lint']).catch((error) => { - console.log( - '\nRead ./fixtures/README.md to learn how to resolve these lint errors', - ); - // eslint-disable-next-line @cloudfour/n/no-process-exit - process.exit(error); - }); -} diff --git a/fixtures/mocha/browser-entry.js b/fixtures/mocha/browser-entry.js deleted file mode 100644 index 3928484c..00000000 --- a/fixtures/mocha/browser-entry.js +++ /dev/null @@ -1,198 +0,0 @@ -'use strict'; - -/* eslint no-unused-vars: off */ -/* eslint-env commonjs */ - -/** - * Shim process.stdout. - */ - -process.stdout = require('browser-stdout')({ label: false }); - -const Mocha = require('./lib/mocha'); - -/** - * Create a Mocha instance. - * - * @returns {undefined} - */ - -const mocha = new Mocha({ reporter: 'html' }); - -/** - * Save timer references to avoid Sinon interfering (see GH-237). - */ - -const Date = global.Date; -const setTimeout = global.setTimeout; -const setInterval = global.setInterval; -const clearTimeout = global.clearTimeout; -const clearInterval = global.clearInterval; - -const uncaughtExceptionHandlers = []; - -const originalOnerrorHandler = global.onerror; - -/** - * Remove uncaughtException listener. - * Revert to original onerror handler if previously defined. - */ - -process.removeListener = function (e, fn) { - if (e !== 'uncaughtException') return; - if (originalOnerrorHandler) { - global.addEventListener('error', originalOnerrorHandler); - } else { - global.addEventListener('error', () => {}); - } - - const i = uncaughtExceptionHandlers.indexOf(fn); - if (i !== -1) { - uncaughtExceptionHandlers.splice(i, 1); - } -}; - -/** - * Implements uncaughtException listener. - */ - -process.on = function (e, fn) { - if (e === 'uncaughtException') { - global.addEventListener('error', (err, url, line) => { - fn(new Error(`${err} (${url}:${line})`)); - return !mocha.options.allowUncaught; - }); - - uncaughtExceptionHandlers.push(fn); - } -}; - -// The BDD UI is registered by default, but no UI will be functional in the -// browser without an explicit call to the overridden `mocha.ui` (see below). -// Ensure that this default UI does not expose its methods to the global scope. -mocha.suite.removeAllListeners('pre-require'); - -const immediateQueue = []; -let immediateTimeout; - -function timeslice() { - const immediateStart = Date.now(); - while (immediateQueue.length > 0 && Date.now() - immediateStart < 100) { - immediateQueue.shift()(); - } - - immediateTimeout = - immediateQueue.length > 0 ? setTimeout(timeslice, 0) : null; -} - -/** - * High-performance override of Runner.immediately. - */ - -Mocha.Runner.immediately = function (callback) { - immediateQueue.push(callback); - if (!immediateTimeout) { - immediateTimeout = setTimeout(timeslice, 0); - } -}; - -/** - * Function to allow assertion libraries to throw errors directly into mocha. - * This is useful when running tests in a browser because window.onerror will - * only receive the 'message' attribute of the Error. - * - * @param {Error} err - */ -mocha.throwError = function (err) { - for (const fn of uncaughtExceptionHandlers) { - fn(err); - } - - throw err; -}; - -/** - * Override ui to ensure that the ui functions are initialized. - * Normally this would happen in Mocha.prototype.loadFiles. - */ - -mocha.ui = function (ui) { - Mocha.prototype.ui.call(this, ui); - this.suite.emit('pre-require', global, null, this); - return this; -}; - -/** - * Setup mocha with the given setting options. - */ - -mocha.setup = function (opts) { - if (typeof opts === 'string') { - opts = { ui: opts }; - } - - for (const opt in opts) { - if (Object.prototype.hasOwnProperty.call(opts, opt)) { - this[opt](opts[opt]); - } - } - - return this; -}; - -/** - * Run mocha, returning the Runner. - */ - -mocha.run = function (fn) { - const options = mocha.options; - mocha.globals('location'); - - const query = Mocha.utils.parseQuery(global.location.search || ''); - if (query.grep) { - mocha.grep(query.grep); - } - - if (query.fgrep) { - mocha.fgrep(query.fgrep); - } - - if (query.invert) { - mocha.invert(); - } - - return Mocha.prototype.run.call(mocha, (err) => { - // The DOM Document is not available in Web Workers. - const document = global.document; - if ( - document && - document.querySelector('#mocha') && - options.noHighlighting !== true - ) { - Mocha.utils.highlightTags('code'); - } - - if (fn) { - fn(err); - } - }); -}; - -/** - * Expose the process shim. - * https://github.com/mochajs/mocha/pull/916 - */ - -Mocha.process = process; - -/** - * Expose mocha. - */ - -global.Mocha = Mocha; -global.mocha = mocha; - -// This allows test/acceptance/required-tokens.js to pass; thus, -// you can now do `const describe = require('mocha').describe` in a -// browser context (assuming browserification). should fix #880 -module.exports = global; diff --git a/fixtures/mocha/karma.conf.js b/fixtures/mocha/karma.conf.js deleted file mode 100644 index 5f44930c..00000000 --- a/fixtures/mocha/karma.conf.js +++ /dev/null @@ -1,211 +0,0 @@ -'use strict'; - -const fs = require('node:fs'); -const os = require('node:os'); -const path = require('node:path'); -const baseBundleDirpath = path.join(__dirname, '.karma'); - -const hostname = os.hostname(); - -const browserPlatformPairs = { - 'chrome@latest': 'Windows 10', - 'MicrosoftEdge@latest': 'Windows 10', - 'internet explorer@latest': 'Windows 10', - 'firefox@latest': 'Windows 10', - 'safari@latest': 'macOS 10.13', -}; - -module.exports = (config) => { - let bundleDirpath; - const cfg = { - frameworks: ['browserify', 'mocha'], - files: [ - // We use the BDD interface for all of the tests that - // aren't interface-specific. - 'test/unit/*.spec.js', - ], - preprocessors: { - 'test/**/*.js': ['browserify'], - }, - browserify: { - debug: true, - configure: function configure(b) { - b.ignore('./lib/cli/*.js') - .ignore('chokidar') - .ignore('fs') - .ignore('glob') - .ignore('./lib/esm-utils.js') - .ignore('path') - .ignore('supports-color') - .on('bundled', (err, content) => { - if (err) { - throw err; - } - - if (bundleDirpath) { - // Write bundle to directory for debugging - fs.writeFileSync( - path.join(bundleDirpath, `mocha.${Date.now()}.js`), - content, - ); - } - }); - }, - }, - reporters: ['mocha'], - colors: true, - browsers: ['ChromeHeadless'], - logLevel: config.LOG_INFO, - client: { - mocha: { - opts: require.resolve('./test/browser-specific/mocha.opts'), - }, - }, - mochaReporter: { - showDiff: true, - }, - customLaunchers: { - ChromeDebug: { - base: 'Chrome', - flags: ['--remote-debugging-port=9333'], - }, - }, - }; - - // TO RUN AGAINST SAUCELABS LOCALLY, execute: - // `CI=1 SAUCE_USERNAME= SAUCE_ACCESS_KEY= npm start test.browser` - const env = process.env; - let sauceConfig; - - if (env.CI) { - console.error('CI mode enabled'); - if (env.TRAVIS) { - console.error('Travis-CI detected'); - bundleDirpath = path.join(baseBundleDirpath, process.env.TRAVIS_BUILD_ID); - if (env.SAUCE_USERNAME && env.SAUCE_ACCESS_KEY) { - // Correlate build/tunnel with Travis - sauceConfig = { - build: `TRAVIS #${env.TRAVIS_BUILD_NUMBER} (${env.TRAVIS_BUILD_ID})`, - tunnelIdentifier: env.TRAVIS_JOB_NUMBER, - startConnect: false, - }; - console.error('Configured SauceLabs'); - } else { - console.error('No SauceLabs credentials present'); - } - } else if (env.APPVEYOR) { - throw new Error('no browser tests should run on AppVeyor!'); - } else { - console.error(`Local environment (${hostname}) detected`); - bundleDirpath = path.join(baseBundleDirpath, hostname); - // Don't need to run sauce from appveyor b/c travis does it. - if (env.SAUCE_USERNAME || env.SAUCE_ACCESS_KEY) { - const id = `${hostname} (${Date.now()})`; - sauceConfig = { - build: id, - tunnelIdentifier: id, - startConnect: true, - }; - console.error('Configured SauceLabs'); - } else { - console.error('No SauceLabs credentials present'); - } - } - - fs.mkdirSync(bundleDirpath, { recursive: true }); - } else { - console.error('CI mode disabled'); - } - - if (sauceConfig) { - cfg.sauceLabs = sauceConfig; - addSauceTests(cfg); - } - - /* The MOCHA_TEST env var will be set for "special" cases of tests. - * these may require different interfaces or other setup which make - * them unable to be batched w/ the rest. - */ - const MOCHA_TEST = env.MOCHA_TEST; - switch (MOCHA_TEST) { - case 'bdd': - case 'tdd': - case 'qunit': { - if (cfg.sauceLabs) { - cfg.sauceLabs.testName = `Interface "${MOCHA_TEST}" Integration Tests`; - } - - cfg.files = [`test/interfaces/${MOCHA_TEST}.spec.js`]; - cfg.client.mocha.ui = MOCHA_TEST; - break; - } - - case 'esm': { - // Just run against ChromeHeadless, since other browsers may not - // support - cfg.browsers = ['ChromeHeadless']; - cfg.files = [ - { - pattern: 'test/browser-specific/fixtures/esm.fixture.mjs', - type: 'module', - }, - { pattern: 'test/browser-specific/esm.spec.mjs', type: 'module' }, - ]; - break; - } - default: { - if (cfg.sauceLabs) { - cfg.sauceLabs.testName = 'Unit Tests'; - } - } - } - - cfg.files.unshift( - require.resolve('unexpected/unexpected'), - { - pattern: require.resolve('unexpected/unexpected.js.map'), - included: false, - }, - require.resolve('unexpected-sinon'), - require.resolve('unexpected-eventemitter/dist/unexpected-eventemitter.js'), - require.resolve('./test/browser-specific/setup'), - ); - - config.set(cfg); -}; - -function addSauceTests(cfg) { - cfg.reporters.push('saucelabs'); - const browsers = Object.keys(browserPlatformPairs); - cfg.browsers = [...cfg.browsers, ...browsers]; - cfg.customLaunchers = browsers.reduce((acc, browser) => { - const platform = browserPlatformPairs[browser]; - const [browserName, version] = browser.split('@'); - acc[browser] = { - base: 'SauceLabs', - browserName, - version, - platform, - }; - return acc; - }, cfg.customLaunchers); - - // See https://github.com/karma-runner/karma-sauce-launcher - // See https://github.com/bermi/sauce-connect-launcher#advanced-usage - Object.assign(cfg.sauceLabs, { - public: 'public', - connectOptions: { - connectRetries: 2, - connectRetryTimeout: 30_000, - detached: cfg.sauceLabs.startConnect, - tunnelIdentifier: cfg.sauceLabs.tunnelIdentifier, - }, - }); - - cfg.concurrency = Infinity; - cfg.retryLimit = 1; - - // For slow browser booting, ostensibly - cfg.captureTimeout = 120_000; - cfg.browserNoActivityTimeout = 20_000; -} diff --git a/fixtures/mocha/lib/cli/one-and-dones.js b/fixtures/mocha/lib/cli/one-and-dones.js deleted file mode 100644 index 9ddb9935..00000000 --- a/fixtures/mocha/lib/cli/one-and-dones.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -/** - * Contains "command" code for "one-and-dones"--options passed - * to Mocha which cause it to just dump some info and exit. - * See {@link module:lib/cli/one-and-dones.ONE_AND_DONE_ARGS ONE_AND_DONE_ARGS} for more info. - * - * @module - * @private - */ - -const align = require('wide-align'); - -const Mocha = require('../mocha'); - -/** - * Dumps a sorted list of the enumerable, lower-case keys of some object - * to `STDOUT`. - * - * @param {object} obj - Object, ostensibly having some enumerable keys - * @ignore - * @private - */ -const showKeys = (obj) => { - console.log(); - const keys = Object.keys(obj); - const maxKeyLength = keys.reduce((max, key) => Math.max(max, key.length), 0); - for (const key of keys - .filter( - (key) => - /^[a-z]/.test(key) && !obj[key].browserOnly && !obj[key].abstract, - ) - .sort()) { - const description = obj[key].description; - console.log( - ` ${align.left(key, maxKeyLength + 1)}${ - description ? `- ${description}` : '' - }`, - ); - } - - console.log(); -}; - -/** - * Handlers for one-and-done options - * - * @namespace - * @private - */ -exports.ONE_AND_DONES = { - /** - * Dump list of built-in interfaces - * - * @private - */ - 'list-interfaces': () => { - showKeys(Mocha.interfaces); - }, - /** - * Dump list of built-in reporters - * - * @private - */ - 'list-reporters': () => { - showKeys(Mocha.reporters); - }, -}; - -/** - * A Set of all one-and-done options - * - * @type Set - * @private - */ -exports.ONE_AND_DONE_ARGS = new Set([ - 'help', - 'h', - 'version', - 'V', - ...Object.keys(exports.ONE_AND_DONES), -]); diff --git a/fixtures/mocha/lib/cli/options.js b/fixtures/mocha/lib/cli/options.js deleted file mode 100644 index 9a6f90c1..00000000 --- a/fixtures/mocha/lib/cli/options.js +++ /dev/null @@ -1,262 +0,0 @@ -'use strict'; - -/** - * Main entry point for handling filesystem-based configuration, - * whether that's a config file or `package.json` or whatever. - * - * @module - */ - -const fs = require('node:fs'); - -const ansi = require('ansi-colors'); -const debug = require('debug')('mocha:cli:options'); -const findUp = require('find-up'); -const yargsParser = require('yargs-parser'); - -const mocharc = require('../mocharc.json'); - -const { loadConfig, findConfig } = require('./config'); -const { isNodeFlag } = require('./node-flags'); -const { ONE_AND_DONE_ARGS } = require('./one-and-dones'); -const { list } = require('./run-helpers'); -const { types, aliases } = require('./run-option-metadata'); - -/** - * The `yargs-parser` namespace - * - * @external yargsParser - * @see {@link https://npm.im/yargs-parser} - */ - -/** - * An object returned by a configured `yargs-parser` representing arguments - * - * @memberof external:yargsParser - * @interface Arguments - */ - -/** - * Base yargs parser configuration - * - * @private - */ -const YARGS_PARSER_CONFIG = { - 'combine-arrays': true, - 'short-option-groups': false, - 'dot-notation': false, -}; - -/** - * This is the config pulled from the `yargs` property of Mocha's - * `package.json`, but it also disables camel case expansion as to - * avoid outputting non-canonical keynames, as we need to do some - * lookups. - * - * @private - * @ignore - */ -const configuration = { ...YARGS_PARSER_CONFIG, 'camel-case-expansion': false }; - -/** - * This is a really fancy way to: - * - ensure unique values for `array`-type options - * - use its array's last element for `boolean`/`number`/`string`- options given multiple times - * This is passed as the `coerce` option to `yargs-parser` - * - * @private - * @ignore - */ -const coerceOpts = Object.assign( - Object.fromEntries( - types.array.map((arg) => [arg, (v) => [...new Set(list(v))]]), - ), - Object.fromEntries( - [...types.boolean, ...types.string, ...types.number].map((arg) => [ - arg, - (v) => (Array.isArray(v) ? v.pop() : v), - ]), - ), -); - -/** - * We do not have a case when multiple arguments are ever allowed after a flag - * (e.g., `--foo bar baz quux`), so we fix the number of arguments to 1 across - * the board of non-boolean options. - * This is passed as the `narg` option to `yargs-parser` - * - * @private - * @ignore - */ -const nargOpts = Object.fromEntries( - [...types.array, ...types.string, ...types.number].map((arg) => [arg, 1]), -); - -/** - * Wrapper around `yargs-parser` which applies our settings - * - * @param {string|string[]} args - Arguments to parse - * @param {object} defaultValues - Default values of mocharc.json - * @param {...object} configObjects - `configObjects` for yargs-parser - * @private - * @ignore - */ -const parse = (args = [], defaultValues = {}, ...configObjects) => { - // Save node-specific args for special handling. - // 1. when these args have a "=" they should be considered to have values - // 2. if they don't, they just boolean flags - // 3. to avoid explicitly defining the set of them, we tell yargs-parser they - // are ALL boolean flags. - // 4. we can then reapply the values after yargs-parser is done. - const nodeArgs = (Array.isArray(args) ? args : args.split(' ')).reduce( - (acc, arg) => { - const pair = arg.split('='); - let flag = pair[0]; - if (isNodeFlag(flag, false)) { - flag = flag.replace(/^--?/, ''); - return arg.includes('=') - ? [...acc, [flag, pair[1]]] - : [...acc, [flag, true]]; - } - - return acc; - }, - [], - ); - - const result = yargsParser.detailed(args, { - configuration, - configObjects, - default: defaultValues, - coerce: coerceOpts, - narg: nargOpts, - alias: aliases, - string: types.string, - array: types.array, - number: types.number, - boolean: [...types.boolean, ...nodeArgs.map((pair) => pair[0])], - }); - if (result.error) { - console.error(ansi.red(`Error: ${result.error.message}`)); - // eslint-disable-next-line @cloudfour/n/no-process-exit, @cloudfour/unicorn/no-process-exit - process.exit(1); - } - - // Reapply "=" arg values from above - for (const [key, value] of nodeArgs) { - result.argv[key] = value; - } - - return result.argv; -}; - -/** - * Given path to config file in `args.config`, attempt to load & parse config file. - * - * @param {object} [args] - Arguments object - * @param {string|boolean} [args.config] - Path to config file or `false` to skip - * @public - * @memberof module:lib/cli/options - * @returns {external:yargsParser.Arguments|void} Parsed config, or nothing if `args.config` is `false` - */ -const loadRc = (args = {}) => { - if (args.config !== false) { - const config = args.config || findConfig(); - return config ? loadConfig(config) : {}; - } -}; - -module.exports.loadRc = loadRc; - -/** - * Given path to `package.json` in `args.package`, attempt to load config from `mocha` prop. - * - * @param {object} [args] - Arguments object - * @param {string|boolean} [args.config] - Path to `package.json` or `false` to skip - * @public - * @memberof module:lib/cli/options - * @returns {external:yargsParser.Arguments|void} Parsed config, or nothing if `args.package` is `false` - */ -const loadPkgRc = (args = {}) => { - let result; - if (args.package === false) { - return result; - } - - result = {}; - const filepath = args.package || findUp.sync(mocharc.package); - if (filepath) { - try { - const pkg = JSON.parse(fs.readFileSync(filepath, 'utf8')); - if (pkg.mocha) { - debug(`'mocha' prop of package.json parsed:`, pkg.mocha); - result = pkg.mocha; - } else { - debug(`no config found in ${filepath}`); - } - } catch (error) { - if (args.package) { - throw new Error(`Unable to read/parse ${filepath}: ${error}`); - } - - debug(`failed to read default package.json at ${filepath}; ignoring`); - } - } - - return result; -}; - -module.exports.loadPkgRc = loadPkgRc; - -/** - * Priority list: - * - * 1. Command-line args - * 2. RC file (`.mocharc.c?js`, `.mocharc.ya?ml`, `mocharc.json`) - * 3. `mocha` prop of `package.json` - * 4. default configuration (`lib/mocharc.json`) - * - * If a {@link module:lib/cli/one-and-dones.ONE_AND_DONE_ARGS "one-and-done" option} is present in the `argv` array, no external config files will be read. - * - * @summary Parses options read from `.mocharc.*` and `package.json`. - * @param {string|string[]} [argv] - Arguments to parse - * @public - * @memberof module:lib/cli/options - * @returns {external:yargsParser.Arguments} Parsed args from everything - */ -const loadOptions = (argv = []) => { - let args = parse(argv); - // Short-circuit: look for a flag that would abort loading of options - if ([...ONE_AND_DONE_ARGS].reduce((acc, arg) => acc || arg in args, false)) { - return args; - } - - const rcConfig = loadRc(args); - const pkgConfig = loadPkgRc(args); - - if (rcConfig) { - args.config = false; - args._ = [...args._, ...(rcConfig._ || [])]; - } - - if (pkgConfig) { - args.package = false; - args._ = [...args._, ...(pkgConfig._ || [])]; - } - - args = parse(args._, mocharc, args, rcConfig || {}, pkgConfig || {}); - - // Recombine positional arguments and "spec" - if (args.spec) { - args._ = [args._, ...args.spec]; - delete args.spec; - } - - // Make unique - args._ = [...new Set(args._)]; - - return args; -}; - -module.exports.loadOptions = loadOptions; -module.exports.YARGS_PARSER_CONFIG = YARGS_PARSER_CONFIG; diff --git a/fixtures/mocha/lib/growl.js b/fixtures/mocha/lib/growl.js deleted file mode 100644 index 8b7b3b05..00000000 --- a/fixtures/mocha/lib/growl.js +++ /dev/null @@ -1,132 +0,0 @@ -'use strict'; - -/** - * Desktop Notifications module. - * - * @module Growl - */ - -const os = require('node:os'); -const path = require('node:path'); - -const { sync: which } = require('which'); - -const { EVENT_RUN_END } = require('./runner').constants; - -/** - * @summary - * Checks if Growl notification support seems likely. - * @description - * Glosses over the distinction between an unsupported platform - * and one that lacks prerequisite software installations. - * @public - * @see {@link https://github.com/tj/node-growl/blob/master/README.md|Prerequisite Installs} - * @see {@link Mocha#growl} - * @see {@link Mocha#isGrowlCapable} - * @returns {boolean} whether Growl notification support can be expected - */ -exports.isCapable = () => { - if (!process.browser) { - return getSupportBinaries().reduce( - (acc, binary) => acc || Boolean(which(binary, { nothrow: true })), - false, - ); - } - - return false; -}; - -/** - * Implements desktop notifications as a pseudo-reporter. - * - * @public - * @see {@link Mocha#_growl} - * @param {Runner} runner - Runner instance. - */ -exports.notify = (runner) => { - runner.once(EVENT_RUN_END, () => { - display(runner); - }); -}; - -/** - * Displays the notification. - * - * @private - * @param {Runner} runner - Runner instance. - */ -const display = (runner) => { - const growl = require('growl'); - const stats = runner.stats; - const symbol = { - cross: '\u274C', - tick: '\u2705', - }; - let _message; - let message; - let title; - - if (stats.failures) { - _message = `${stats.failures} of ${stats.tests} tests failed`; - message = `${symbol.cross} ${_message}`; - title = 'Failed'; - } else { - _message = `${stats.passes} tests passed in ${stats.duration}ms`; - message = `${symbol.tick} ${_message}`; - title = 'Passed'; - } - - // Send notification - const options = { - image: logo(), - name: 'mocha', - title, - }; - growl(message, options, onCompletion); -}; - -/** - * @summary - * Callback for result of attempted Growl notification. - * @description - * Despite its appearance, this is not an Error-first - * callback -- all parameters are populated regardless of success. - * @private - * @callback Growl~growlCB - * @param {any} err - Error object, or null if successful. - */ -function onCompletion(err) { - if (err) { - // As notifications are tangential to our purpose, just log the error. - const message = - err.code === 'ENOENT' ? 'prerequisite software not found' : err.message; - console.error('notification error:', message); - } -} - -/** - * Returns Mocha logo image path. - * - * @private - * @returns {string} Pathname of Mocha logo - */ -const logo = () => path.join(__dirname, '..', 'assets', 'mocha-logo-96.png'); - -/** - * @summary - * Gets platform-specific Growl support binaries. - * @description - * Somewhat brittle dependency on `growl` package implementation, but it - * rarely changes. - * @private - * @see {@link https://github.com/tj/node-growl/blob/master/lib/growl.js#L28-L126|setupCmd} - * @returns {string[]} names of Growl support binaries - */ -const getSupportBinaries = () => { - const binaries = { - Darwin: ['terminal-notifier', 'growlnotify'], - Linux: ['notify-send', 'growl'], - Windows_NT: ['growlnotify.exe'], - }; - return binaries[os.type()] || []; -}; diff --git a/fixtures/mocha/lib/interfaces/common.js b/fixtures/mocha/lib/interfaces/common.js deleted file mode 100644 index bf6b49e5..00000000 --- a/fixtures/mocha/lib/interfaces/common.js +++ /dev/null @@ -1,193 +0,0 @@ -'use strict'; - -const errors = require('../errors'); -const Suite = require('../suite'); -const createMissingArgumentError = errors.createMissingArgumentError; - -/** - * Functions common to more than one interface. - * - * @param {Suite[]} suites - * @param {Context} context - * @param {Mocha} mocha - * @returns {object} An object containing common functions. - */ -module.exports = function (suites, context, mocha) { - /** - * Check if the suite should be tested. - * - * @private - * @param {Suite} suite - suite to check - * @returns {boolean} - */ - function shouldBeTested(suite) { - return ( - !mocha.options.grep || - (mocha.options.grep && - mocha.options.grep.test(suite.fullTitle()) && - !mocha.options.invert) - ); - } - - return { - /** - * This is only present if flag --delay is passed into Mocha. It triggers - * root suite execution. - * - * @param {Suite} suite The root suite. - * @returns {() => void} A function which runs the root suite - */ - runWithSuite: function runWithSuite(suite) { - return function run() { - suite.run(); - }; - }, - - /** - * Execute before running tests. - * - * @param {string} name - * @param {() => void} fn - */ - before(name, fn) { - suites[0].beforeAll(name, fn); - }, - - /** - * Execute after running tests. - * - * @param {string} name - * @param {() => void} fn - */ - after(name, fn) { - suites[0].afterAll(name, fn); - }, - - /** - * Execute before each test case. - * - * @param {string} name - * @param {() => void} fn - */ - beforeEach(name, fn) { - suites[0].beforeEach(name, fn); - }, - - /** - * Execute after each test case. - * - * @param {string} name - * @param {() => void} fn - */ - afterEach(name, fn) { - suites[0].afterEach(name, fn); - }, - - suite: { - /** - * Create an exclusive Suite; convenience function - * See docstring for create() below. - * - * @param {object} opts - * @returns {Suite} - */ - only: function only(opts) { - opts.isOnly = true; - return this.create(opts); - }, - - /** - * Create a Suite, but skip it; convenience function - * See docstring for create() below. - * - * @param {object} opts - * @returns {Suite} - */ - skip: function skip(opts) { - opts.pending = true; - return this.create(opts); - }, - - /** - * Creates a suite. - * - * @param {object} opts Options - * @param {string} opts.title Title of Suite - * @param {() => void} [opts.fn] Suite Function (not always applicable) - * @param {boolean} [opts.pending] Is Suite pending? - * @param {string} [opts.file] Filepath where this Suite resides - * @param {boolean} [opts.isOnly] Is Suite exclusive? - * @returns {Suite} - */ - create: function create(opts) { - const suite = Suite.create(suites[0], opts.title); - suite.pending = Boolean(opts.pending); - suite.file = opts.file; - suites.unshift(suite); - if (opts.isOnly) { - if (mocha.options.forbidOnly && shouldBeTested(suite)) { - throw new Error('`.only` forbidden'); - } - - suite.parent.appendOnlySuite(suite); - } - - if ( - suite.pending && - mocha.options.forbidPending && - shouldBeTested(suite) - ) { - throw new Error('Pending test forbidden'); - } - - if (typeof opts.fn === 'function') { - opts.fn.call(suite); - suites.shift(); - } else if (opts.fn === undefined && !suite.pending) { - throw createMissingArgumentError( - `Suite "${suite.fullTitle()}" was defined but no callback was supplied. ` + - `Supply a callback or explicitly skip the suite.`, - 'callback', - 'function', - ); - } else if (!opts.fn && suite.pending) { - suites.shift(); - } - - return suite; - }, - }, - - test: { - /** - * Exclusive test-case. - * - * @param {object} mocha - * @param {() => void} test - * @returns {any} - */ - only(mocha, test) { - test.parent.appendOnlyTest(test); - return test; - }, - - /** - * Pending test case. - * - * @param {string} title - */ - skip(title) { - context.test(title); - }, - - /** - * Number of retry attempts - * - * @param {number} n - */ - retries(n) { - context.retries(n); - }, - }, - }; -}; diff --git a/fixtures/mocha/scripts/markdown-magic.config.js b/fixtures/mocha/scripts/markdown-magic.config.js deleted file mode 100644 index f89637bf..00000000 --- a/fixtures/mocha/scripts/markdown-magic.config.js +++ /dev/null @@ -1,120 +0,0 @@ -'use strict'; - -/** - * Add autogenerated stuff to our docs (`docs/index.md`) - * - * @see https://npm.im/markdown-magic - * @private - * @module - */ - -const { execSync } = require('node:child_process'); -const fs = require('node:fs'); -const path = require('node:path'); - -const markdownToc = require('markdown-toc'); -const stripAnsi = require('strip-ansi'); - -exports.transforms = { - /** - * Takes STDOUT of some command and injects it into the markdown - * - * @param {string} content - * @param {object} options - */ - usage: (content, options) => { - const { executable } = options; - const flag = options.flag || '--help'; - const header = options.header || '\n```text'; - const footer = options.footer || '```\n'; - const output = stripAnsi( - String( - execSync(`"${process.execPath}" ${executable} ${flag}`, { - cwd: path.join(__dirname, '..'), - }), - ).trim(), - ); - return [header, output, footer].join('\n\n'); - }, - /** - * We can't use the builtin `TOC` plugin in markdown-magic - * because it's simply not flexible enough; we can't pad with newlines, - * nor can we provide a custom filter. the custom filter would be required - * since the `TOC` plugin supplies its own which means we can't use the - * `maxdepth` option, which we need! - * - * @param {string} content - * @param {object} options - * @param {object} config - */ - toc: (content, options, config) => { - const IGNORED_HEADINGS_REGEXP = /features|table of contents/i; - const toc = markdownToc(config.outputContent, { - slugify: require('uslug'), - bullets: options.bullets, - firsth1: false, - // If filter is supplied, maxdepth is apparently ignored, - // so we have to do it ourselves. - filter: (str, ele) => ele.lvl < 2 && !IGNORED_HEADINGS_REGEXP.test(str), - }).content; - return `\n${toc}\n`; - }, - manifest: require('markdown-magic-package-json'), - /** - * Inserts the contents of a file; takes same options as builtin CODE plugin, - * but does not fetch remote URLs, tries to replace relative paths, and - * formats in a way our markdown linter likes. - * - * @param {string} content - * @param {object} options - * @param {object} config - */ - file: (content, options, config) => { - let output; - if (!options.src) { - return false; - } - - const fileDir = path.dirname(config.originalPath); - const filePath = path.join(fileDir, options.src); - const rootDir = path.join(__dirname, '..'); - const relativeDir = path.relative(path.dirname(filePath), rootDir); - - const syntax = options.syntax || path.extname(filePath).replace(/^./, ''); - try { - output = fs.readFileSync(filePath, 'utf8', (err, contents) => { - if (err) { - console.log(`FILE NOT FOUND: ${filePath}`); - throw err; - } - - return contents; - }); - } catch (error) { - console.log(`FILE NOT FOUND: ${filePath}`); - throw error; - } - - // Replace relative paths in `require()` to root with "mocha". - // might not work in the general case. not gonna parse an AST for this - // e.g. `require('../../lib/foo')` => `require('mocha/lib/foo')` - // also trim any trailing whitespace - output = output - .replace( - new RegExp(`require\\(['"]${relativeDir}(.*?)['"]\\)`, 'g'), - "require('mocha$1')", - ) - .trim(); - - let header = ''; - if (options.header) { - header = `\n${options.header}`; - } - - return ` -\`\`\`${syntax}${header} -${output} -\`\`\` -`; - }, -}; diff --git a/fixtures/mocha/scripts/netlify-headers.js b/fixtures/mocha/scripts/netlify-headers.js deleted file mode 100644 index 552dd79d..00000000 --- a/fixtures/mocha/scripts/netlify-headers.js +++ /dev/null @@ -1,116 +0,0 @@ -'use strict'; - -const AssetGraph = require('assetgraph'); - -const headers = ['Content-Security-Policy']; - -const resourceHintTypeMap = { - HtmlPreloadLink: 'preload', - HtmlPrefetchLink: 'prefetch', - HtmlPreconnectLink: 'preconnect', - HtmlDnsPrefetchLink: 'dns-prefetch', -}; - -function getHeaderForRelation(rel) { - let header = `Link: <${rel.href}>; rel=${resourceHintTypeMap[rel.type]}; as=${ - rel.as - }; type=${rel.to.contentType}`; - - if (rel.as === 'font') { - header = `${header}; crossorigin=anonymous`; - } - - return header; -} - -console.error('Generating optimal netlify headers...'); - -new AssetGraph({ root: 'docs/_dist' }) - .loadAssets('*.html') - .populate({ - followRelations: { type: 'HtmlAnchor', crossorigin: false }, - }) - .queue((assetGraph) => { - const assets = assetGraph.findAssets({ - type: 'Html', - isInline: false, - isLoaded: true, - }); - - const headerMap = {}; - - for (const asset of assets) { - const url = `/${asset.url - .replace(assetGraph.root, '') - .replace(/#.*/, '') - .replace('index.html', '')}`; - if (!headerMap[url]) { - headerMap[url] = []; - } - - for (const header of headers) { - const node = asset.parseTree.querySelector( - `meta[http-equiv=${header}]`, - ); - - if (node) { - headerMap[url].push(`${header}: ${node.getAttribute('content')}`); - - node.remove(); - asset.markDirty(); - } - } - - const firstCssRel = asset.outgoingRelations.find( - (r) => - r.type === 'HtmlStyle' && - r.crossorigin === false && - r.href !== undefined, - ); - - if (firstCssRel) { - const header = `Link: <${firstCssRel.href}>; rel=preload; as=style`; - - headerMap[url].push(header); - } - - const resourceHintRelations = asset.outgoingRelations.filter((r) => - ['HtmlPreloadLink', 'HtmlPrefetchLink'].includes(r.type), - ); - - for (const rel of resourceHintRelations) { - headerMap[url].push(getHeaderForRelation(rel)); - - rel.detach(); - } - - const preconnectRelations = asset.outgoingRelations.filter((r) => - ['HtmlPreconnectLink'].includes(r.type), - ); - - for (const rel of preconnectRelations) { - const header = `Link: <${rel.href}>; rel=preconnect`; - - headerMap[url].push(header); - - rel.detach(); - } - } - - console.log('\n## Autogenerated headers:\n'); - - for (const url of Object.keys(headerMap)) { - console.log(url); - - const httpHeaders = headerMap[url]; - - for (const header of httpHeaders) { - console.log(` ${header}`); - } - - console.log(''); - - console.error('netlify headers done!'); - } - }) - .run(); diff --git a/fixtures/rollup/.eslintrc.js b/fixtures/rollup/.eslintrc.js deleted file mode 100644 index 061f15ca..00000000 --- a/fixtures/rollup/.eslintrc.js +++ /dev/null @@ -1,6 +0,0 @@ -module.exports = { - rules: { - // Didn't want to break all the import paths for this project - '@cloudfour/unicorn/filename-case': 'off', - }, -}; diff --git a/fixtures/rollup/build-plugins/generate-license-file.js b/fixtures/rollup/build-plugins/generate-license-file.js deleted file mode 100644 index 132bcf6c..00000000 --- a/fixtures/rollup/build-plugins/generate-license-file.js +++ /dev/null @@ -1,93 +0,0 @@ -import fs from 'node:fs'; - -import license from 'rollup-plugin-license'; - -function generateLicenseFile(dependencies) { - const coreLicense = fs.readFileSync('LICENSE-CORE.md'); - const licenses = new Set(); - const dependencyLicenseTexts = dependencies - .sort(({ name: nameA }, { name: nameB }) => (nameA > nameB ? 1 : -1)) - .map( - ({ - name, - license, - licenseText, - author, - maintainers, - contributors, - repository, - }) => { - let text = `## ${name}\n`; - if (license) { - text += `License: ${license}\n`; - } - - const names = new Set(); - if (author && author.name) { - names.add(author.name); - } - - for (const person of [...maintainers, contributors]) { - if (person && person.name) { - names.add(person.name); - } - } - - if (names.size > 0) { - text += `By: ${[...names].join(', ')}\n`; - } - - if (repository) { - text += `Repository: ${repository.url || repository}\n`; - } - - if (licenseText) { - text += `\n${licenseText - .trim() - .replace(/(\r\n|\r)/gm, '\n') - .split('\n') - .map((line) => `> ${line}`) - .join('\n')}\n`; - } - - licenses.add(license); - return text; - }, - ) - .join('\n---------------------------------------\n\n'); - const licenseText = - `${ - `# Rollup core license\n` + - `Rollup is released under the MIT license:\n\n` - }${coreLicense}\n# Licenses of bundled dependencies\n` + - `The published Rollup artifact additionally contains code with the following licenses:\n` + - `${[...licenses].join(', ')}\n\n` + - `# Bundled dependencies:\n${dependencyLicenseTexts}`; - const existingLicenseText = fs.readFileSync('LICENSE.md', 'utf8'); - if (existingLicenseText !== licenseText) { - fs.writeFileSync('LICENSE.md', licenseText); - console.warn('LICENSE.md updated. You should commit the updated file.'); - } -} - -export default function getLicenseHandler() { - const licenses = new Map(); - function addLicenses(dependencies) { - for (const dependency of dependencies) { - licenses.set(dependency.name, dependency); - } - } - - return { - collectLicenses() { - return license({ thirdParty: addLicenses }); - }, - writeLicense() { - return { - writeBundle() { - generateLicenseFile([...licenses.values()]); - }, - }; - }, - }; -} diff --git a/fixtures/rollup/rollup.config.js b/fixtures/rollup/rollup.config.js deleted file mode 100644 index 41409866..00000000 --- a/fixtures/rollup/rollup.config.js +++ /dev/null @@ -1,169 +0,0 @@ -import fs from 'node:fs'; -import path from 'node:path'; - -import alias from '@rollup/plugin-alias'; -import commonjs from '@rollup/plugin-commonjs'; -import json from '@rollup/plugin-json'; -import resolve from '@rollup/plugin-node-resolve'; -import { string } from 'rollup-plugin-string'; -import { terser } from 'rollup-plugin-terser'; -import typescript from 'rollup-plugin-typescript'; - -import addCliEntry from './build-plugins/add-cli-entry.js'; -import conditionalFsEventsImport from './build-plugins/conditional-fsevents-import'; -import emitModulePackageFile from './build-plugins/emit-module-package-file.js'; -import esmDynamicImport from './build-plugins/esm-dynamic-import.js'; -import getLicenseHandler from './build-plugins/generate-license-file.js'; -import pkg from './package.json'; - -const commitHash = (function () { - try { - return fs.readFileSync('.commithash', 'utf8'); - } catch { - return 'unknown'; - } -})(); - -const now = new Date( - process.env.SOURCE_DATE_EPOCH - ? process.env.SOURCE_DATE_EPOCH * 1000 - : Date.now(), -).toUTCString(); - -const banner = `/* - @license - Rollup.js v${pkg.version} - ${now} - commit ${commitHash} - - https://github.com/rollup/rollup - - Released under the MIT License. -*/`; - -const onwarn = (warning) => { - // eslint-disable-next-line no-console - console.error( - 'Building Rollup produced warnings that need to be resolved. ' + - 'Please keep in mind that the browser build may never have external dependencies!', - ); - throw new Error(warning.message); -}; - -const moduleAliases = { - resolve: ['.js', '.json', '.md'], - entries: [ - { find: 'help.md', replacement: path.resolve('cli/help.md') }, - { find: 'package.json', replacement: path.resolve('package.json') }, - ], -}; - -const treeshake = { - moduleSideEffects: false, - propertyReadSideEffects: false, - tryCatchDeoptimization: false, -}; - -const nodePlugins = [ - alias(moduleAliases), - resolve(), - json(), - conditionalFsEventsImport(), - string({ include: '**/*.md' }), - commonjs({ include: 'node_modules/**' }), - typescript(), -]; - -export default (command) => { - const { collectLicenses, writeLicense } = getLicenseHandler(); - const commonJSBuild = { - input: { - 'rollup.js': 'src/node-entry.ts', - 'loadConfigFile.js': 'cli/run/loadConfigFile.ts', - }, - onwarn, - plugins: [ - ...nodePlugins, - addCliEntry(), - esmDynamicImport(), - !command.configTest && collectLicenses(), - ], - // Fsevents is a dependency of chokidar that cannot be bundled as it contains binary code - external: [ - 'assert', - 'crypto', - 'events', - 'fs', - 'fsevents', - 'module', - 'path', - 'os', - 'stream', - 'url', - 'util', - ], - treeshake, - strictDeprecations: true, - output: { - banner, - chunkFileNames: 'shared/[name].js', - dir: 'dist', - entryFileNames: '[name]', - externalLiveBindings: false, - format: 'cjs', - freeze: false, - interop: false, - manualChunks: { rollup: ['src/node-entry.ts'] }, - sourcemap: true, - }, - }; - - if (command.configTest) { - return commonJSBuild; - } - - const esmBuild = { - ...commonJSBuild, - input: { 'rollup.js': 'src/node-entry.ts' }, - plugins: [...nodePlugins, emitModulePackageFile(), collectLicenses()], - output: { - ...commonJSBuild.output, - dir: 'dist/es', - format: 'es', - sourcemap: false, - minifyInternalExports: false, - }, - }; - - const browserBuilds = { - input: 'src/browser-entry.ts', - onwarn, - plugins: [ - alias(moduleAliases), - resolve({ browser: true }), - json(), - { - load: (id) => { - if (id.includes('crypto.ts')) - return fs.readFileSync('browser/crypto.ts', 'utf8'); - if (id.includes('fs.ts')) - return fs.readFileSync('browser/fs.ts', 'utf8'); - if (id.includes('path.ts')) - return fs.readFileSync('browser/path.ts', 'utf8'); - }, - }, - commonjs(), - typescript(), - terser({ module: true, output: { comments: 'some' } }), - collectLicenses(), - writeLicense(), - ], - treeshake, - strictDeprecations: true, - output: [ - { file: 'dist/rollup.browser.js', format: 'umd', name: 'rollup', banner }, - { file: 'dist/es/rollup.browser.js', format: 'es', banner }, - ], - }; - - return [commonJSBuild, esmBuild, browserBuilds]; -}; diff --git a/fixtures/rollup/src/ExternalModule.ts b/fixtures/rollup/src/ExternalModule.ts deleted file mode 100644 index 672f65f8..00000000 --- a/fixtures/rollup/src/ExternalModule.ts +++ /dev/null @@ -1,114 +0,0 @@ -import ExternalVariable from './ast/variables/ExternalVariable'; -import type { - NormalizedInputOptions, - NormalizedOutputOptions, -} from './rollup/types'; -import { makeLegal } from './utils/identifierHelpers'; -import { isAbsolute, normalize, relative } from './utils/path'; - -export default class ExternalModule { - chunk: void; - declarations: { [name: string]: ExternalVariable }; - dynamicImporters: string[] = []; - execIndex: number; - exportedVariables: Map; - exportsNames = false; - exportsNamespace = false; - id: string; - importers: string[] = []; - moduleSideEffects: boolean | 'no-treeshake'; - mostCommonSuggestion = 0; - nameSuggestions: { [name: string]: number }; - reexported = false; - renderPath: string = undefined as any; - renormalizeRenderPath = false; - used = false; - variableName: string; - - constructor( - private readonly options: NormalizedInputOptions, - id: string, - moduleSideEffects: boolean | 'no-treeshake', - ) { - this.id = id; - this.execIndex = Infinity; - this.moduleSideEffects = moduleSideEffects; - - const parts = id.split(/[/\\]/); - this.variableName = makeLegal(parts.pop()); - - this.nameSuggestions = Object.create(null); - this.declarations = Object.create(null); - this.exportedVariables = new Map(); - } - - getVariableForExportName(name: string): ExternalVariable { - if (name === '*') { - this.exportsNamespace = true; - } else if (name !== 'default') { - this.exportsNames = true; - } - - let declaration = this.declarations[name]; - if (declaration) return declaration; - - declaration = new ExternalVariable(this, name); - this.declarations[name] = declaration; - this.exportedVariables.set(declaration, name); - return declaration; - } - - setRenderPath(options: NormalizedOutputOptions, inputBase: string) { - this.renderPath = - typeof options.paths === 'function' - ? options.paths(this.id) - : options.paths[this.id]; - if (!this.renderPath) { - if (isAbsolute(this.id)) { - this.renderPath = normalize(relative(inputBase, this.id)); - this.renormalizeRenderPath = true; - } else { - this.renderPath = this.id; - } - } - - return this.renderPath; - } - - suggestName(name: string) { - if (!this.nameSuggestions[name]) this.nameSuggestions[name] = 0; - this.nameSuggestions[name] += 1; - - if (this.nameSuggestions[name] > this.mostCommonSuggestion) { - this.mostCommonSuggestion = this.nameSuggestions[name]; - this.variableName = name; - } - } - - warnUnusedImports() { - const unused = Object.keys(this.declarations).filter((name) => { - if (name === '*') return false; - const declaration = this.declarations[name]; - return ( - !declaration.included && !this.reexported && !declaration.referenced - ); - }); - - if (unused.length === 0) return; - - const names = - unused.length === 1 - ? `'${unused[0]}' is` - : `${unused - .slice(0, -1) - .map((name) => `'${name}'`) - .join(', ')} and '${unused.slice(-1)}' are`; - - this.options.onwarn({ - code: 'UNUSED_EXTERNAL_IMPORT', - message: `${names} imported from external module '${this.id}' but never used`, - names: unused, - source: this.id, - }); - } -} diff --git a/fixtures/rollup/src/utils/error.ts b/fixtures/rollup/src/utils/error.ts deleted file mode 100644 index fe8ed8dc..00000000 --- a/fixtures/rollup/src/utils/error.ts +++ /dev/null @@ -1,382 +0,0 @@ -import { locate } from 'locate-character'; -import type Module from '../Module'; -import type { - NormalizedInputOptions, - RollupError, - RollupLogProps, - RollupWarning, - WarningHandler, -} from '../rollup/types'; -import getCodeFrame from './getCodeFrame'; -import relativeId from './relativeId'; - -export function error(base: Error | RollupError): never { - throw base; -} - -export function augmentCodeLocation( - props: RollupLogProps, - pos: number | { column: number; line: number }, - source: string, - id: string, -): void { - if (typeof pos === 'object') { - const { line, column } = pos; - props.loc = { file: id, line, column }; - } else { - props.pos = pos; - const { line, column } = locate(source, pos, { offsetLine: 1 }); - props.loc = { file: id, line, column }; - } - - if (props.frame === undefined) { - const { line, column } = props.loc; - props.frame = getCodeFrame(source, line, column); - } -} - -export enum Errors { - ASSET_NOT_FINALISED = 'ASSET_NOT_FINALISED', - ASSET_NOT_FOUND = 'ASSET_NOT_FOUND', - ASSET_SOURCE_ALREADY_SET = 'ASSET_SOURCE_ALREADY_SET', - ASSET_SOURCE_MISSING = 'ASSET_SOURCE_MISSING', - BAD_LOADER = 'BAD_LOADER', - CANNOT_EMIT_FROM_OPTIONS_HOOK = 'CANNOT_EMIT_FROM_OPTIONS_HOOK', - CHUNK_NOT_GENERATED = 'CHUNK_NOT_GENERATED', - DEPRECATED_FEATURE = 'DEPRECATED_FEATURE', - FILE_NOT_FOUND = 'FILE_NOT_FOUND', - FILE_NAME_CONFLICT = 'FILE_NAME_CONFLICT', - INPUT_HOOK_IN_OUTPUT_PLUGIN = 'INPUT_HOOK_IN_OUTPUT_PLUGIN', - INVALID_CHUNK = 'INVALID_CHUNK', - INVALID_EXPORT_OPTION = 'INVALID_EXPORT_OPTION', - INVALID_EXTERNAL_ID = 'INVALID_EXTERNAL_ID', - INVALID_OPTION = 'INVALID_OPTION', - INVALID_PLUGIN_HOOK = 'INVALID_PLUGIN_HOOK', - INVALID_ROLLUP_PHASE = 'INVALID_ROLLUP_PHASE', - MISSING_IMPLICIT_DEPENDANT = 'MISSING_IMPLICIT_DEPENDANT', - MIXED_EXPORTS = 'MIXED_EXPORTS', - NAMESPACE_CONFLICT = 'NAMESPACE_CONFLICT', - PLUGIN_ERROR = 'PLUGIN_ERROR', - UNRESOLVED_ENTRY = 'UNRESOLVED_ENTRY', - UNRESOLVED_IMPORT = 'UNRESOLVED_IMPORT', - VALIDATION_ERROR = 'VALIDATION_ERROR', - EXTERNAL_SYNTHETIC_EXPORTS = 'EXTERNAL_SYNTHETIC_EXPORTS', - SYNTHETIC_NAMED_EXPORTS_NEED_DEFAULT = 'SYNTHETIC_NAMED_EXPORTS_NEED_DEFAULT', -} - -export function errAssetNotFinalisedForFileName(name: string) { - return { - code: Errors.ASSET_NOT_FINALISED, - message: `Plugin error - Unable to get file name for asset "${name}". Ensure that the source is set and that generate is called first.`, - }; -} - -export function errCannotEmitFromOptionsHook() { - return { - code: Errors.CANNOT_EMIT_FROM_OPTIONS_HOOK, - message: `Cannot emit files or set asset sources in the "outputOptions" hook, use the "renderStart" hook instead.`, - }; -} - -export function errChunkNotGeneratedForFileName(name: string) { - return { - code: Errors.CHUNK_NOT_GENERATED, - message: `Plugin error - Unable to get file name for chunk "${name}". Ensure that generate is called first.`, - }; -} - -export function errAssetReferenceIdNotFoundForSetSource( - assetReferenceId: string, -) { - return { - code: Errors.ASSET_NOT_FOUND, - message: `Plugin error - Unable to set the source for unknown asset "${assetReferenceId}".`, - }; -} - -export function errAssetSourceAlreadySet(name: string) { - return { - code: Errors.ASSET_SOURCE_ALREADY_SET, - message: `Unable to set the source for asset "${name}", source already set.`, - }; -} - -export function errNoAssetSourceSet(assetName: string) { - return { - code: Errors.ASSET_SOURCE_MISSING, - message: `Plugin error creating asset "${assetName}" - no asset source set.`, - }; -} - -export function errBadLoader(id: string) { - return { - code: Errors.BAD_LOADER, - message: `Error loading ${relativeId( - id, - )}: plugin load hook should return a string, a { code, map } object, or nothing/null`, - }; -} - -export function errDeprecation(deprecation: string | RollupWarning) { - return { - code: Errors.DEPRECATED_FEATURE, - ...(typeof deprecation === 'string' - ? { message: deprecation } - : deprecation), - }; -} - -export function errFileReferenceIdNotFoundForFilename( - assetReferenceId: string, -) { - return { - code: Errors.FILE_NOT_FOUND, - message: `Plugin error - Unable to get file name for unknown file "${assetReferenceId}".`, - }; -} - -export function errFileNameConflict(fileName: string) { - return { - code: Errors.FILE_NAME_CONFLICT, - message: `The emitted file "${fileName}" overwrites a previously emitted file of the same name.`, - }; -} - -export function errInputHookInOutputPlugin( - pluginName: string, - hookName: string, -) { - return { - code: Errors.INPUT_HOOK_IN_OUTPUT_PLUGIN, - message: `The "${hookName}" hook used by the output plugin ${pluginName} is a build time hook and will not be run for that plugin. Either this plugin cannot be used as an output plugin, or it should have an option to configure it as an output plugin.`, - }; -} - -export function errCannotAssignModuleToChunk( - moduleId: string, - assignToAlias: string, - currentAlias: string, -) { - return { - code: Errors.INVALID_CHUNK, - message: `Cannot assign ${relativeId( - moduleId, - )} to the "${assignToAlias}" chunk as it is already in the "${currentAlias}" chunk.`, - }; -} - -export function errInvalidExportOptionValue(optionValue: string) { - return { - code: Errors.INVALID_EXPORT_OPTION, - message: `"output.exports" must be "default", "named", "none", "auto", or left unspecified (defaults to "auto"), received "${optionValue}"`, - url: `https://rollupjs.org/guide/en/#output-exports`, - }; -} - -export function errIncompatibleExportOptionValue( - optionValue: string, - keys: string[], - entryModule: string, -) { - return { - code: 'INVALID_EXPORT_OPTION', - message: `"${optionValue}" was specified for "output.exports", but entry module "${relativeId( - entryModule, - )}" has the following exports: ${keys.join(', ')}`, - }; -} - -export function errInternalIdCannotBeExternal( - source: string, - importer: string, -) { - return { - code: Errors.INVALID_EXTERNAL_ID, - message: `'${source}' is imported as an external by ${relativeId( - importer, - )}, but is already an existing non-external module id.`, - }; -} - -export function errInvalidOption(option: string, explanation: string) { - return { - code: Errors.INVALID_OPTION, - message: `Invalid value for option "${option}" - ${explanation}.`, - }; -} - -export function errInvalidRollupPhaseForAddWatchFile() { - return { - code: Errors.INVALID_ROLLUP_PHASE, - message: `Cannot call addWatchFile after the build has finished.`, - }; -} - -export function errInvalidRollupPhaseForChunkEmission() { - return { - code: Errors.INVALID_ROLLUP_PHASE, - message: `Cannot emit chunks after module loading has finished.`, - }; -} - -export function errImplicitDependantCannotBeExternal( - unresolvedId: string, - implicitlyLoadedBefore: string, -) { - return { - code: Errors.MISSING_IMPLICIT_DEPENDANT, - message: `Module "${relativeId( - unresolvedId, - )}" that should be implicitly loaded before "${relativeId( - implicitlyLoadedBefore, - )}" cannot be external.`, - }; -} - -export function errUnresolvedImplicitDependant( - unresolvedId: string, - implicitlyLoadedBefore: string, -) { - return { - code: Errors.MISSING_IMPLICIT_DEPENDANT, - message: `Module "${relativeId( - unresolvedId, - )}" that should be implicitly loaded before "${relativeId( - implicitlyLoadedBefore, - )}" could not be resolved.`, - }; -} - -export function errImplicitDependantIsNotIncluded(module: Module) { - const implicitDependencies = [...module.implicitlyLoadedBefore] - .map((dependency) => relativeId(dependency.id)) - .sort(); - return { - code: Errors.MISSING_IMPLICIT_DEPENDANT, - message: `Module "${relativeId( - module.id, - )}" that should be implicitly loaded before "${ - implicitDependencies.length === 1 - ? implicitDependencies[0] - : `${implicitDependencies.slice(0, -1).join('", "')}" and "${ - implicitDependencies.slice(-1)[0] - }` - }" is not included in the module graph. Either it was not imported by an included module or only via a tree-shaken dynamic import, or no imported bindings were used and it had otherwise no side-effects.`, - }; -} - -export function errMixedExport(facadeModuleId: string, name?: string) { - return { - code: Errors.MIXED_EXPORTS, - id: facadeModuleId, - message: `Entry module "${relativeId( - facadeModuleId, - )}" is using named and default exports together. Consumers of your bundle will have to use \`${ - name || 'chunk' - }["default"]\` to access the default export, which may not be what you want. Use \`output.exports: "named"\` to disable this warning`, - url: `https://rollupjs.org/guide/en/#output-exports`, - }; -} - -export function errNamespaceConflict( - name: string, - reexportingModule: Module, - additionalExportAllModule: Module, -) { - return { - code: Errors.NAMESPACE_CONFLICT, - message: `Conflicting namespaces: ${relativeId( - reexportingModule.id, - )} re-exports '${name}' from both ${relativeId( - reexportingModule.exportsAll[name], - )} and ${relativeId( - additionalExportAllModule.exportsAll[name], - )} (will be ignored)`, - name, - reexporter: reexportingModule.id, - sources: [ - reexportingModule.exportsAll[name], - additionalExportAllModule.exportsAll[name], - ], - }; -} - -export function errEntryCannotBeExternal(unresolvedId: string) { - return { - code: Errors.UNRESOLVED_ENTRY, - message: `Entry module cannot be external (${relativeId(unresolvedId)}).`, - }; -} - -export function errUnresolvedEntry(unresolvedId: string) { - return { - code: Errors.UNRESOLVED_ENTRY, - message: `Could not resolve entry module (${relativeId(unresolvedId)}).`, - }; -} - -export function errUnresolvedImport(source: string, importer: string) { - return { - code: Errors.UNRESOLVED_IMPORT, - message: `Could not resolve '${source}' from ${relativeId(importer)}`, - }; -} - -export function errUnresolvedImportTreatedAsExternal( - source: string, - importer: string, -) { - return { - code: Errors.UNRESOLVED_IMPORT, - importer: relativeId(importer), - message: `'${source}' is imported by ${relativeId( - importer, - )}, but could not be resolved – treating it as an external dependency`, - source, - url: 'https://rollupjs.org/guide/en/#warning-treating-module-as-external-dependency', - }; -} - -export function errExternalSyntheticExports(source: string, importer: string) { - return { - code: Errors.EXTERNAL_SYNTHETIC_EXPORTS, - importer: relativeId(importer), - message: `External '${source}' can not have 'syntheticNamedExports' enabled.`, - source, - }; -} - -export function errFailedValidation(message: string) { - return { - code: Errors.VALIDATION_ERROR, - message, - }; -} - -export function warnDeprecation( - deprecation: string | RollupWarning, - activeDeprecation: boolean, - options: NormalizedInputOptions, -): void { - warnDeprecationWithOptions( - deprecation, - activeDeprecation, - options.onwarn, - options.strictDeprecations, - ); -} - -export function warnDeprecationWithOptions( - deprecation: string | RollupWarning, - activeDeprecation: boolean, - warn: WarningHandler, - strictDeprecations: boolean, -): void { - if (!activeDeprecation && !strictDeprecations) return; - const warning = errDeprecation(deprecation); - if (strictDeprecations) { - return error(warning); - } - - warn(warning); -} diff --git a/fixtures/rollup/src/utils/executionOrder.ts b/fixtures/rollup/src/utils/executionOrder.ts deleted file mode 100644 index 59632a30..00000000 --- a/fixtures/rollup/src/utils/executionOrder.ts +++ /dev/null @@ -1,90 +0,0 @@ -import type ExternalModule from '../ExternalModule'; -import Module from '../Module'; -import relativeId from './relativeId'; - -interface OrderedExecutionUnit { - execIndex: number; -} - -const compareExecIndex = ( - unitA: T, - unitB: T, -) => (unitA.execIndex > unitB.execIndex ? 1 : -1); - -export function sortByExecutionOrder(units: OrderedExecutionUnit[]) { - units.sort(compareExecIndex); -} - -export function analyseModuleExecution(entryModules: Module[]) { - let nextExecIndex = 0; - const cyclePaths: string[][] = []; - const analysedModules = new Set(); - const dynamicImports = new Set(); - const parents = new Map(); - const orderedModules: Module[] = []; - - const analyseModule = (module: Module | ExternalModule) => { - if (module instanceof Module) { - for (const dependency of module.dependencies) { - if (parents.has(dependency)) { - if (!analysedModules.has(dependency)) { - cyclePaths.push(getCyclePath(dependency, module, parents)); - } - - continue; - } - - parents.set(dependency, module); - analyseModule(dependency); - } - - for (const dependency of module.implicitlyLoadedBefore) { - dynamicImports.add(dependency); - } - - for (const { resolution } of module.dynamicImports) { - if (resolution instanceof Module) { - dynamicImports.add(resolution); - } - } - - orderedModules.push(module); - } - - module.execIndex = nextExecIndex++; - analysedModules.add(module); - }; - - for (const curEntry of entryModules) { - if (!parents.has(curEntry)) { - parents.set(curEntry, null); - analyseModule(curEntry); - } - } - - for (const curEntry of dynamicImports) { - if (!parents.has(curEntry)) { - parents.set(curEntry, null); - analyseModule(curEntry); - } - } - - return { orderedModules, cyclePaths }; -} - -function getCyclePath( - module: Module | ExternalModule, - parent: Module, - parents: Map, -) { - const path = [relativeId(module.id)]; - let nextModule = parent; - while (nextModule !== module) { - path.push(relativeId(nextModule.id)); - nextModule = parents.get(nextModule); - } - - path.push(path[0]); - path.reverse(); - return path; -} diff --git a/fixtures/rollup/src/utils/options/mergeOptions.ts b/fixtures/rollup/src/utils/options/mergeOptions.ts deleted file mode 100644 index 0cd6f620..00000000 --- a/fixtures/rollup/src/utils/options/mergeOptions.ts +++ /dev/null @@ -1,268 +0,0 @@ -import type { - ExternalOption, - InputOptions, - MergedRollupOptions, - OutputOptions, - RollupCache, - WarningHandler, -} from '../../rollup/types'; -import { WarningHandlerWithDefault } from '../../rollup/types'; -import { ensureArray } from '../ensureArray'; -import type { CommandConfigObject } from './normalizeInputOptions'; -import type { GenericConfigObject } from './options'; -import { defaultOnWarn, warnUnknownOptions } from './options'; - -export const commandAliases: { [key: string]: string } = { - c: 'config', - d: 'dir', - e: 'external', - f: 'format', - g: 'globals', - h: 'help', - i: 'input', - m: 'sourcemap', - n: 'name', - o: 'file', - p: 'plugin', - v: 'version', - w: 'watch', -}; - -export function mergeOptions( - config: GenericConfigObject, - rawCommandOptions: GenericConfigObject = {}, - defaultOnWarnHandler: WarningHandler = defaultOnWarn, -): MergedRollupOptions { - const command = getCommandOptions({ - external: [], - globals: undefined, - ...rawCommandOptions, - }); - const inputOptions = mergeInputOptions(config, command, defaultOnWarnHandler); - const warn = inputOptions.onwarn; - if (command.output) { - Object.assign(command, command.output); - } - - const outputOptionsArray = ensureArray( - config.output, - ) as GenericConfigObject[]; - if (outputOptionsArray.length === 0) outputOptionsArray.push({}); - const outputOptions = outputOptionsArray.map((singleOutputOptions) => - mergeOutputOptions(singleOutputOptions, command, warn), - ); - - warnUnknownOptions( - command, - [ - ...Object.keys(inputOptions), - ...Object.keys(outputOptions[0]).filter( - (option) => option !== 'sourcemapPathTransform', - ), - ...Object.keys(commandAliases), - 'config', - 'environment', - 'plugin', - 'silent', - 'stdin', - 'waitForBundleInput', - ], - 'CLI flags', - warn, - /^_$|output$|config/, - ); - inputOptions.output = outputOptions; - return inputOptions; -} - -function getCommandOptions( - rawCommandOptions: GenericConfigObject, -): CommandConfigObject { - const external = - rawCommandOptions.external && typeof rawCommandOptions.external === 'string' - ? rawCommandOptions.external.split(',') - : []; - return { - ...rawCommandOptions, - external, - globals: - typeof rawCommandOptions.globals === 'string' - ? rawCommandOptions.globals - .split(',') - .reduce((globals: any, globalDefinition: any) => { - const [id, variableName] = globalDefinition.split(':'); - globals[id] = variableName; - if (!external.includes(id)) { - external.push(id); - } - - return globals; - }, Object.create(null)) - : undefined, - }; -} - -type CompleteInputOptions = { - [K in U]: InputOptions[K]; -}; - -function mergeInputOptions( - config: GenericConfigObject, - overrides: CommandConfigObject, - defaultOnWarnHandler: WarningHandler, -): InputOptions { - const getOption = (name: string): any => overrides[name] ?? config[name]; - const inputOptions: CompleteInputOptions = { - acorn: getOption('acorn'), - acornInjectPlugins: config.acornInjectPlugins as - | (() => void) - | (() => void)[] - | undefined, - cache: config.cache as false | RollupCache | undefined, - context: getOption('context'), - experimentalCacheExpiry: getOption('experimentalCacheExpiry'), - external: getExternal(config, overrides), - inlineDynamicImports: getOption('inlineDynamicImports'), - input: getOption('input') || [], - manualChunks: getOption('manualChunks'), - moduleContext: getOption('moduleContext'), - onwarn: getOnWarn(config, defaultOnWarnHandler), - perf: getOption('perf'), - plugins: ensureArray(config.plugins) as Plugin[], - preserveEntrySignatures: getOption('preserveEntrySignatures'), - preserveModules: getOption('preserveModules'), - preserveSymlinks: getOption('preserveSymlinks'), - shimMissingExports: getOption('shimMissingExports'), - strictDeprecations: getOption('strictDeprecations'), - treeshake: getObjectOption(config, overrides, 'treeshake'), - watch: getWatch(config, overrides, 'watch'), - }; - - warnUnknownOptions( - config, - Object.keys(inputOptions), - 'input options', - inputOptions.onwarn, - /^output$/, - ); - return inputOptions; -} - -const getExternal = ( - config: GenericConfigObject, - overrides: CommandConfigObject, -): ExternalOption => { - const configExternal = config.external as ExternalOption | undefined; - return typeof configExternal === 'function' - ? (source: string, importer: string | undefined, isResolved: boolean) => - configExternal(source, importer, isResolved) || - overrides.external.includes(source) - : [...ensureArray(configExternal), overrides.external]; -}; - -const getOnWarn = ( - config: GenericConfigObject, - defaultOnWarnHandler: WarningHandler, -): WarningHandler => - config.onwarn - ? (warning: any) => config.onwarn(warning, defaultOnWarnHandler) - : defaultOnWarnHandler; - -const getObjectOption = ( - config: GenericConfigObject, - overrides: GenericConfigObject, - name: string, -) => { - const commandOption = normalizeObjectOptionValue(overrides[name]); - const configOption = normalizeObjectOptionValue(config[name]); - if (commandOption !== undefined) { - return commandOption && { ...configOption, ...commandOption }; - } - - return configOption; -}; - -const getWatch = ( - config: GenericConfigObject, - overrides: GenericConfigObject, - name: string, -) => config.watch !== false && getObjectOption(config, overrides, name); - -export const normalizeObjectOptionValue = (optionValue: any) => { - if (!optionValue) { - return optionValue; - } - - if (Array.isArray(optionValue)) { - return optionValue.reduce( - (result, value) => value && result && { ...result, ...value }, - {}, - ); - } - - if (typeof optionValue !== 'object') { - return {}; - } - - return optionValue; -}; - -type CompleteOutputOptions = { - [K in U]: OutputOptions[K]; -}; - -function mergeOutputOptions( - config: GenericConfigObject, - overrides: GenericConfigObject, - warn: WarningHandler, -): OutputOptions { - const getOption = (name: string): any => overrides[name] ?? config[name]; - const outputOptions: CompleteOutputOptions = { - amd: getObjectOption(config, overrides, 'amd'), - assetFileNames: getOption('assetFileNames'), - banner: getOption('banner'), - chunkFileNames: getOption('chunkFileNames'), - compact: getOption('compact'), - dir: getOption('dir'), - dynamicImportFunction: getOption('dynamicImportFunction'), - entryFileNames: getOption('entryFileNames'), - esModule: getOption('esModule'), - exports: getOption('exports'), - extend: getOption('extend'), - externalLiveBindings: getOption('externalLiveBindings'), - file: getOption('file'), - footer: getOption('footer'), - format: getOption('format'), - freeze: getOption('freeze'), - globals: getOption('globals'), - hoistTransitiveImports: getOption('hoistTransitiveImports'), - indent: getOption('indent'), - inlineDynamicImports: getOption('inlineDynamicImports'), - interop: getOption('interop'), - intro: getOption('intro'), - manualChunks: getOption('manualChunks'), - minifyInternalExports: getOption('minifyInternalExports'), - name: getOption('name'), - namespaceToStringTag: getOption('namespaceToStringTag'), - noConflict: getOption('noConflict'), - outro: getOption('outro'), - paths: getOption('paths'), - plugins: ensureArray(config.plugins) as Plugin[], - preferConst: getOption('preferConst'), - preserveModules: getOption('preserveModules'), - sourcemap: getOption('sourcemap'), - sourcemapExcludeSources: getOption('sourcemapExcludeSources'), - sourcemapFile: getOption('sourcemapFile'), - sourcemapPathTransform: getOption('sourcemapPathTransform'), - strict: getOption('strict'), - systemNullSetters: getOption('systemNullSetters'), - }; - - warnUnknownOptions( - config, - Object.keys(outputOptions), - 'output options', - warn, - ); - return outputOptions; -} diff --git a/fixtures/rollup/src/utils/options/normalizeOutputOptions.ts b/fixtures/rollup/src/utils/options/normalizeOutputOptions.ts deleted file mode 100644 index 82d75d6f..00000000 --- a/fixtures/rollup/src/utils/options/normalizeOutputOptions.ts +++ /dev/null @@ -1,345 +0,0 @@ -import type { - GlobalsOption, - InternalModuleFormat, - ManualChunksOption, - ModuleFormat, - NormalizedInputOptions, - NormalizedOutputOptions, - OptionsPaths, - OutputOptions, - SourcemapPathTransformOption, -} from '../../rollup/types'; -import { ensureArray } from '../ensureArray'; -import { errInvalidExportOptionValue, error, warnDeprecation } from '../error'; -import type { GenericConfigObject } from './options'; -import { warnUnknownOptions } from './options'; - -export function normalizeOutputOptions( - config: GenericConfigObject, - inputOptions: NormalizedInputOptions, - unsetInputOptions: Set, -): { options: NormalizedOutputOptions; unsetOptions: Set } { - // These are options that may trigger special warnings or behaviour later - // if the user did not select an explicit value - const unsetOptions = new Set(unsetInputOptions); - - const compact = (config.compact as boolean | undefined) || false; - const format = getFormat(config); - const inlineDynamicImports = getInlineDynamicImports(config, inputOptions); - const preserveModules = getPreserveModules( - config, - inlineDynamicImports, - inputOptions, - ); - const file = getFile(config, preserveModules, inputOptions); - - const outputOptions: NormalizedOutputOptions & OutputOptions = { - amd: getAmd(config), - assetFileNames: - (config.assetFileNames as string | undefined) ?? - 'assets/[name]-[hash][extname]', - banner: getAddon(config, 'banner'), - chunkFileNames: - (config.chunkFileNames as string | undefined) ?? '[name]-[hash].js', - compact, - dir: getDir(config, file), - dynamicImportFunction: getDynamicImportFunction(config, inputOptions), - entryFileNames: getEntryFileNames(config, unsetOptions), - esModule: (config.esModule as boolean | undefined) ?? true, - exports: getExports(config), - extend: (config.extend as boolean | undefined) || false, - externalLiveBindings: - (config.externalLiveBindings as boolean | undefined) ?? true, - file, - footer: getAddon(config, 'footer'), - format, - freeze: (config.freeze as boolean | undefined) ?? true, - globals: (config.globals as GlobalsOption | undefined) || {}, - hoistTransitiveImports: - (config.hoistTransitiveImports as boolean | undefined) ?? true, - indent: getIndent(config, compact), - inlineDynamicImports, - interop: (config.interop as boolean | undefined) ?? true, - intro: getAddon(config, 'intro'), - manualChunks: getManualChunks( - config, - inlineDynamicImports, - preserveModules, - inputOptions, - ), - minifyInternalExports: getMinifyInternalExports(config, format, compact), - name: config.name as string | undefined, - namespaceToStringTag: - (config.namespaceToStringTag as boolean | undefined) || false, - noConflict: (config.noConflict as boolean | undefined) || false, - outro: getAddon(config, 'outro'), - paths: (config.paths as OptionsPaths | undefined) || {}, - plugins: ensureArray(config.plugins) as Plugin[], - preferConst: (config.preferConst as boolean | undefined) || false, - preserveModules, - sourcemap: - (config.sourcemap as boolean | 'inline' | 'hidden' | undefined) || false, - sourcemapExcludeSources: - (config.sourcemapExcludeSources as boolean | undefined) || false, - sourcemapFile: config.sourcemapFile as string | undefined, - sourcemapPathTransform: config.sourcemapPathTransform as - | SourcemapPathTransformOption - | undefined, - strict: (config.strict as boolean | undefined) ?? true, - systemNullSetters: - (config.systemNullSetters as boolean | undefined) || false, - }; - - warnUnknownOptions( - config, - Object.keys(outputOptions), - 'output options', - inputOptions.onwarn, - ); - return { options: outputOptions, unsetOptions }; -} - -const getFile = ( - config: GenericConfigObject, - preserveModules: boolean, - inputOptions: NormalizedInputOptions, -): string | undefined => { - const file = config.file as string | undefined; - if (typeof file === 'string') { - if (preserveModules) { - return error({ - code: 'INVALID_OPTION', - message: - 'You must set "output.dir" instead of "output.file" when using the "output.preserveModules" option.', - }); - } - - if (!Array.isArray(inputOptions.input)) - return error({ - code: 'INVALID_OPTION', - message: - 'You must set "output.dir" instead of "output.file" when providing named inputs.', - }); - } - - return file; -}; - -const getFormat = (config: GenericConfigObject): InternalModuleFormat => { - const configFormat = config.format as ModuleFormat | undefined; - switch (configFormat) { - case undefined: - case 'es': - case 'esm': - case 'module': - return 'es'; - case 'cjs': - case 'commonjs': - return 'cjs'; - case 'system': - case 'systemjs': - return 'system'; - case 'amd': - case 'iife': - case 'umd': - return configFormat; - default: - return error({ - message: `You must specify "output.format", which can be one of "amd", "cjs", "system", "es", "iife" or "umd".`, - url: `https://rollupjs.org/guide/en/#output-format`, - }); - } -}; - -const getInlineDynamicImports = ( - config: GenericConfigObject, - inputOptions: NormalizedInputOptions, -): boolean => { - const inlineDynamicImports = - ((config.inlineDynamicImports as boolean | undefined) ?? - inputOptions.inlineDynamicImports) || - false; - const { input } = inputOptions; - if ( - inlineDynamicImports && - (Array.isArray(input) ? input : Object.keys(input)).length > 1 - ) { - return error({ - code: 'INVALID_OPTION', - message: - 'Multiple inputs are not supported for "output.inlineDynamicImports".', - }); - } - - return inlineDynamicImports; -}; - -const getPreserveModules = ( - config: GenericConfigObject, - inlineDynamicImports: boolean, - inputOptions: NormalizedInputOptions, -): boolean => { - const preserveModules = - ((config.preserveModules as boolean | undefined) ?? - inputOptions.preserveModules) || - false; - if (preserveModules) { - if (inlineDynamicImports) { - return error({ - code: 'INVALID_OPTION', - message: `The "output.inlineDynamicImports" option is not supported for "output.preserveModules".`, - }); - } - - if (inputOptions.preserveEntrySignatures === false) { - return error({ - code: 'INVALID_OPTION', - message: - 'Setting "preserveEntrySignatures" to "false" is not supported for "output.preserveModules".', - }); - } - } - - return preserveModules; -}; - -const getAmd = ( - config: GenericConfigObject, -): { - define: string; - id?: string; -} => ({ - define: 'define', - ...(config.amd as { - define?: string; - id?: string; - }), -}); - -const getAddon = ( - config: GenericConfigObject, - name: string, -): (() => string | Promise) => { - const configAddon = config[name] as string | (() => string | Promise); - if (typeof configAddon === 'function') { - return configAddon; - } - - return () => configAddon || ''; -}; - -const getDir = ( - config: GenericConfigObject, - file: string | undefined, -): string | undefined => { - const dir = config.dir as string | undefined; - if (typeof dir === 'string' && typeof file === 'string') { - return error({ - code: 'INVALID_OPTION', - message: - 'You must set either "output.file" for a single-file build or "output.dir" when generating multiple chunks.', - }); - } - - return dir; -}; - -const getDynamicImportFunction = ( - config: GenericConfigObject, - inputOptions: NormalizedInputOptions, -): string | undefined => { - const configDynamicImportFunction = config.dynamicImportFunction as - | string - | undefined; - if (configDynamicImportFunction) { - warnDeprecation( - `The "output.dynamicImportFunction" option is deprecated. Use the "renderDynamicImport" plugin hook instead.`, - false, - inputOptions, - ); - } - - return configDynamicImportFunction; -}; - -const getEntryFileNames = ( - config: GenericConfigObject, - unsetOptions: Set, -): string => { - const configEntryFileNames = config.entryFileNames as - | string - | undefined - | null; - if (configEntryFileNames === null) { - unsetOptions.add('entryFileNames'); - } - - return configEntryFileNames ?? '[name].js'; -}; - -function getExports( - config: GenericConfigObject, -): 'default' | 'named' | 'none' | 'auto' { - const configExports = config.exports as string | undefined; - if ( - configExports && - !['default', 'named', 'none', 'auto'].includes(configExports) - ) { - return error(errInvalidExportOptionValue(configExports)); - } - - return ( - (configExports as 'default' | 'named' | 'none' | 'auto' | undefined) || - 'auto' - ); -} - -const getIndent = ( - config: GenericConfigObject, - compact: boolean, -): string | true => { - if (compact) { - return ''; - } - - const configIndent = config.indent as string | boolean | undefined; - return configIndent === false ? '' : configIndent ?? true; -}; - -const getManualChunks = ( - config: GenericConfigObject, - inlineDynamicImports: boolean, - preserveModules: boolean, - inputOptions: NormalizedInputOptions, -): ManualChunksOption => { - const configManualChunks = - (config.manualChunks as ManualChunksOption | undefined) || - inputOptions.manualChunks; - if (configManualChunks) { - if (inlineDynamicImports) { - return error({ - code: 'INVALID_OPTION', - message: - 'The "output.manualChunks" option is not supported for "output.inlineDynamicImports".', - }); - } - - if (preserveModules) { - return error({ - code: 'INVALID_OPTION', - message: - 'The "output.manualChunks" option is not supported for "output.preserveModules".', - }); - } - } - - return configManualChunks || {}; -}; - -const getMinifyInternalExports = ( - config: GenericConfigObject, - format: InternalModuleFormat, - compact: boolean, -): boolean => - (config.minifyInternalExports as boolean | undefined) ?? - (compact || format === 'es' || format === 'system'); diff --git a/fixtures/rollup/src/utils/pureComments.ts b/fixtures/rollup/src/utils/pureComments.ts deleted file mode 100644 index 0f2361e0..00000000 --- a/fixtures/rollup/src/utils/pureComments.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type * as acorn from 'acorn'; -import { base as basicWalker } from 'acorn-walk'; -import type { CommentDescription } from '../Module'; - -// Patch up acorn-walk until class-fields are officially supported -basicWalker.FieldDefinition = function (node: any, st: any, c: any) { - if (node.computed) { - c(node.key, st, 'Expression'); - } - - if (node.value) { - c(node.value, st, 'Expression'); - } -}; - -function handlePureAnnotationsOfNode( - node: acorn.Node, - state: { commentIndex: number; commentNodes: CommentDescription[] }, - type: string = node.type, -) { - let commentNode = state.commentNodes[state.commentIndex]; - while (commentNode && node.start >= commentNode.end) { - markPureNode(node, commentNode); - commentNode = state.commentNodes[++state.commentIndex]; - } - - if (commentNode && commentNode.end <= node.end) { - basicWalker[type](node, state, handlePureAnnotationsOfNode); - } -} - -function markPureNode( - node: acorn.Node & { annotations?: CommentDescription[] }, - comment: CommentDescription, -) { - if (node.annotations) { - node.annotations.push(comment); - } else { - node.annotations = [comment]; - } - - if (node.type === 'CallExpression' || node.type === 'NewExpression') { - node.annotatedPure = true; - } -} - -const pureCommentRegex = /[#@]__PURE__/; -const isPureComment = (comment: CommentDescription) => - pureCommentRegex.test(comment.text); - -export function markPureCallExpressions( - comments: CommentDescription[], - esTreeAst: acorn.Node, -) { - handlePureAnnotationsOfNode(esTreeAst, { - commentIndex: 0, - commentNodes: comments.filter(isPureComment), - }); -} diff --git a/fixtures/rollup/src/watch/watch.ts b/fixtures/rollup/src/watch/watch.ts deleted file mode 100644 index 25ed447f..00000000 --- a/fixtures/rollup/src/watch/watch.ts +++ /dev/null @@ -1,254 +0,0 @@ -import * as path from 'node:path'; -import createFilter from 'rollup-pluginutils/src/createFilter'; -import { rollupInternal } from '../rollup/rollup'; -import type { - MergedRollupOptions, - OutputOptions, - RollupBuild, - RollupCache, - RollupWatcher, - WatcherOptions, -} from '../rollup/types'; -import { mergeOptions } from '../utils/options/mergeOptions'; -import type { GenericConfigObject } from '../utils/options/options'; -import { FileWatcher } from './fileWatcher'; - -export class Watcher { - emitter: RollupWatcher; - - private buildDelay = 0; - private buildTimeout: NodeJS.Timer | null = null; - private invalidatedIds: Set = new Set(); - private rerun = false; - private running: boolean; - private tasks: Task[]; - - constructor(configs: GenericConfigObject[], emitter: RollupWatcher) { - this.emitter = emitter; - emitter.close = this.close.bind(this); - this.tasks = configs.map((config) => new Task(this, config)); - this.buildDelay = configs.reduce( - (buildDelay, { watch }: any) => - watch && typeof watch.buildDelay === 'number' - ? Math.max(buildDelay, (watch as WatcherOptions).buildDelay) - : buildDelay, - this.buildDelay, - ); - this.running = true; - process.nextTick(() => this.run()); - } - - close() { - if (this.buildTimeout) clearTimeout(this.buildTimeout); - for (const task of this.tasks) { - task.close(); - } - - this.emitter.removeAllListeners(); - } - - emit(event: string, value?: any) { - this.emitter.emit(event as any, value); - } - - invalidate(id?: string) { - if (id) { - this.invalidatedIds.add(id); - } - - if (this.running) { - this.rerun = true; - return; - } - - if (this.buildTimeout) clearTimeout(this.buildTimeout); - - this.buildTimeout = setTimeout(() => { - this.buildTimeout = null; - for (const id of this.invalidatedIds) { - this.emit('change', id); - } - - this.invalidatedIds.clear(); - this.emit('restart'); - this.run(); - }, this.buildDelay); - } - - private async run() { - this.running = true; - - this.emit('event', { - code: 'START', - }); - - try { - for (const task of this.tasks) { - // eslint-disable-next-line no-await-in-loop - await task.run(); - } - - this.running = false; - this.emit('event', { - code: 'END', - }); - } catch (error) { - this.running = false; - this.emit('event', { - code: 'ERROR', - error, - }); - } - - if (this.rerun) { - this.rerun = false; - this.invalidate(); - } - } -} - -export class Task { - cache: RollupCache = { modules: [] }; - watchFiles: string[] = []; - - private closed: boolean; - private fileWatcher: FileWatcher; - private filter: (id: string) => boolean; - private invalidated = true; - private options: MergedRollupOptions; - private outputFiles: string[]; - private outputs: OutputOptions[]; - private skipWrite: boolean; - private watched: Set; - private watcher: Watcher; - - constructor(watcher: Watcher, config: GenericConfigObject) { - this.watcher = watcher; - this.closed = false; - this.watched = new Set(); - - this.skipWrite = config.watch && Boolean(config.watch.skipWrite); - this.options = mergeOptions(config); - this.outputs = this.options.output; - this.outputFiles = this.outputs.map((output) => { - if (output.file || output.dir) - return path.resolve(output.file || output.dir); - return undefined as any; - }); - - const watchOptions: WatcherOptions = this.options.watch || {}; - this.filter = createFilter(watchOptions.include, watchOptions.exclude); - this.fileWatcher = new FileWatcher(this, { - ...watchOptions.chokidar, - disableGlobbing: true, - ignoreInitial: true, - }); - } - - close() { - this.closed = true; - this.fileWatcher.close(); - } - - invalidate(id: string, isTransformDependency: boolean | undefined) { - this.invalidated = true; - if (isTransformDependency) { - for (const module of this.cache.modules) { - if (!module.transformDependencies.includes(id)) continue; - // Effective invalidation - module.originalCode = null as any; - } - } - - this.watcher.invalidate(id); - } - - async run() { - if (!this.invalidated) return; - this.invalidated = false; - - const options = { - ...this.options, - cache: this.cache, - }; - - const start = Date.now(); - - this.watcher.emit('event', { - code: 'BUNDLE_START', - input: this.options.input, - output: this.outputFiles, - }); - - try { - const result = await rollupInternal(options, this.watcher.emitter); - if (this.closed) { - return; - } - - this.updateWatchedFiles(result); - if (!this.skipWrite) - await Promise.all(this.outputs.map((output) => result.write(output))); - this.watcher.emit('event', { - code: 'BUNDLE_END', - duration: Date.now() - start, - input: this.options.input, - output: this.outputFiles, - result, - }); - } catch (error) { - if (this.closed) { - return; - } - - if (Array.isArray(error.watchFiles)) { - for (const id of error.watchFiles) { - this.watchFile(id); - } - } - - if (error.id) { - this.cache.modules = this.cache.modules.filter( - (module) => module.id !== error.id, - ); - } - - throw error; - } - } - - private updateWatchedFiles(result: RollupBuild) { - const previouslyWatched = this.watched; - this.watched = new Set(); - this.watchFiles = result.watchFiles; - this.cache = result.cache; - for (const id of this.watchFiles) { - this.watchFile(id); - } - - for (const module of this.cache.modules) { - for (const depId of module.transformDependencies) { - this.watchFile(depId, true); - } - } - - for (const id of previouslyWatched) { - if (!this.watched.has(id)) { - this.fileWatcher.unwatch(id); - } - } - } - - private watchFile(id: string, isTransformDependency = false) { - if (!this.filter(id)) return; - this.watched.add(id); - - if (this.outputFiles.includes(id)) { - throw new Error('Cannot import the generated bundle'); - } - - // This is necessary to ensure that any 'renamed' files - // continue to be watched following an error - this.fileWatcher.watch(id, isTransformDependency); - } -} diff --git a/fixtures/tsconfig.json b/fixtures/tsconfig.json deleted file mode 100644 index af305381..00000000 --- a/fixtures/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "include": ["**/*.ts"], - "compilerOptions": { - "strict": true, - "lib": ["ESNext"], - "target": "ESNext" - } -} diff --git a/generate-changeset.md b/generate-changeset.md deleted file mode 100644 index 26d27cdd..00000000 --- a/generate-changeset.md +++ /dev/null @@ -1,7 +0,0 @@ -# Changeset Generator Script - -The changeset generator can be run using `node ./generate-changeset.mjs`. It will create a changeset containing the rule changes between the current branch and `main`. - -It was created to automate the tedious part of making changesets for this repo: Figuring out which rules changed, which rule changes are actually applicable, and creating/formatting markdown links. - -It works by cloning a second copy of the repo on `main`, and running the build both on the current branch, and on `main`, and then diffing the config and rules. diff --git a/generate-changeset.mjs b/generate-changeset.mjs deleted file mode 100644 index 14b947ab..00000000 --- a/generate-changeset.mjs +++ /dev/null @@ -1,256 +0,0 @@ -// @ts-check - -import { spawn } from 'node:child_process'; -import { promises as fs } from 'node:fs'; -import { join } from 'node:path'; - -import _writeChangeset from '@changesets/write'; -import kleur from 'kleur'; -import prettier from 'prettier'; -import prompts from 'prompts'; - -// @ts-expect-error -const writeChangeset = _writeChangeset.default; - -/** - * Wraps child_process.spawn to make it promise-friendly and output to stderr/stdout - * - * @param {string} command - * @param {readonly string[]} args - * @param {import("child_process").SpawnOptionsWithoutStdio} [opts] - * @returns {Promise} - */ -const runCommand = (command, args, opts) => - new Promise((resolve, reject) => { - const child = spawn(command, args, { - ...opts, - stdio: [process.stdin, process.stdout, process.stderr], - }); - child.on('exit', (code) => { - if (code === 0) resolve(); - else reject(code); - }); - }); - -/** @param {string} path */ -const stat = (path) => fs.stat(path).catch(() => null); - -/** @param {string} message */ -const log = (message) => - console.log(kleur.bold(kleur.green(`\n🌀 ${message}`))); - -/** - * @param {string} dir - * @returns {Promise} - */ -const loadConfig = async (dir) => { - const configModule = await import(join(dir, 'index.js')).then( - (m) => m.default, - ); - return configModule; -}; - -/** - * @param {string} input - * @param {string} indenter - */ -const indent = (input, indenter) => - indenter + input.split('\n').join(`\n${indenter}`); - -const prefix = '@cloudfour/'; - -/** @param {string} ruleName */ -const removePrefix = (ruleName) => - ruleName.startsWith(prefix) ? ruleName.slice(prefix.length) : ruleName; - -/** @param {string} ruleName */ -const printRuleForCLI = (ruleName) => { - const isBuiltIn = !ruleName.includes('/'); - ruleName = removePrefix(ruleName); - return isBuiltIn ? ruleName : prefix + ruleName; -}; - -const printRuleConfig = (rule) => JSON.stringify(rule, null, 2); - -const dir = join(process.cwd(), 'tmp-eslint-config'); -if (await stat(dir)) { - log('Updating second copy of repo to latest main'); - await runCommand('git', ['reset', '--hard', 'HEAD'], { cwd: dir }); - await runCommand('git', ['checkout', 'main'], { cwd: dir }); - await runCommand('git', ['fetch'], { cwd: dir }); - await runCommand('git', ['reset', '--hard', 'origin/main'], { cwd: dir }); -} else { - log('Cloning second copy of repo...'); - const url = 'https://github.com/cloudfour/eslint-config'; - await runCommand('git', ['clone', url, dir]); -} -log('Updating this branch to be up to date with main'); -await runCommand('git', ['fetch']); -await runCommand('git', ['merge', 'origin/main']); -log('Installing/updating dependencies on main'); -await runCommand('npm', ['install'], { cwd: dir }); -log('Building on main'); -await runCommand('npm', ['run', 'build'], { cwd: dir }); -log('Installing/updating dependencies on this branch'); -await runCommand('npm', ['install']); -log('Building on this branch'); -await runCommand('npm', ['run', 'build']); -log('Parsing out differences'); - -const mainConfig = await loadConfig(dir); -const branchConfig = await loadConfig(process.cwd()); - -const mainRules = mainConfig.rules || {}; -const branchRules = mainConfig.rules || {}; - -/** @param {string} _ruleName */ -const printRuleLink = (_ruleName) => { - const isBuiltIn = !_ruleName.includes('/'); - const ruleName = removePrefix(_ruleName); - const fullName = isBuiltIn ? ruleName : prefix + ruleName; - const rule = branchRules?.[ruleName] || mainRules?.[ruleName]; - const url = isBuiltIn - ? `https://eslint.org/docs/rules/${fullName}` - : typeof rule === 'object' && rule?.meta?.docs?.url; - return url ? `[\`${fullName}\`](${url})` : `\`${fullName}\``; -}; - -let output = ''; - -/** - * @param {string[]} rules - * @param {string} groupName - */ -const printRuleList = (rules, groupName) => { - if (rules.length === 0) return; - output += ` -**${groupName}** -${rules.map((r) => `- ${printRuleLink(r)}`).join('\n')} -`; - - console.log( - `${kleur.blue(kleur.bold(groupName))} -${rules.map((r) => printRuleForCLI(r)).join('\n')} -`, - ); -}; - -const newRules = Object.keys(branchRules).filter( - (rule) => !(rule in mainRules), -); -printRuleList(newRules, 'New Rules'); - -const deletedRules = Object.keys(mainRules).filter( - (rule) => !(rule in branchRules), -); -printRuleList(deletedRules, 'Deleted Rules'); - -const isEnabled = (rule) => - rule !== undefined && - (Array.isArray(rule) - ? isEnabled(rule[0]) - : rule === 'error' || rule === 2 || rule === 'warn' || rule === 1); - -/** - * @type {{ - * name: string, - * get: (config: import('eslint').ESLint.Plugin) => Partial | undefined}[] - } */ -const scopes = [ - { - name: '`recommended` Config', - get: (config) => config.configs?.recommended?.rules, - }, - { - name: '`recommended` Config » TS Overrides', - get: (config) => config.configs?.recommended?.overrides?.[0].rules, - }, - { - name: '`disable-type-checked` Config', - get: (config) => config.configs?.['disable-type-checked']?.rules, - }, -]; - -for (const scope of scopes) { - const branchScopeRules = scope.get(branchConfig) || {}; - const mainScopeRules = scope.get(mainConfig) || {}; - const newlyEnabledRules = Object.entries(branchScopeRules) - .filter( - ([ruleName, value]) => - isEnabled(value) && !isEnabled(mainScopeRules[ruleName]), - ) - .map(([ruleName]) => ruleName); - printRuleList(newlyEnabledRules, `Newly Enabled Rules (${scope.name})`); - - const newlyDisabledRules = Object.entries(mainScopeRules) - .filter( - ([ruleName, value]) => - isEnabled(value) && !isEnabled(branchScopeRules[ruleName]), - ) - .map(([ruleName]) => ruleName); - printRuleList(newlyDisabledRules, `Newly Disabled Rules (${scope.name})`); - - let hasOutputReconfiguredRules = false; - for (const ruleName of Object.keys(branchScopeRules)) { - const branchConfigPrinted = printRuleConfig(branchScopeRules[ruleName]); - const mainConfigPrinted = printRuleConfig(mainScopeRules[ruleName]); - if ( - branchConfigPrinted !== mainConfigPrinted && - // Make sure that it is enabled on both branches - isEnabled(branchScopeRules[ruleName]) && - isEnabled(mainScopeRules[ruleName]) - ) { - if (!hasOutputReconfiguredRules) { - output += `\n**Reconfigured Rules (${scope.name})**\n`; - console.log( - `${kleur.blue(kleur.bold(`Reconfigured Rules (${scope.name})`))}`, - ); - hasOutputReconfiguredRules = true; - } - console.log(printRuleForCLI(ruleName)); - console.log(kleur.red(indent(mainConfigPrinted, '- '))); - console.log(kleur.green(indent(branchConfigPrinted, '+ '))); - - output += ` -- ${printRuleLink(ruleName)} - \`\`\`diff -${indent(mainConfigPrinted, ' - ')} -${indent(branchConfigPrinted, ' + ')} - \`\`\``; - } - } -} - -const pkgName = '@cloudfour/eslint-plugin'; - -const { versionBump, summary } = await prompts( - [ - { - name: 'versionBump', - type: 'select', - choices: [ - { title: 'patch', value: 'patch' }, - { title: 'minor', value: 'minor' }, - { title: 'major', value: 'major' }, - ], - message: `What kind of change is this for ${kleur.green(pkgName)}?`, - }, - { - name: 'summary', - type: 'text', - message: 'Summary', - }, - ], - // eslint-disable-next-line @cloudfour/n/no-process-exit, @cloudfour/unicorn/no-process-exit - { onCancel: () => process.exit(1) }, -); - -output = `${summary}\n${output}`; - -const changeset = { - summary: await prettier.format(output, { parser: 'markdown' }), - releases: [{ name: pkgName, type: versionBump }], -}; - -const uniqueId = await writeChangeset(changeset, process.cwd()); -log(`Wrote changeset to ${join('.changeset', `${uniqueId}.md`)}`); diff --git a/index.js b/index.js deleted file mode 100644 index 007127fa..00000000 --- a/index.js +++ /dev/null @@ -1,4 +0,0 @@ -const { configs, environments } = require('./dist/config'); -const rules = require('./src/rules'); - -module.exports = { configs, environments, rules }; diff --git a/package-lock.json b/package-lock.json index 51fc9d28..51783112 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,9945 +1,3524 @@ { - "name": "@cloudfour/eslint-plugin", - "version": "23.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@cloudfour/eslint-plugin", - "version": "23.0.0", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.23.6", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "@typescript-eslint/parser": "^6.8.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsdoc": "^46.8.2", - "eslint-plugin-n": "^16.2.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-unicorn": "^48.0.1" - }, - "devDependencies": { - "@changesets/changelog-github": "0.5.0", - "@changesets/cli": "2.27.1", - "@changesets/write": "0.3.0", - "eliminate": "1.1.2", - "eslint": "8.51.0", - "eslint-config-prettier": "9.0.0", - "eslint-config-standard": "17.1.0", - "eslint-config-xo": "0.43.1", - "eslint-formatter-pretty": "5.0.0", - "kleur": "4.1.5", - "mkdirplz": "1.0.2", - "powerwalker": "0.1.2", - "prettier": "3.0.3", - "prompts": "2.4.2", - "typescript": "5.3.3" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.0" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", - "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/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "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" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "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==", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "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==" - }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "dependencies": { - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", - "dev": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@changesets/apply-release-plan": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.0.tgz", - "integrity": "sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/config": "^3.0.0", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/apply-release-plan/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/apply-release-plan/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, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@changesets/apply-release-plan/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==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/assemble-release-plan": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.0.tgz", - "integrity": "sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/assemble-release-plan/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/assemble-release-plan/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==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/changelog-git": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", - "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0" - } - }, - "node_modules/@changesets/changelog-git/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/changelog-github": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.5.0.tgz", - "integrity": "sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==", - "dev": true, - "dependencies": { - "@changesets/get-github-info": "^0.6.0", - "@changesets/types": "^6.0.0", - "dotenv": "^8.1.0" - } - }, - "node_modules/@changesets/changelog-github/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/cli": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.1.tgz", - "integrity": "sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^7.0.0", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/changelog-git": "^0.2.0", - "@changesets/config": "^3.0.0", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/get-release-plan": "^4.0.0", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@changesets/write": "^0.3.0", - "@manypkg/get-packages": "^1.1.3", - "@types/semver": "^7.5.0", - "ansi-colors": "^4.1.3", - "chalk": "^2.1.0", - "ci-info": "^3.7.0", - "enquirer": "^2.3.0", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "meow": "^6.0.0", - "outdent": "^0.5.0", - "p-limit": "^2.2.0", - "preferred-pm": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^2.0.0", - "term-size": "^2.1.0", - "tty-table": "^4.1.5" - }, - "bin": { - "changeset": "bin.js" - } - }, - "node_modules/@changesets/cli/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/cli/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==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.0.tgz", - "integrity": "sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==", - "dev": true, - "dependencies": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.2" - } - }, - "node_modules/@changesets/config/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", - "dev": true, - "dependencies": { - "extendable-error": "^0.1.5" - } - }, - "node_modules/@changesets/get-dependents-graph": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.0.0.tgz", - "integrity": "sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "semver": "^7.5.3" - } - }, - "node_modules/@changesets/get-dependents-graph/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/get-dependents-graph/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==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@changesets/get-github-info": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz", - "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==", - "dev": true, - "dependencies": { - "dataloader": "^1.4.0", - "node-fetch": "^2.5.0" - } - }, - "node_modules/@changesets/get-release-plan": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.0.tgz", - "integrity": "sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/config": "^3.0.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" - } - }, - "node_modules/@changesets/get-release-plan/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "dev": true - }, - "node_modules/@changesets/git": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.0.tgz", - "integrity": "sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.2", - "spawndamnit": "^2.0.0" - } - }, - "node_modules/@changesets/git/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/logger": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.0.tgz", - "integrity": "sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==", - "dev": true, - "dependencies": { - "chalk": "^2.1.0" - } - }, - "node_modules/@changesets/parse": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", - "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", - "dev": true, - "dependencies": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" - } - }, - "node_modules/@changesets/parse/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/pre": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.0.tgz", - "integrity": "sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - } - }, - "node_modules/@changesets/pre/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/read": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.0.tgz", - "integrity": "sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0" - } - }, - "node_modules/@changesets/read/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true - }, - "node_modules/@changesets/write": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.0.tgz", - "integrity": "sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.20.1", - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "prettier": "^2.7.1" - } - }, - "node_modules/@changesets/write/node_modules/@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "node_modules/@changesets/write/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, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/@es-joy/jsdoccomment": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz", - "integrity": "sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==", - "dependencies": { - "comment-parser": "1.4.0", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - }, - "engines": { - "node": ">=16" - } - }, - "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==", - "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/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "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==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "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==", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - } - }, - "node_modules/@manypkg/find-root/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" - } - }, - "node_modules/@manypkg/get-packages/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "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/@types/eslint": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", - "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" - }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "node_modules/@types/node": { - "version": "12.20.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.43.tgz", - "integrity": "sha512-HCfJdaYqJX3BCzeihgZrD7b85Cu05OC/GVJ4kEYIflwUs4jbnUlLLWoq7hw1LBcdvUyehO+gr6P5JQ895/2ZfA==", - "dev": true - }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", - "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", - "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/type-utils": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/parser": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", - "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", - "dependencies": { - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", - "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", - "dependencies": { - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", - "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/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/@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", - "dependencies": { - "@typescript-eslint/types": "6.8.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/1d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/1d/-/1d-0.1.1.tgz", - "integrity": "sha512-HEkhNPHQxhc5FwTKUnSsbY5v2IkNQNq/YVBMkgJ7bdYZVe7nfjVvfD3wCXGOyOo4RCsZXBl25gT5VollvUhh7w==", - "dev": true - }, - "node_modules/acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "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" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "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, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", - "engines": { - "node": ">=14" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==" - }, - "node_modules/better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "dependencies": { - "is-windows": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "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==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/breakword": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz", - "integrity": "sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==", - "dev": true, - "dependencies": { - "wcwidth": "^1.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "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.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "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==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dependencies": { - "semver": "^7.0.0" - } - }, - "node_modules/builtins/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/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - }, - "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==", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "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/caniuse-lite": { - "version": "1.0.30001571", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", - "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==", - "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/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "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" - }, - "engines": { - "node": ">=4" - } - }, - "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 - }, - "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "engines": { - "node": ">=8" - } - }, - "node_modules/clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true, - "engines": { - "node": ">=0.8" - } - }, - "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==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "node_modules/comment-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", - "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==", - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "node_modules/confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "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==" - }, - "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==", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csv": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", - "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", - "dev": true, - "dependencies": { - "csv-generate": "^3.4.3", - "csv-parse": "^4.16.3", - "csv-stringify": "^5.6.5", - "stream-transform": "^2.1.3" - }, - "engines": { - "node": ">= 0.1.90" - } - }, - "node_modules/csv-generate": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", - "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", - "dev": true - }, - "node_modules/csv-parse": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", - "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", - "dev": true - }, - "node_modules/csv-stringify": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", - "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", - "dev": true - }, - "node_modules/dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", - "dev": true - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "dependencies": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dependencies": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.616", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", - "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==" - }, - "node_modules/eliminate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eliminate/-/eliminate-1.1.2.tgz", - "integrity": "sha512-FDdzDmgNL77+iMiWOY8fTlulC51wj8Ni7p/zbv7Sjv0wWJwjLBxOkJgNTA67hJEccKmCJHzuEwQdw1mMUIMpfQ==", - "dev": true, - "bin": { - "eliminate": "src/bin.js" - }, - "engines": { - "node": ">= 8" - } - }, - "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==", - "dev": true - }, - "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, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "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==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "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.0", - "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.4.3", - "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-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "engines": { - "node": ">=6" - } - }, - "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": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "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" - } - ], - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "eslint": "^8.0.1", - "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", - "eslint-plugin-promise": "^6.0.0" - } - }, - "node_modules/eslint-config-xo": { - "version": "0.43.1", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.43.1.tgz", - "integrity": "sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==", - "dev": true, - "dependencies": { - "confusing-browser-globals": "1.0.11" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - }, - "peerDependencies": { - "eslint": ">=8.27.0" - } - }, - "node_modules/eslint-formatter-pretty": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-5.0.0.tgz", - "integrity": "sha512-Uick451FoL22/wXqyScX3inW8ZlD/GQO7eFXj3bqb6N/ZtuuF00/CwSNIKLbFCJPrX5V4EdQBSgJ/UVnmLRnug==", - "dev": true, - "dependencies": { - "@types/eslint": "^8.0.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.235", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-formatter-pretty/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint-formatter-pretty/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/eslint-formatter-pretty/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint-formatter-pretty/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==", - "dev": true - }, - "node_modules/eslint-formatter-pretty/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-formatter-pretty/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-es-x": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.1.0.tgz", - "integrity": "sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.5.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ota-meshi" - }, - "peerDependencies": { - "eslint": ">=8" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "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.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-jsdoc": { - "version": "46.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.2.tgz", - "integrity": "sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==", - "dependencies": { - "@es-joy/jsdoccomment": "~0.40.1", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.0", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-jsdoc/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint-plugin-jsdoc/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/eslint-plugin-n": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.2.0.tgz", - "integrity": "sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.1.0", - "get-tsconfig": "^4.7.0", - "ignore": "^5.2.4", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, - "engines": { - "node": ">=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-n/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/eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-plugin-unicorn": { - "version": "48.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz", - "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^3.8.0", - "clean-regexp": "^1.0.0", - "esquery": "^1.5.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.5.4", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" - }, - "peerDependencies": { - "eslint": ">=8.44.0" - } - }, - "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-plugin-unicorn/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/eslint-rule-docs": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/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==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/eslint/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==" - }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "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/eslint/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/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==" - }, - "node_modules/eslint/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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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/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==", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/eslint/node_modules/globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/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==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "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==", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "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==", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint/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==", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "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==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "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, - "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", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "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" - }, - "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==" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "dev": true, - "dependencies": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "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==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "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==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "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" - }, - "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==", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "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" - }, - "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==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "node_modules/hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "node_modules/human-id": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", - "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", - "dev": true - }, - "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==", - "dev": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "engines": { - "node": ">= 4" - } - }, - "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==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-fresh/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==", - "engines": { - "node": ">=4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "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==" - }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "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==", - "dev": true, - "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==", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "dependencies": { - "better-path-resolve": "1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "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==" - }, - "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==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, - "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==" - }, - "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==" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "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==", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "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==" - }, - "node_modules/load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "node_modules/lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/log-symbols/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/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==", - "dev": true - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "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, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", - "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.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" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "dependencies": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "node_modules/minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/mixme": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz", - "integrity": "sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==", - "dev": true, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/mkdirplz": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mkdirplz/-/mkdirplz-1.0.2.tgz", - "integrity": "sha512-TjEXdMRdNb2qacgAC0SI/GGaQ8/MzksQYaZeiAx6Jk0Z9AS5wNVIIxDCP3oHIKnkgzCAkaD9pYOyidypI+cdyw==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "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==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "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, - "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-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "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" - } - }, - "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==", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "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==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "get-intrinsic": "^1.2.1" - } - }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true - }, - "node_modules/p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "dependencies": { - "p-map": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "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==", - "engines": { - "node": ">=6" - } - }, - "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==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "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==", - "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/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "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==" - }, - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "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/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "dependencies": { - "irregular-plurals": "^3.2.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "engines": { - "node": ">=4" - } - }, - "node_modules/powerwalker": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/powerwalker/-/powerwalker-0.1.2.tgz", - "integrity": "sha512-KlS9PvqiIW3WBRKZ5nlhNW87AXlmhnALq3fWhW62zHKPKas6F6HO4VCKIqGOWXK1Fv0JievSR0CR+Kbx3jBeWw==", - "dev": true, - "dependencies": { - "1d": "^0.1.1" - } - }, - "node_modules/preferred-pm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", - "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", - "dev": true, - "dependencies": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/preferred-pm/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/preferred-pm/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/preferred-pm/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/preferred-pm/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/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "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/prompts/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/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "engines": { - "node": ">=6" - } - }, - "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", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "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" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "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/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", - "bin": { - "regexp-tree": "bin/regexp-tree" - } - }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", - "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/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", - "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", - "dependencies": { - "is-core-module": "^2.12.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-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "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==", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "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/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "bin": { - "semver": "bin/semver.js" - } - }, - "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 - }, - "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==", - "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==", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "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==", - "dev": true - }, - "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", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "engines": { - "node": ">=8" - } - }, - "node_modules/smartwrap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", - "integrity": "sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==", - "dev": true, - "dependencies": { - "array.prototype.flat": "^1.2.3", - "breakword": "^1.0.5", - "grapheme-splitter": "^1.0.4", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1", - "yargs": "^15.1.0" - }, - "bin": { - "smartwrap": "src/terminal-adapter.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/smartwrap/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/smartwrap/node_modules/cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "node_modules/smartwrap/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/smartwrap/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==", - "dev": true - }, - "node_modules/smartwrap/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/smartwrap/node_modules/y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "node_modules/smartwrap/node_modules/yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "dependencies": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/spawndamnit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", - "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", - "dev": true, - "dependencies": { - "cross-spawn": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "node_modules/spawndamnit/node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/spawndamnit/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "node_modules/spawndamnit/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawndamnit/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/spawndamnit/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/spawndamnit/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "node_modules/stream-transform": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", - "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", - "dev": true, - "dependencies": { - "mixme": "^0.5.1" - } - }, - "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.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "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==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "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==", - "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==", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "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/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "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" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, - "node_modules/tty-table": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz", - "integrity": "sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==", - "dev": true, - "dependencies": { - "chalk": "^4.1.2", - "csv": "^5.5.0", - "kleur": "^4.1.4", - "smartwrap": "^2.0.2", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1", - "yargs": "^17.1.1" - }, - "bin": { - "tty-table": "adapters/terminal-adapter.js" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/tty-table/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/tty-table/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/tty-table/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/tty-table/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==", - "dev": true - }, - "node_modules/tty-table/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tty-table/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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==", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "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.1", - "picocolors": "^1.0.0" - }, - "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==", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "node_modules/which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", - "dev": true, - "dependencies": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8.15" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "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/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/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==", - "dev": true - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "node_modules/yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "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.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true, - "engines": { - "node": ">=12" - } - }, - "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==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==" - }, - "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "requires": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", - "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" - } - }, - "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==" - }, - "@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - } - }, - "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", - "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } - } - }, - "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "dependencies": { - "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==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", - "requires": { - "@babel/types": "^7.22.15" - } - }, - "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==" - }, - "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" - }, - "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" - }, - "@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" - } - }, - "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0" - } - }, - "@babel/parser": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", - "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==" - }, - "@babel/runtime": { - "version": "7.20.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.6.tgz", - "integrity": "sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", - "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" - } - }, - "@babel/traverse": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", - "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.6", - "@babel/types": "^7.23.6", - "debug": "^4.3.1", - "globals": "^11.1.0" - } - }, - "@babel/types": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", - "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", - "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" - } - }, - "@changesets/apply-release-plan": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@changesets/apply-release-plan/-/apply-release-plan-7.0.0.tgz", - "integrity": "sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/config": "^3.0.0", - "@changesets/get-version-range-type": "^0.4.0", - "@changesets/git": "^3.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "detect-indent": "^6.0.0", - "fs-extra": "^7.0.1", - "lodash.startcase": "^4.4.0", - "outdent": "^0.5.0", - "prettier": "^2.7.1", - "resolve-from": "^5.0.0", - "semver": "^7.5.3" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@changesets/assemble-release-plan": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.0.tgz", - "integrity": "sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "semver": "^7.5.3" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@changesets/changelog-git": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-git/-/changelog-git-0.2.0.tgz", - "integrity": "sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==", - "dev": true, - "requires": { - "@changesets/types": "^6.0.0" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/changelog-github": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@changesets/changelog-github/-/changelog-github-0.5.0.tgz", - "integrity": "sha512-zoeq2LJJVcPJcIotHRJEEA2qCqX0AQIeFE+L21L8sRLPVqDhSXY8ZWAt2sohtBpFZkBwu+LUwMSKRr2lMy3LJA==", - "dev": true, - "requires": { - "@changesets/get-github-info": "^0.6.0", - "@changesets/types": "^6.0.0", - "dotenv": "^8.1.0" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/cli": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/@changesets/cli/-/cli-2.27.1.tgz", - "integrity": "sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/apply-release-plan": "^7.0.0", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/changelog-git": "^0.2.0", - "@changesets/config": "^3.0.0", - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/get-release-plan": "^4.0.0", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@changesets/write": "^0.3.0", - "@manypkg/get-packages": "^1.1.3", - "@types/semver": "^7.5.0", - "ansi-colors": "^4.1.3", - "chalk": "^2.1.0", - "ci-info": "^3.7.0", - "enquirer": "^2.3.0", - "external-editor": "^3.1.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "meow": "^6.0.0", - "outdent": "^0.5.0", - "p-limit": "^2.2.0", - "preferred-pm": "^3.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.3", - "spawndamnit": "^2.0.0", - "term-size": "^2.1.0", - "tty-table": "^4.1.5" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@changesets/config": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@changesets/config/-/config-3.0.0.tgz", - "integrity": "sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==", - "dev": true, - "requires": { - "@changesets/errors": "^0.2.0", - "@changesets/get-dependents-graph": "^2.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1", - "micromatch": "^4.0.2" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/errors": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@changesets/errors/-/errors-0.2.0.tgz", - "integrity": "sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==", - "dev": true, - "requires": { - "extendable-error": "^0.1.5" - } - }, - "@changesets/get-dependents-graph": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@changesets/get-dependents-graph/-/get-dependents-graph-2.0.0.tgz", - "integrity": "sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==", - "dev": true, - "requires": { - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "semver": "^7.5.3" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@changesets/get-github-info": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/get-github-info/-/get-github-info-0.6.0.tgz", - "integrity": "sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==", - "dev": true, - "requires": { - "dataloader": "^1.4.0", - "node-fetch": "^2.5.0" - } - }, - "@changesets/get-release-plan": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@changesets/get-release-plan/-/get-release-plan-4.0.0.tgz", - "integrity": "sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/assemble-release-plan": "^6.0.0", - "@changesets/config": "^3.0.0", - "@changesets/pre": "^2.0.0", - "@changesets/read": "^0.6.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/get-version-range-type": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/get-version-range-type/-/get-version-range-type-0.4.0.tgz", - "integrity": "sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==", - "dev": true - }, - "@changesets/git": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@changesets/git/-/git-3.0.0.tgz", - "integrity": "sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "is-subdir": "^1.1.1", - "micromatch": "^4.0.2", - "spawndamnit": "^2.0.0" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/logger": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@changesets/logger/-/logger-0.1.0.tgz", - "integrity": "sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==", - "dev": true, - "requires": { - "chalk": "^2.1.0" - } - }, - "@changesets/parse": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@changesets/parse/-/parse-0.4.0.tgz", - "integrity": "sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==", - "dev": true, - "requires": { - "@changesets/types": "^6.0.0", - "js-yaml": "^3.13.1" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/pre": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@changesets/pre/-/pre-2.0.0.tgz", - "integrity": "sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/errors": "^0.2.0", - "@changesets/types": "^6.0.0", - "@manypkg/get-packages": "^1.1.3", - "fs-extra": "^7.0.1" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/read": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@changesets/read/-/read-0.6.0.tgz", - "integrity": "sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/git": "^3.0.0", - "@changesets/logger": "^0.1.0", - "@changesets/parse": "^0.4.0", - "@changesets/types": "^6.0.0", - "chalk": "^2.1.0", - "fs-extra": "^7.0.1", - "p-filter": "^2.1.0" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - } - } - }, - "@changesets/types": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-4.1.0.tgz", - "integrity": "sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==", - "dev": true - }, - "@changesets/write": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@changesets/write/-/write-0.3.0.tgz", - "integrity": "sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.1", - "@changesets/types": "^6.0.0", - "fs-extra": "^7.0.1", - "human-id": "^1.0.2", - "prettier": "^2.7.1" - }, - "dependencies": { - "@changesets/types": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@changesets/types/-/types-6.0.0.tgz", - "integrity": "sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==", - "dev": true - }, - "prettier": { - "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", - "dev": true - } - } - }, - "@es-joy/jsdoccomment": { - "version": "0.40.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz", - "integrity": "sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==", - "requires": { - "comment-parser": "1.4.0", - "esquery": "^1.5.0", - "jsdoc-type-pratt-parser": "~4.0.0" - } - }, - "@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==", - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==" - }, - "@eslint/eslintrc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", - "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "globals": { - "version": "13.19.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", - "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } - } - }, - "@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==" - }, - "@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==" - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==" - }, - "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "@manypkg/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "@types/node": "^12.7.1", - "find-up": "^4.1.0", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "@manypkg/get-packages": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@manypkg/get-packages/-/get-packages-1.1.3.tgz", - "integrity": "sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.5.5", - "@changesets/types": "^4.0.1", - "@manypkg/find-root": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "^11.0.0", - "read-yaml-file": "^1.1.0" - }, - "dependencies": { - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - } - } - }, - "@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==", - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@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==" - }, - "@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==", - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/eslint": { - "version": "8.21.3", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.3.tgz", - "integrity": "sha512-fa7GkppZVEByMWGbTtE5MbmXWJTVbrjjaS8K6uQj+XtuuUv1fsuPAxhygfqLmsb/Ufb3CV8deFCpiMfAgi00Sw==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" - }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=" - }, - "@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", - "dev": true - }, - "@types/node": { - "version": "12.20.43", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.43.tgz", - "integrity": "sha512-HCfJdaYqJX3BCzeihgZrD7b85Cu05OC/GVJ4kEYIflwUs4jbnUlLLWoq7hw1LBcdvUyehO+gr6P5JQ895/2ZfA==", - "dev": true - }, - "@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==" - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" - }, - "@typescript-eslint/eslint-plugin": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz", - "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==", - "requires": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/type-utils": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.4", - "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz", - "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==", - "requires": { - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz", - "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==", - "requires": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0" - } - }, - "@typescript-eslint/type-utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz", - "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==", - "requires": { - "@typescript-eslint/typescript-estree": "6.8.0", - "@typescript-eslint/utils": "6.8.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" - } - }, - "@typescript-eslint/types": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz", - "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==" - }, - "@typescript-eslint/typescript-estree": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz", - "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==", - "requires": { - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/visitor-keys": "6.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "dependencies": { - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/utils": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz", - "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==", - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.8.0", - "@typescript-eslint/types": "6.8.0", - "@typescript-eslint/typescript-estree": "6.8.0", - "semver": "^7.5.4" - }, - "dependencies": { - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz", - "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==", - "requires": { - "@typescript-eslint/types": "6.8.0", - "eslint-visitor-keys": "^3.4.1" - } - }, - "1d": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/1d/-/1d-0.1.1.tgz", - "integrity": "sha512-HEkhNPHQxhc5FwTKUnSsbY5v2IkNQNq/YVBMkgJ7bdYZVe7nfjVvfD3wCXGOyOo4RCsZXBl25gT5VollvUhh7w==", - "dev": true - }, - "acorn": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", - "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==" - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "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 - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" - }, - "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==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "are-docs-informative": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", - "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==" - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "requires": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - } - }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "requires": { - "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": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" - }, - "array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - } - }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - } - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" - }, - "better-path-resolve": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/better-path-resolve/-/better-path-resolve-1.0.0.tgz", - "integrity": "sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==", - "dev": true, - "requires": { - "is-windows": "^1.0.0" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "requires": { - "fill-range": "^7.0.1" - } - }, - "breakword": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/breakword/-/breakword-1.0.5.tgz", - "integrity": "sha512-ex5W9DoOQ/LUEU3PMdLs9ua/CYZl1678NUkKOdUSi8Aw5F1idieaiRURCBFJCwVcrD1J8Iy3vfWSloaMwO2qFg==", - "dev": true, - "requires": { - "wcwidth": "^1.0.1" - } - }, - "browserslist": { - "version": "4.22.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", - "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", - "requires": { - "caniuse-lite": "^1.0.30001565", - "electron-to-chromium": "^1.4.601", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, - "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==" - }, - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "requires": { - "semver": "^7.0.0" - }, - "dependencies": { - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" - }, - "camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true - }, - "camelcase-keys": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", - "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", - "dev": true, - "requires": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001571", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001571.tgz", - "integrity": "sha512-tYq/6MoXhdezDLFZuCO/TKboTzuQ/xR5cFdgXPfDtM7/kchBO3b4VWghE/OAi/DV7tTdhmLjZiZBZi1fA/GheQ==" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==" - }, - "clean-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", - "integrity": "sha1-jffHquUf02h06PjQW5GAvBGj/tc=", - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", - "dev": true - }, - "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==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "comment-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", - "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, - "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==" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "csv": { - "version": "5.5.3", - "resolved": "https://registry.npmjs.org/csv/-/csv-5.5.3.tgz", - "integrity": "sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==", - "dev": true, - "requires": { - "csv-generate": "^3.4.3", - "csv-parse": "^4.16.3", - "csv-stringify": "^5.6.5", - "stream-transform": "^2.1.3" - } - }, - "csv-generate": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/csv-generate/-/csv-generate-3.4.3.tgz", - "integrity": "sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==", - "dev": true - }, - "csv-parse": { - "version": "4.16.3", - "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-4.16.3.tgz", - "integrity": "sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==", - "dev": true - }, - "csv-stringify": { - "version": "5.6.5", - "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-5.6.5.tgz", - "integrity": "sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==", - "dev": true - }, - "dataloader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/dataloader/-/dataloader-1.4.0.tgz", - "integrity": "sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "decamelize-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", - "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", - "dev": true, - "requires": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" - }, - "dependencies": { - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - } - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" - }, - "defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha512-s82itHOnYrN0Ib8r+z7laQz3sdE+4FP3d9Q7VLO7U+KRT+CR0GsWuyHxzdAY82I7cXv0G/twrqomTJLOssO5HA==", - "dev": true, - "requires": { - "clone": "^1.0.2" - } - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "requires": { - "esutils": "^2.0.2" - } - }, - "dotenv": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz", - "integrity": "sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.616", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz", - "integrity": "sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg==" - }, - "eliminate": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/eliminate/-/eliminate-1.1.2.tgz", - "integrity": "sha512-FDdzDmgNL77+iMiWOY8fTlulC51wj8Ni7p/zbv7Sjv0wWJwjLBxOkJgNTA67hJEccKmCJHzuEwQdw1mMUIMpfQ==", - "dev": true - }, - "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==", - "dev": true - }, - "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, - "requires": { - "ansi-colors": "^4.1.1" - } - }, - "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==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "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.0", - "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.4.3", - "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-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - } - }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "requires": { - "color-name": "~1.1.4" - } - }, - "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==" - }, - "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==" - }, - "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==", - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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==", - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.23.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", - "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", - "requires": { - "type-fest": "^0.20.2" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "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==", - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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==", - "requires": { - "p-limit": "^3.0.2" - } - }, - "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==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" - } - } - }, - "eslint-config-prettier": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", - "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", - "dev": true, - "requires": {} - }, - "eslint-config-standard": { - "version": "17.1.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", - "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", - "dev": true, - "requires": {} - }, - "eslint-config-xo": { - "version": "0.43.1", - "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.43.1.tgz", - "integrity": "sha512-azv1L2PysRA0NkZOgbndUpN+581L7wPqkgJOgxxw3hxwXAbJgD6Hqb/SjHRiACifXt/AvxCzE/jIKFAlI7XjvQ==", - "dev": true, - "requires": { - "confusing-browser-globals": "1.0.11" - } - }, - "eslint-formatter-pretty": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-formatter-pretty/-/eslint-formatter-pretty-5.0.0.tgz", - "integrity": "sha512-Uick451FoL22/wXqyScX3inW8ZlD/GQO7eFXj3bqb6N/ZtuuF00/CwSNIKLbFCJPrX5V4EdQBSgJ/UVnmLRnug==", - "dev": true, - "requires": { - "@types/eslint": "^8.0.0", - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "eslint-rule-docs": "^1.1.235", - "log-symbols": "^4.0.0", - "plur": "^4.0.0", - "string-width": "^4.2.0", - "supports-hyperlinks": "^2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", - "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-es-x": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.1.0.tgz", - "integrity": "sha512-AhiaF31syh4CCQ+C5ccJA0VG6+kJK8+5mXKKE7Qs1xcPRg02CDPOj3mWlQxuWS/AYtg7kxrDNgW9YW3vc0Q+Mw==", - "requires": { - "@eslint-community/eslint-utils": "^4.1.2", - "@eslint-community/regexpp": "^4.5.0" - } - }, - "eslint-plugin-import": { - "version": "2.28.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", - "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", - "requires": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "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.8.0", - "has": "^1.0.3", - "is-core-module": "^2.13.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", - "semver": "^6.3.1", - "tsconfig-paths": "^3.14.2" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "requires": { - "esutils": "^2.0.2" - } - } - } - }, - "eslint-plugin-jsdoc": { - "version": "46.8.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.2.tgz", - "integrity": "sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==", - "requires": { - "@es-joy/jsdoccomment": "~0.40.1", - "are-docs-informative": "^0.0.2", - "comment-parser": "1.4.0", - "debug": "^4.3.4", - "escape-string-regexp": "^4.0.0", - "esquery": "^1.5.0", - "is-builtin-module": "^3.2.1", - "semver": "^7.5.4", - "spdx-expression-parse": "^3.0.1" - }, - "dependencies": { - "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==" - }, - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "eslint-plugin-n": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.2.0.tgz", - "integrity": "sha512-AQER2jEyQOt1LG6JkGJCCIFotzmlcCZFur2wdKrp1JX2cNotC7Ae0BcD/4lLv3lUAArM9uNS8z/fsvXTd0L71g==", - "requires": { - "@eslint-community/eslint-utils": "^4.4.0", - "builtins": "^5.0.1", - "eslint-plugin-es-x": "^7.1.0", - "get-tsconfig": "^4.7.0", - "ignore": "^5.2.4", - "is-core-module": "^2.12.1", - "minimatch": "^3.1.2", - "resolve": "^1.22.2", - "semver": "^7.5.3" - }, - "dependencies": { - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "eslint-plugin-promise": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", - "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", - "requires": {} - }, - "eslint-plugin-unicorn": { - "version": "48.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-48.0.1.tgz", - "integrity": "sha512-FW+4r20myG/DqFcCSzoumaddKBicIPeFnTrifon2mWIzlfyvzwyqZjqVP7m4Cqr/ZYisS2aiLghkUWaPg6vtCw==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.5", - "@eslint-community/eslint-utils": "^4.4.0", - "ci-info": "^3.8.0", - "clean-regexp": "^1.0.0", - "esquery": "^1.5.0", - "indent-string": "^4.0.0", - "is-builtin-module": "^3.2.1", - "jsesc": "^3.0.2", - "lodash": "^4.17.21", - "pluralize": "^8.0.0", - "read-pkg-up": "^7.0.1", - "regexp-tree": "^0.1.27", - "regjsparser": "^0.10.0", - "semver": "^7.5.4", - "strip-indent": "^3.0.0" - }, - "dependencies": { - "jsesc": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" - }, - "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==", - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, - "eslint-rule-docs": { - "version": "1.1.235", - "resolved": "https://registry.npmjs.org/eslint-rule-docs/-/eslint-rule-docs-1.1.235.tgz", - "integrity": "sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==", - "dev": true - }, - "eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "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==" - }, - "espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "requires": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" - }, - "extendable-error": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/extendable-error/-/extendable-error-0.1.7.tgz", - "integrity": "sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==", - "dev": true - }, - "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, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "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==" - }, - "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", - "requires": { - "@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": { - "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==" - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" - }, - "fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "requires": { - "reusify": "^1.0.4" - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "find-yarn-workspace-root2": { - "version": "1.2.16", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz", - "integrity": "sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==", - "dev": true, - "requires": { - "micromatch": "^4.0.2", - "pkg-dir": "^4.2.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==" - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" - }, - "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==" - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, - "get-tsconfig": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.0.tgz", - "integrity": "sha512-pmjiZ7xtB8URYm74PlGJozDNyhvsVLUcpBa8DZBG3bWHwaHa9bPiRpiSfovw+fjhwONSCWKRyk+JQHEGZmMrzw==", - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "requires": { - "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-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "requires": { - "is-glob": "^4.0.1" - } - }, - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" - }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "requires": { - "define-properties": "^1.1.3" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "requires": { - "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" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" - }, - "hard-rejection": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", - "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", - "dev": true - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "human-id": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/human-id/-/human-id-1.0.2.tgz", - "integrity": "sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==" - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "dependencies": { - "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==" - } - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "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==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - } - }, - "irregular-plurals": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.3.0.tgz", - "integrity": "sha512-MVBLKUTangM3EfRPFROhmWQQKRDsrgI83J8GS3jXy+OwYqiR2/aoWndYQ5416jLE3uaGgLH7ncme3X9y09gZ3g==", - "dev": true - }, - "is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "requires": { - "has-bigints": "^1.0.1" - } - }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "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==", - "requires": { - "builtin-modules": "^3.3.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-core-module": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", - "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" - }, - "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==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==" - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" - }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "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==" - }, - "is-plain-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", - "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", - "dev": true - }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-subdir": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-subdir/-/is-subdir-1.2.0.tgz", - "integrity": "sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==", - "dev": true, - "requires": { - "better-path-resolve": "1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "requires": { - "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-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" - }, - "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==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsdoc-type-pratt-parser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", - "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==" - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - }, - "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==" - }, - "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==" - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "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==", - "dev": true - }, - "kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "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==" - }, - "load-yaml-file": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/load-yaml-file/-/load-yaml-file-0.2.0.tgz", - "integrity": "sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.13.0", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "requires": { - "p-locate": "^4.1.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" - }, - "lodash.startcase": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", - "integrity": "sha1-lDbjTtJgk+1/+uGTYUQ1CRXZrdg=", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "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 - }, - "meow": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", - "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", - "dev": true, - "requires": { - "@types/minimist": "^1.2.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" - }, - "dependencies": { - "type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", - "dev": true - } - } - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" - }, - "micromatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", - "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", - "requires": { - "braces": "^3.0.1", - "picomatch": "^2.2.3" - } - }, - "min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "minimist-options": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", - "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", - "dev": true, - "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" - } - }, - "mixme": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mixme/-/mixme-0.5.4.tgz", - "integrity": "sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw==", - "dev": true - }, - "mkdirplz": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/mkdirplz/-/mkdirplz-1.0.2.tgz", - "integrity": "sha512-TjEXdMRdNb2qacgAC0SI/GGaQ8/MzksQYaZeiAx6Jk0Z9AS5wNVIIxDCP3oHIKnkgzCAkaD9pYOyidypI+cdyw==", - "dev": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" - }, - "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, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==" - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" - } - } - }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" - }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", - "get-intrinsic": "^1.2.1" - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "requires": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "outdent": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/outdent/-/outdent-0.5.0.tgz", - "integrity": "sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==", - "dev": true - }, - "p-filter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-2.1.0.tgz", - "integrity": "sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==", - "dev": true, - "requires": { - "p-map": "^2.0.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true - }, - "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==" - }, - "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==", - "requires": { - "callsites": "^3.0.0" - } - }, - "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==", - "requires": { - "@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" - } - }, - "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==" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" - }, - "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==" - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", - "dev": true, - "requires": { - "irregular-plurals": "^3.2.0" - } - }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" - }, - "powerwalker": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/powerwalker/-/powerwalker-0.1.2.tgz", - "integrity": "sha512-KlS9PvqiIW3WBRKZ5nlhNW87AXlmhnALq3fWhW62zHKPKas6F6HO4VCKIqGOWXK1Fv0JievSR0CR+Kbx3jBeWw==", - "dev": true, - "requires": { - "1d": "^0.1.1" - } - }, - "preferred-pm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/preferred-pm/-/preferred-pm-3.0.3.tgz", - "integrity": "sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==", - "dev": true, - "requires": { - "find-up": "^5.0.0", - "find-yarn-workspace-root2": "1.2.16", - "path-exists": "^4.0.0", - "which-pm": "2.0.0" - }, - "dependencies": { - "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, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "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, - "requires": { - "p-locate": "^5.0.0" - } - }, - "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, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "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, - "requires": { - "p-limit": "^3.0.2" - } - } - } - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" - }, - "prettier": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", - "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", - "dev": true - }, - "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, - "requires": { - "kleur": "^3.0.3", - "sisteransi": "^1.0.5" - }, - "dependencies": { - "kleur": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", - "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", - "dev": true - } - } - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" - }, - "quick-lru": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", - "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", - "dev": true - }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "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==" - } - } - }, - "read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "requires": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "dependencies": { - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" - } - } - }, - "read-yaml-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-yaml-file/-/read-yaml-file-1.1.0.tgz", - "integrity": "sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.5", - "js-yaml": "^3.6.1", - "pify": "^4.0.1", - "strip-bom": "^3.0.0" - } - }, - "redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "requires": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - } - }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "regexp-tree": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", - "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==" - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - }, - "regjsparser": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", - "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" - } - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "resolve": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", - "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", - "requires": { - "is-core-module": "^2.12.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "resolve-pkg-maps": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", - "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==" - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "requires": { - "glob": "^7.1.3" - } - }, - "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==", - "requires": { - "queue-microtask": "^1.2.2" - } - }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" - }, - "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 - }, - "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==", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "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 - }, - "sisteransi": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", - "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", - "dev": true - }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" - }, - "smartwrap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/smartwrap/-/smartwrap-2.0.2.tgz", - "integrity": "sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==", - "dev": true, - "requires": { - "array.prototype.flat": "^1.2.3", - "breakword": "^1.0.5", - "grapheme-splitter": "^1.0.4", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1", - "yargs": "^15.1.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - }, - "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, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "y18n": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", - "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", - "dev": true - }, - "yargs": { - "version": "15.4.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", - "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", - "dev": true, - "requires": { - "cliui": "^6.0.0", - "decamelize": "^1.2.0", - "find-up": "^4.1.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^4.2.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^18.1.2" - } - } - } - }, - "spawndamnit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/spawndamnit/-/spawndamnit-2.0.0.tgz", - "integrity": "sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==", - "dev": true, - "requires": { - "cross-spawn": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "dependencies": { - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - } - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==" - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "stream-transform": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/stream-transform/-/stream-transform-2.1.3.tgz", - "integrity": "sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==", - "dev": true, - "requires": { - "mixme": "^0.5.1" - } - }, - "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, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - } - }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" - }, - "strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "requires": { - "min-indent": "^1.0.0" - } - }, - "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==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "supports-hyperlinks": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz", - "integrity": "sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==", - "dev": true, - "requires": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "dependencies": { - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "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==" - }, - "term-size": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.1.tgz", - "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", - "dev": true - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "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==" - }, - "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==", - "requires": { - "is-number": "^7.0.0" - } - }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", - "dev": true - }, - "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 - }, - "ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", - "requires": {} - }, - "tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "requires": { - "minimist": "^1.2.0" - } - } - } - }, - "tty-table": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/tty-table/-/tty-table-4.1.6.tgz", - "integrity": "sha512-kRj5CBzOrakV4VRRY5kUWbNYvo/FpOsz65DzI5op9P+cHov3+IqPbo1JE1ZnQGkHdZgNFDsrEjrfqqy/Ply9fw==", - "dev": true, - "requires": { - "chalk": "^4.1.2", - "csv": "^5.5.0", - "kleur": "^4.1.4", - "smartwrap": "^2.0.2", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1", - "yargs": "^17.1.1" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==" - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - } - }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, - "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", - "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "wcwidth": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", - "dev": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "requires": { - "isexe": "^2.0.0" - } - }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "requires": { - "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-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "which-pm": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-pm/-/which-pm-2.0.0.tgz", - "integrity": "sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==", - "dev": true, - "requires": { - "load-yaml-file": "^0.2.0", - "path-exists": "^4.0.0" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "requires": { - "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" - } - }, - "wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "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==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "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==", - "dev": true - } - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, - "yargs": { - "version": "17.5.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.1.tgz", - "integrity": "sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==", - "dev": true, - "requires": { - "cliui": "^7.0.2", - "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.0.0" - }, - "dependencies": { - "yargs-parser": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", - "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", - "dev": true - } - } - }, - "yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "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==" - } - } + "name": "@cloudfour/eslint-config", + "version": "24.0.0-alpha.13", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@cloudfour/eslint-config", + "version": "24.0.0-alpha.13", + "license": "MIT", + "dependencies": { + "eslint-config-prettier": "9.1.0", + "eslint-config-xo": "0.46.0", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-jsdoc": "50.5.0", + "eslint-plugin-n": "17.13.1", + "eslint-plugin-promise": "7.1.0", + "eslint-plugin-unicorn": "56.0.0", + "globals": "15.12.0", + "typescript-eslint": "8.14.0" + }, + "devDependencies": { + "eslint": "9.14.0", + "prettier": "3.3.3" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "eslint": ">= 9" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.49.0", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz", + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==", + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.6.0", + "jsdoc-type-pratt-parser": "~4.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "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==", + "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/core": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "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==", + "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/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.2.tgz", + "integrity": "sha512-CXtq5nR4Su+2I47WPOlWud98Y5Lv8Kyxp2ukhgFx/eW6Blm18VXJO5WuQylPugRo8nbluoi6GvvxBLqHcvqUUw==", + "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==", + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==" + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.10.1.tgz", + "integrity": "sha512-U+4yzNXElTf9q0kEfnloI9XbOyD4cnEQCxjUI94q0+W++0GAEQvJ/slwEj9lwjDHfGADRSr+Tco/z0XJvmDfCQ==", + "dependencies": { + "@typescript-eslint/utils": "^8.12.2", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=8.40.0" + } + }, + "node_modules/@stylistic/eslint-plugin/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==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/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==" + }, + "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==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.14.0.tgz", + "integrity": "sha512-tqp8H7UWFaZj0yNO6bycd5YjMwxa6wIHOLZvWPkidwbgLCsBMetQoGj7DPuAlWa2yGO3H48xmPwjhsSPPCGU5w==", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/type-utils": "8.14.0", + "@typescript-eslint/utils": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.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.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.14.0.tgz", + "integrity": "sha512-2p82Yn9juUJq0XynBXtFCyrBDb6/dJombnz6vbo6mgQEtWHfvHbQuEa9kAOVIt1c9YFwi7H6WxtPj1kg+80+RA==", + "dependencies": { + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/typescript-estree": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.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.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.14.0.tgz", + "integrity": "sha512-aBbBrnW9ARIDn92Zbo7rguLnqQ/pOrUguVpbUwzOhkFg2npFDwTgPGqFqE0H5feXcOoJOfX3SxlJaKEVtq54dw==", + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.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.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.14.0.tgz", + "integrity": "sha512-Xcz9qOtZuGusVOH5Uk07NGs39wrKkf3AxlkK79RBK6aJC1l03CobXjJbwBPSidetAOV+5rEVuiT1VSBUOAsanQ==", + "dependencies": { + "@typescript-eslint/typescript-estree": "8.14.0", + "@typescript-eslint/utils": "8.14.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.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.14.0.tgz", + "integrity": "sha512-yjeB9fnO/opvLJFAsPNYlKPnEM8+z4og09Pk504dkqonT02AyL5Z9SSqlE0XqezS93v6CXn49VHvB2G7XSsl0g==", + "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.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.14.0.tgz", + "integrity": "sha512-OPXPLYKGZi9XS/49rdaCbR5j/S14HazviBlUQFvSKz3npr3NikF+mrgK7CFVur6XEt95DZp/cmke9d5i3vtVnQ==", + "dependencies": { + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/visitor-keys": "8.14.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/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "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==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.14.0.tgz", + "integrity": "sha512-OGqj6uB8THhrHj0Fk27DcHPojW7zKwKkPmHXHvQ58pLYp4hy8CSUdTKykKeh+5vFqTTVmjz0zCOOPKRovdsgHA==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "8.14.0", + "@typescript-eslint/types": "8.14.0", + "@typescript-eslint/typescript-estree": "8.14.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.14.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.14.0.tgz", + "integrity": "sha512-vG0XZo8AdTH9OE6VFRwAZldNc7qtJ/6NLGWak+BtENuEUXGZgFpihILPiBvKXvJ2nFu27XNGC6rKiwuaoMbYzQ==", + "dependencies": { + "@typescript-eslint/types": "8.14.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/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "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" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "engines": { + "node": ">=14" + } + }, + "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==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz", + "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.2.1", + "get-intrinsic": "^1.2.3", + "is-array-buffer": "^3.0.4", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "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==", + "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==", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", + "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.30001669", + "electron-to-chromium": "^1.5.41", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "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==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", + "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/ci-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz", + "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "node_modules/core-js-compat": { + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", + "dependencies": { + "browserslist": "^4.24.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "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==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "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==", + "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-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "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/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.56", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.56.tgz", + "integrity": "sha512-7lXb9dAvimCFdvUMTyucD4mnIndt/xhRKFAlky0CyFogdnNmdPQNoHI23msF/2V4mpTxMzgMdjK4+YRlFlRQZw==" + }, + "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==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "arraybuffer.prototype.slice": "^1.0.3", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.0.3", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.4", + "get-symbol-description": "^1.0.2", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", + "has-symbols": "^1.0.3", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.3", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.13", + "is-weakref": "^1.0.2", + "object-inspect": "^1.13.1", + "object-keys": "^1.1.1", + "object.assign": "^4.1.5", + "regexp.prototype.flags": "^1.5.2", + "safe-array-concat": "^1.1.2", + "safe-regex-test": "^1.0.3", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.2", + "typed-array-byte-length": "^1.0.1", + "typed-array-byte-offset": "^1.0.2", + "typed-array-length": "^1.0.6", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==" + }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", + "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==", + "dependencies": { + "get-intrinsic": "^1.2.4", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "dependencies": { + "hasown": "^2.0.0" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "engines": { + "node": ">=6" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", + "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "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-compat-utils": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz", + "integrity": "sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "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==", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-xo": { + "version": "0.46.0", + "resolved": "https://registry.npmjs.org/eslint-config-xo/-/eslint-config-xo-0.46.0.tgz", + "integrity": "sha512-mjQUhdTCLQwHUFKf1hhSx1FFhm2jllr4uG2KjaW7gZHGAbjKoSypvo1eQvFk17lHx3bztYjZDDXQmkAZyaSlAg==", + "dependencies": { + "@stylistic/eslint-plugin": "^2.6.1", + "confusing-browser-globals": "1.0.11", + "globals": "^15.3.0" + }, + "engines": { + "node": ">=18.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + }, + "peerDependencies": { + "eslint": ">=9.8.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", + "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.8.0.tgz", + "integrity": "sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==", + "funding": [ + "https://github.com/sponsors/ota-meshi", + "https://opencollective.com/eslint" + ], + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.11.0", + "eslint-compat-utils": "^0.5.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", + "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "50.5.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.5.0.tgz", + "integrity": "sha512-xTkshfZrUbiSHXBwZ/9d5ulZ2OcHXxSvm/NPo494H/hadLRJwOq5PMV0EUpMqsb9V+kQo+9BAgi6Z7aJtdBp2A==", + "dependencies": { + "@es-joy/jsdoccomment": "~0.49.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.6", + "escape-string-regexp": "^4.0.0", + "espree": "^10.1.0", + "esquery": "^1.6.0", + "parse-imports": "^2.1.1", + "semver": "^7.6.3", + "spdx-expression-parse": "^4.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-n": { + "version": "17.13.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.13.1.tgz", + "integrity": "sha512-97qzhk1z3DdSJNCqT45EslwCu5+LB9GDadSyBItgKUfGsXAmN/aa7LRQ0ZxHffUxUzvgbTPJL27/pE9ZQWHy7A==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.1", + "enhanced-resolve": "^5.17.1", + "eslint-plugin-es-x": "^7.8.0", + "get-tsconfig": "^4.8.1", + "globals": "^15.11.0", + "ignore": "^5.3.2", + "minimatch": "^9.0.5", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": ">=8.23.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-n/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" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-7.1.0.tgz", + "integrity": "sha512-8trNmPxdAy3W620WKDpaS65NlM5yAumod6XeC4LOb+jxlkG4IVcp68c6dXY2ev+uT4U1PtG57YDV6EGAXN0GbQ==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "56.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.0.tgz", + "integrity": "sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "@eslint-community/eslint-utils": "^4.4.0", + "ci-info": "^4.0.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.38.1", + "esquery": "^1.6.0", + "globals": "^15.9.0", + "indent-string": "^4.0.0", + "is-builtin-module": "^3.2.1", + "jsesc": "^3.0.2", + "pluralize": "^8.0.0", + "read-pkg-up": "^7.0.1", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.10.0", + "semver": "^7.6.3", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=18.18" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=8.56.0" + } + }, + "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==", + "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-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==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "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/eslint/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/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==" + }, + "node_modules/eslint/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==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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==", + "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/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==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/eslint/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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "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/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==", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "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==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "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==" + }, + "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==", + "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==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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==", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "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/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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-symbol-description": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz", + "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==", + "dependencies": { + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "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==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "15.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", + "integrity": "sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" + }, + "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/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.0", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "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-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", + "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", + "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "dependencies": { + "which-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "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==" + }, + "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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.1.0.tgz", + "integrity": "sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "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==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/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/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" + }, + "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==" + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "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" + } + }, + "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==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/object-inspect": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", + "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==", + "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==", + "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/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "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==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-imports": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/parse-imports/-/parse-imports-2.2.1.tgz", + "integrity": "sha512-OL/zLggRp8mFhKL0rNORUTR4yBYujK/uU+xZL+/0Rgm2QE4nLO9v8PzEweSJEbMGKmDRjJE4R3IMJlL2di4JeQ==", + "dependencies": { + "es-module-lexer": "^1.5.3", + "slashes": "^3.0.12" + }, + "engines": { + "node": ">= 18" + } + }, + "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==", + "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/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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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==" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "engines": { + "node": ">=6" + } + }, + "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/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "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" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "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/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regjsparser": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.10.0.tgz", + "integrity": "sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==", + "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/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-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.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/safe-array-concat": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz", + "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", + "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==", + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-regex": "^1.1.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "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/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "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==", + "engines": { + "node": ">=8" + } + }, + "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==", + "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/slashes": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/slashes/-/slashes-3.0.12.tgz", + "integrity": "sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==" + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", + "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz", + "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.20", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz", + "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==" + }, + "node_modules/string.prototype.trim": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "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==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz", + "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz", + "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", + "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-proto": "^1.0.3", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.14.0.tgz", + "integrity": "sha512-K8fBJHxVL3kxMmwByvz8hNdBJ8a0YqKzKDX6jRlrjMuNXyd5T2V02HIq37+OiWXvUUOXgOOGiSSOh26Mh8pC3w==", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.14.0", + "@typescript-eslint/parser": "8.14.0", + "@typescript-eslint/utils": "8.14.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/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "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.2.0", + "picocolors": "^1.1.0" + }, + "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==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } } diff --git a/package.json b/package.json index 2136adb0..41d26b11 100644 --- a/package.json +++ b/package.json @@ -1,77 +1,51 @@ { - "name": "@cloudfour/eslint-plugin", - "version": "23.0.0", - "description": "Cloud Four's shareable ESLint configuration", - "author": "Cloud Four (http://cloudfour.com)", - "homepage": "https://github.com/cloudfour/eslint-config", - "bugs": "https://github.com/cloudfour/eslint-config/issues", - "license": "MIT", - "main": "./index.js", - "repository": { - "type": "git", - "url": "git+https://github.com/cloudfour/eslint-config.git" - }, - "contributors": [ - "Erik Jung ", - "Caleb Eby " - ], - "files": [ - "dist/config.js", - "src/rules.js", - "index.js", - "src/rules/**/*.js", - "!src/rules/**/*.test.js" - ], - "engines": { - "node": ">=18.0.0" - }, - "keywords": [ - "eslint", - "eslintconfig" - ], - "dependencies": { - "@babel/core": "^7.23.6", - "@typescript-eslint/eslint-plugin": "^6.8.0", - "@typescript-eslint/parser": "^6.8.0", - "eslint-plugin-import": "^2.28.1", - "eslint-plugin-jsdoc": "^46.8.2", - "eslint-plugin-n": "^16.2.0", - "eslint-plugin-promise": "^6.1.1", - "eslint-plugin-unicorn": "^48.0.1" - }, - "peerDependencies": { - "eslint": "^8.0.0" - }, - "devDependencies": { - "@changesets/changelog-github": "0.5.0", - "@changesets/cli": "2.27.1", - "@changesets/write": "0.3.0", - "eliminate": "1.1.2", - "eslint": "8.51.0", - "eslint-config-prettier": "9.0.0", - "eslint-config-standard": "17.1.0", - "eslint-config-xo": "0.43.1", - "eslint-formatter-pretty": "5.0.0", - "kleur": "4.1.5", - "mkdirplz": "1.0.2", - "powerwalker": "0.1.2", - "prettier": "3.0.3", - "prompts": "2.4.2", - "typescript": "5.3.3" - }, - "scripts": { - "check-lint": "eslint --format=pretty --ext=.js,.mjs,.cjs . && prettier --check .", - "load-fixture-repo": "node fixtures/load-repo", - "lint": "eslint --format=pretty --ext=.js,.mjs,.cjs --fix . && prettier --write .", - "build": "node build.mjs", - "changeset": "changeset", - "version": "changeset version && prettier --write .", - "release": "npm run build && changeset publish" - }, - "prettier": { - "singleQuote": true - }, - "eslintConfig": { - "extends": "plugin:@cloudfour/recommended" - } + "name": "@cloudfour/eslint-config", + "version": "24.0.0-alpha.13", + "description": "Cloud Four's shareable ESLint configuration", + "author": "Cloud Four (http://cloudfour.com)", + "homepage": "https://github.com/cloudfour/eslint-config", + "bugs": "https://github.com/cloudfour/eslint-config/issues", + "license": "MIT", + "main": "./eslint.config.js", + "type": "module", + "repository": { + "type": "git", + "url": "git+https://github.com/cloudfour/eslint-config.git" + }, + "engines": { + "node": ">=18.0.0" + }, + "keywords": [ + "eslint", + "eslintconfig" + ], + "peerDependencies": { + "eslint": ">= 9" + }, + "devDependencies": { + "eslint": "9.14.0", + "prettier": "3.3.3" + }, + "scripts": { + "lint": "npm run lint:js && npm run lint:prettier", + "lint:check": "npm run lint:js:check && npm run lint:prettier:check", + "lint:js": "eslint --fix .", + "lint:js:check": "eslint .", + "lint:prettier": "prettier --write .", + "lint:prettier:check": "prettier --check ." + }, + "prettier": { + "singleQuote": true + }, + "dependencies": { + "eslint-config-prettier": "9.1.0", + "eslint-config-xo": "0.46.0", + "eslint-plugin-import": "2.31.0", + "eslint-plugin-jsdoc": "50.5.0", + "eslint-plugin-n": "17.13.1", + "eslint-plugin-promise": "7.1.0", + "eslint-plugin-unicorn": "56.0.0", + "globals": "15.12.0", + "typescript-eslint": "8.14.0" + } } diff --git a/src/config.js b/src/config.js deleted file mode 100644 index 16b97c4b..00000000 --- a/src/config.js +++ /dev/null @@ -1,319 +0,0 @@ -// ESLint configs -const typescript = require('@typescript-eslint/eslint-plugin'); -const prettier = require('eslint-config-prettier'); -const standard = require('eslint-config-standard'); -const xo = require('eslint-config-xo'); -// ESLint plugins -const jsdoc = require('eslint-plugin-jsdoc').configs.recommended; -const node = require('eslint-plugin-n').configs.recommended; -const unicorn = require('eslint-plugin-unicorn').configs.recommended; - -/** @typedef {0 | 1 | 2 | 'off' | 'warn' | 'error'} ESLintRuleVal */ -/** @typedef {ESLintRuleVal | [ESLintRuleVal, ...unknown[]]} ESLintRuleConfig */ - -/** - * Adds the `@cloudfour/` prefix in front of each rule - * - * @param {{[key: string]: ESLintRuleConfig}} rules the rules to process - */ -const prefix = (rules) => - Object.fromEntries( - Object.entries(rules).map(([key, val]) => { - // If the key already starts with an @, remove it (for example typescript-eslint) - if (key.includes('/') && !key.startsWith('@cloudfour/')) - key = `@cloudfour/${key.replace(/^@/, '')}`; - return [key, val]; - }), - ); - -/** - * Removes rules that are set to "off" - * - * @param {Record} rules the rules to process - */ -const removeUnused = (rules) => - Object.fromEntries( - Object.entries(rules).filter( - ([, val]) => - !(val === 'off' || val === 0 || val[0] === 'off' || val[0] === 0), - ), - ); - -/** - * Changes all rules that are set to "warn" to "error" - * - * @param {{[key: string]: ESLintRuleConfig}} rules the rules to process - */ -const changeWarnToError = (rules) => - Object.fromEntries( - Object.entries(rules).map(([key, val]) => { - if (val === 'warn' || val === 1) return [key, 'error']; - if (Array.isArray(val) && (val[0] === 'warn' || val[0] === 1)) - return [key, ['error', ...val.slice(1)]]; - return [key, val]; - }), - ); - -/** @type {import('eslint').Linter.BaseConfig} */ -const recommendedConfig = { - parserOptions: { - ecmaVersion: 2022, - sourceType: 'module', - ecmaFeatures: { jsx: true }, - }, - env: { - node: true, - es6: true, - }, - settings: { - jsdoc: { - mode: 'typescript', - tagNamePreference: { - TODO: 'todo', - }, - preferredTypes: { - '*': 'any', - Function: '() => void', - function: '() => void', - }, - }, - }, - globals: { - document: false, - navigator: false, - window: false, - }, - plugins: ['@cloudfour'], - rules: removeUnused( - prefix({ - // Plugins' recommended configs - ...node.rules, - ...unicorn.rules, - ...changeWarnToError(jsdoc.rules), - - // "standards" - ...xo.rules, - ...standard.rules, - - ...prettier.rules, // Undoes stylistic rules - - // Overrides - 'no-unused-expressions': [ - 'error', - { - allowShortCircuit: false, - allowTernary: false, - allowTaggedTemplates: false, - }, - ], - '@cloudfour/prefer-early-return': 'error', - 'no-return-assign': ['error'], - 'func-names': 'off', - 'prefer-const': [ - 'error', - // If there is a destructuring assignment - // and some of the properties should be const - // but others shouldn't be, let it use let - { destructuring: 'all' }, - ], - 'no-var': 'error', - 'object-shorthand': 'error', - 'prefer-object-spread': 'error', - 'prefer-spread': 'error', - 'prefer-destructuring': ['error', { array: false }], - 'prefer-rest-params': 'error', - // We decided that since devs can use blank lines to create logical groupings in code, - // it is best not to have ESLint enforce adding newlines - 'padding-line-between-statements': 'off', - 'prefer-template': 'error', - 'no-param-reassign': 'off', // We don't use `arguments`, and assigning to parameters can be useful - 'no-promise-executor-return': 'off', // Allow implicit return in promise executor - 'capitalized-comments': [ - 'error', - 'always', - { - ignorePattern: - 'pragma|ignore|prettier-ignore|webpack\\w+:|c8|return|const|let|var|await|function|console', - ignoreInlineComments: true, - ignoreConsecutiveComments: true, - }, - ], - - 'n/no-unsupported-features/es-syntax': 'off', // Does not account for transpilation - 'n/no-unpublished-require': 'off', // Does not account for "build" scripts - 'n/shebang': 'off', // Tons of false positives - 'n/file-extension-in-import': ['error', 'always'], // Don't allow extension-less relative imports (e.g. use ./foo.js instead of ./foo) - // Used for sorting/grouping import statements - 'import/order': [ - 'error', - { - groups: [ - 'builtin', - 'external', - 'internal', - 'parent', - 'sibling', - 'index', - ], - 'newlines-between': 'always', - alphabetize: { order: 'asc', caseInsensitive: true }, - }, - ], - // Avoid multiple import statements in the same file for the same module - // prefer-inline means it is preferred to use inline `type` imports combined with non-types - // instead of separate imports for types and non-types - // e.g. import { Foo, type Bar } from 'something' is preferred over having separate import statements - 'import/no-duplicates': ['error', { 'prefer-inline': true }], - // Used for sorting members within an import statement alphabetically - 'sort-imports': ['error', { ignoreDeclarationSort: true }], - - 'unicorn/import-style': 'off', // It doesn't seem useful to force people to use named, default, or namespace imports - 'unicorn/prevent-abbreviations': 'off', // Causes more issues than it's worth - // Null is ok, even though Sindre Sorhus doesn't like it - // It is ok to avoid using null and use undefined instead - // but enforcing it in all code via a lint rule is too annoying - 'unicorn/no-null': 'off', - // This rule is meant to avoid the edge case of breaking changes occuring - // due to the `index` parameter being passed unexpectedly into the callback function, - // causing unexpected behavior if the callback expects something that is not the index - // But this is an edge case that can be avoided through careful manual review - // and sometimes through TS - 'unicorn/no-array-callback-reference': 'off', - // https://github.com/sindresorhus/eslint-plugin-unicorn/pull/1750 - // This rule got removed from the recommended preset, but that hasn't been published yet. - 'unicorn/prefer-json-parse-buffer': 'off', - // This rule changes arrays to sets if you call .includes on it - // Converting from array to set has a cost itself, just like .includes has a cost - // We decided to leave the decision of using arrays vs sets to human reviewers - 'unicorn/prefer-set-has': 'off', - // Reduce is often useful. Don't need a lint rule to tell us not to use it - 'unicorn/no-array-reduce': 'off', - 'unicorn/prefer-module': 'off', // A lot of projects still use commonjs by default for non-browser code. We can revisit this rule once commonjs is basically never used. - 'unicorn/prefer-switch': 'off', // Switch statements are often longer than if/else chains, and they are still read aloud as "if ... is ... then" - 'unicorn/prefer-number-properties': [ - 'error', - // There isn't a good reason to force use of Number.POSITIVE_INFINITY instead of Infinity - { checkInfinity: false }, - ], - // String#replaceAll doesn't quite have enough browser/node support to enable this rule by default. - // TODO [2024-01-01] Reconsider browser/node support for those two methods - 'unicorn/prefer-string-replace-all': 'off', - // String#at and Array#at don't quite have enough browser/node support to enable this rule by default. - // TODO [2024-01-01] Reconsider browser/node support for those two methods - 'unicorn/prefer-at': 'off', - // This rule suggests incorrect code with the destructured object is modified - // That is a fairly common case, and it is too annoying to always disable the rule on each line - 'unicorn/consistent-destructuring': 'off', - - // Allow _only_ TODO comments with expirations/conditions - 'no-warning-comments': 'off', - 'unicorn/expiring-todo-comments': [ - 'error', - { allowWarningComments: false }, - ], - - // Disabling jsdoc rules that check the types themselves - // If you want to have type checking on a project, use typescript instead - 'jsdoc/newline-after-description': 'off', - 'jsdoc/no-undefined-types': 'off', - 'jsdoc/valid-types': 'off', - 'jsdoc/require-returns': 'off', - 'jsdoc/require-param-description': 'off', - 'jsdoc/require-property-description': 'off', - 'jsdoc/require-returns-description': 'off', - 'jsdoc/require-jsdoc': 'off', - 'jsdoc/require-returns-check': 'off', // Does not handle @returns with void or undefined - 'jsdoc/tag-lines': ['error', 'any', { startLines: 1 }], - }), - ), - overrides: [ - { - files: ['*.ts', '*.tsx', '.mts', '.cts'], - parser: require.resolve('@typescript-eslint/parser'), // Force it to resolve from this directory - parserOptions: { - project: './tsconfig.json', - }, - rules: prefix({ - ...typescript.configs['eslint-recommended'].overrides[0].rules, - ...typescript.configs.recommended.rules, - ...typescript.configs['recommended-type-checked'].rules, - - // TS handles checking these - 'n/no-missing-import': 'off', - 'n/no-missing-require': 'off', - - 'no-import-assign': 'off', // TS handles this - - // With TS, the only reason to have a @param tag - // is if a particular parameter needs a description, - // which is not true for all parameters - 'jsdoc/require-param': 'off', - 'jsdoc/require-param-type': 'off', // Types should be in type annotations instead - 'jsdoc/require-param-description': 'error', // The only reason to have an @param in TS is to add a description - 'jsdoc/require-returns-type': 'off', // Return types should be in type annotations instead - 'jsdoc/require-returns-description': 'error', // The only reason to have an @returns in TS is to add a description - // Auto-fixes type imports to use the `import type` syntax - // This syntax is preferred because it makes the TS -> JS transformation easier - // because it doesn't require checking which imports are only referenced as types - '@typescript-eslint/consistent-type-imports': [ - 'error', - // We have set it to allow import('...') for types because that is the only kind of import that is allowed in global type augmentations - { disallowTypeAnnotations: false }, - ], - // Don't try to use the result of expression whose type is `void` - '@typescript-eslint/no-confusing-void-expression': [ - 'error', - { ignoreArrowShorthand: true }, - ], - // Don't use the void operator an an expression whose type is already `void` - '@typescript-eslint/no-meaningless-void-operator': 'error', - '@typescript-eslint/no-unnecessary-type-constraint': 'error', - '@typescript-eslint/array-type': ['error', { default: 'array' }], // Require consistency: Use foo[] instead of Array - '@typescript-eslint/ban-ts-comment': 'error', - '@typescript-eslint/explicit-module-boundary-types': 'off', // Type inference is useful even for public functions - '@typescript-eslint/no-explicit-any': 'off', // Any is an escape hatch, it should be allowed - '@typescript-eslint/no-floating-promises': 'off', // Don't force every promise rejection to be caught. Humans can decide when it makes sense to handle errors and when it doesn't - '@typescript-eslint/no-non-null-assertion': 'error', // Default is warn - '@typescript-eslint/no-unsafe-assignment': 'off', // Any is an escape hatch, let it be an escape hatch - '@typescript-eslint/no-unsafe-call': 'off', // Any is an escape hatch, let it be an escape hatch - '@typescript-eslint/no-unsafe-member-access': 'off', // Any is an escape hatch, let it be an escape hatch - '@typescript-eslint/no-unsafe-return': 'off', // Any is an escape hatch, let it be an escape hatch - '@typescript-eslint/no-unsafe-argument': 'off', // Any is an escape hatch, let it be an escape hatch - '@typescript-eslint/restrict-template-expressions': 'off', // Allow using any-typed-values in template expressions - '@typescript-eslint/no-unnecessary-condition': 'error', // This catches a lot of dead code that TS itself doesn't flag - '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error', - '@typescript-eslint/prefer-optional-chain': 'error', // More readable syntax - 'no-unused-vars': 'off', // TS checks this via noUnusedLocals / noUnusedParameters - '@typescript-eslint/no-unused-vars': 'off', // TS checks this via noUnusedLocals / noUnusedParameters - '@typescript-eslint/no-empty-function': 'off', // Non-TS version of rule is not used either - '@typescript-eslint/unbound-method': 'off', // It is pretty common for this already being handled outside of what TS/ESLint can be aware of - '@typescript-eslint/no-import-type-side-effects': 'error', - 'no-unused-expressions': 'off', - '@typescript-eslint/no-unused-expressions': ['error'], // This rule is like the built in ESLint rule but it supports optional chaining - // Replacing the built-in rule with the version that works well with TS - 'no-use-before-define': 'off', - '@typescript-eslint/no-use-before-define': [ - 'error', - { - functions: false, - classes: false, - variables: false, - ignoreTypeReferences: true, - }, - ], - }), - }, - ], -}; - -/** @type {import('eslint').Linter.BaseConfig} */ -const disableTypeCheckedConfig = { - rules: prefix({ - ...typescript.configs['disable-type-checked'].rules, - }), -}; - -module.exports.configs = { - recommended: recommendedConfig, - 'disable-type-checked': disableTypeCheckedConfig, -}; diff --git a/src/eslint-standard-config.js b/src/eslint-standard-config.js new file mode 100644 index 00000000..63924fba --- /dev/null +++ b/src/eslint-standard-config.js @@ -0,0 +1,310 @@ +/** + * This is a local copy of the flat-config version of eslint-standard-config, + * which has not been released due to a governance issue. It can be removed in + * favor of the real package if/when eslint-standard-config is updated. + * + * @see https://github.com/standard/eslint-config-standard/blob/master/src/index.ts + * @see https://github.com/standard/eslint-config-standard/issues/411 + */ + +export default { + rules: { + 'no-var': 'warn', + 'object-shorthand': ['warn', 'properties'], + + 'accessor-pairs': [ + 'error', + { setWithoutGet: true, enforceForClassMembers: true }, + ], + 'array-bracket-spacing': ['error', 'never'], + 'array-callback-return': [ + 'error', + { + allowImplicit: false, + checkForEach: false, + }, + ], + 'arrow-spacing': ['error', { before: true, after: true }], + 'block-spacing': ['error', 'always'], + 'brace-style': ['error', '1tbs', { allowSingleLine: true }], + camelcase: [ + 'error', + { + allow: ['^UNSAFE_'], + properties: 'never', + ignoreGlobals: true, + }, + ], + 'comma-dangle': [ + 'error', + { + arrays: 'never', + objects: 'never', + imports: 'never', + exports: 'never', + functions: 'never', + }, + ], + 'comma-spacing': ['error', { before: false, after: true }], + 'comma-style': ['error', 'last'], + 'computed-property-spacing': [ + 'error', + 'never', + { enforceForClassMembers: true }, + ], + 'constructor-super': 'error', + curly: ['error', 'multi-line'], + 'default-case-last': 'error', + 'dot-location': ['error', 'property'], + 'dot-notation': ['error', { allowKeywords: true }], + 'eol-last': 'error', + eqeqeq: ['error', 'always', { null: 'ignore' }], + 'func-call-spacing': ['error', 'never'], + 'generator-star-spacing': ['error', { before: true, after: true }], + indent: [ + 'error', + 2, + { + SwitchCase: 1, + VariableDeclarator: 1, + outerIIFEBody: 1, + MemberExpression: 1, + FunctionDeclaration: { parameters: 1, body: 1 }, + FunctionExpression: { parameters: 1, body: 1 }, + CallExpression: { arguments: 1 }, + ArrayExpression: 1, + ObjectExpression: 1, + ImportDeclaration: 1, + flatTernaryExpressions: false, + ignoreComments: false, + ignoredNodes: [ + 'TemplateLiteral *', + 'JSXElement', + 'JSXElement > *', + 'JSXAttribute', + 'JSXIdentifier', + 'JSXNamespacedName', + 'JSXMemberExpression', + 'JSXSpreadAttribute', + 'JSXExpressionContainer', + 'JSXOpeningElement', + 'JSXClosingElement', + 'JSXFragment', + 'JSXOpeningFragment', + 'JSXClosingFragment', + 'JSXText', + 'JSXEmptyExpression', + 'JSXSpreadChild', + ], + offsetTernaryExpressions: true, + }, + ], + 'key-spacing': ['error', { beforeColon: false, afterColon: true }], + 'keyword-spacing': ['error', { before: true, after: true }], + 'lines-between-class-members': [ + 'error', + 'always', + { exceptAfterSingleLine: true }, + ], + 'multiline-ternary': ['error', 'always-multiline'], + 'new-cap': ['error', { newIsCap: true, capIsNew: false, properties: true }], + 'new-parens': 'error', + 'no-array-constructor': 'error', + 'no-async-promise-executor': 'error', + 'no-caller': 'error', + 'no-case-declarations': 'error', + 'no-class-assign': 'error', + 'no-compare-neg-zero': 'error', + 'no-cond-assign': 'error', + 'no-const-assign': 'error', + 'no-constant-condition': ['error', { checkLoops: false }], + 'no-control-regex': 'error', + 'no-debugger': 'error', + 'no-delete-var': 'error', + 'no-dupe-args': 'error', + 'no-dupe-class-members': 'error', + 'no-dupe-keys': 'error', + 'no-duplicate-case': 'error', + 'no-useless-backreference': 'error', + 'no-empty': ['error', { allowEmptyCatch: true }], + 'no-empty-character-class': 'error', + 'no-empty-pattern': 'error', + 'no-eval': 'error', + 'no-ex-assign': 'error', + 'no-extend-native': 'error', + 'no-extra-bind': 'error', + 'no-extra-boolean-cast': 'error', + 'no-extra-parens': ['error', 'functions'], + 'no-fallthrough': 'error', + 'no-floating-decimal': 'error', + 'no-func-assign': 'error', + 'no-global-assign': 'error', + 'no-implied-eval': 'error', + 'no-import-assign': 'error', + 'no-invalid-regexp': 'error', + 'no-irregular-whitespace': 'error', + 'no-iterator': 'error', + 'no-labels': ['error', { allowLoop: false, allowSwitch: false }], + 'no-lone-blocks': 'error', + 'no-loss-of-precision': 'error', + 'no-misleading-character-class': 'error', + 'no-prototype-builtins': 'error', + 'no-useless-catch': 'error', + 'no-mixed-operators': [ + 'error', + { + groups: [ + ['==', '!=', '===', '!==', '>', '>=', '<', '<='], + ['&&', '||'], + ['in', 'instanceof'], + ], + allowSamePrecedence: true, + }, + ], + 'no-mixed-spaces-and-tabs': 'error', + 'no-multi-spaces': 'error', + 'no-multi-str': 'error', + 'no-multiple-empty-lines': ['error', { max: 1, maxBOF: 0, maxEOF: 0 }], + 'no-new': 'error', + 'no-new-func': 'error', + 'no-new-object': 'error', + 'no-new-symbol': 'error', + 'no-new-wrappers': 'error', + 'no-obj-calls': 'error', + 'no-octal': 'error', + 'no-octal-escape': 'error', + 'no-proto': 'error', + 'no-redeclare': ['error', { builtinGlobals: false }], + 'no-regex-spaces': 'error', + 'no-return-assign': ['error', 'except-parens'], + 'no-self-assign': ['error', { props: true }], + 'no-self-compare': 'error', + 'no-sequences': 'error', + 'no-shadow-restricted-names': 'error', + 'no-sparse-arrays': 'error', + 'no-tabs': 'error', + 'no-template-curly-in-string': 'error', + 'no-this-before-super': 'error', + 'no-throw-literal': 'error', + 'no-trailing-spaces': 'error', + 'no-undef': 'error', + 'no-undef-init': 'error', + 'no-unexpected-multiline': 'error', + 'no-unmodified-loop-condition': 'error', + 'no-unneeded-ternary': ['error', { defaultAssignment: false }], + 'no-unreachable': 'error', + 'no-unreachable-loop': 'error', + 'no-unsafe-finally': 'error', + 'no-unsafe-negation': 'error', + 'no-unused-expressions': [ + 'error', + { + allowShortCircuit: true, + allowTernary: true, + allowTaggedTemplates: true, + }, + ], + 'no-unused-vars': [ + 'error', + { + args: 'none', + caughtErrors: 'none', + ignoreRestSiblings: true, + vars: 'all', + }, + ], + 'no-use-before-define': [ + 'error', + { functions: false, classes: false, variables: false }, + ], + 'no-useless-call': 'error', + 'no-useless-computed-key': 'error', + 'no-useless-constructor': 'error', + 'no-useless-escape': 'error', + 'no-useless-rename': 'error', + 'no-useless-return': 'error', + 'no-void': 'error', + 'no-whitespace-before-property': 'error', + 'no-with': 'error', + 'object-curly-newline': ['error', { multiline: true, consistent: true }], + 'object-curly-spacing': ['error', 'always'], + 'object-property-newline': [ + 'error', + { allowMultiplePropertiesPerLine: true }, + ], + 'one-var': ['error', { initialized: 'never' }], + 'operator-linebreak': [ + 'error', + 'after', + { overrides: { '?': 'before', ':': 'before', '|>': 'before' } }, + ], + 'padded-blocks': [ + 'error', + { blocks: 'never', switches: 'never', classes: 'never' }, + ], + 'prefer-const': ['error', { destructuring: 'all' }], + 'prefer-promise-reject-errors': 'error', + 'prefer-regex-literals': ['error', { disallowRedundantWrapping: true }], + 'quote-props': ['error', 'as-needed'], + quotes: [ + 'error', + 'single', + { avoidEscape: true, allowTemplateLiterals: false }, + ], + 'rest-spread-spacing': ['error', 'never'], + semi: ['error', 'never'], + 'semi-spacing': ['error', { before: false, after: true }], + 'space-before-blocks': ['error', 'always'], + 'space-before-function-paren': ['error', 'always'], + 'space-in-parens': ['error', 'never'], + 'space-infix-ops': 'error', + 'space-unary-ops': ['error', { words: true, nonwords: false }], + 'spaced-comment': [ + 'error', + 'always', + { + line: { markers: ['*package', '!', '/', ',', '='] }, + block: { + balanced: true, + markers: ['*package', '!', ',', ':', '::', 'flow-include'], + exceptions: ['*'], + }, + }, + ], + 'symbol-description': 'error', + 'template-curly-spacing': ['error', 'never'], + 'template-tag-spacing': ['error', 'never'], + 'unicode-bom': ['error', 'never'], + 'use-isnan': [ + 'error', + { + enforceForSwitchCase: true, + enforceForIndexOf: true, + }, + ], + 'valid-typeof': ['error', { requireStringLiterals: true }], + 'wrap-iife': ['error', 'any', { functionPrototypeMethods: true }], + 'yield-star-spacing': ['error', 'both'], + yoda: ['error', 'never'], + + 'import/export': 'error', + 'import/first': 'error', + 'import/no-absolute-path': [ + 'error', + { esmodule: true, commonjs: true, amd: false }, + ], + 'import/no-duplicates': 'error', + 'import/no-named-default': 'error', + 'import/no-webpack-loader-syntax': 'error', + + 'n/handle-callback-err': ['error', '^(err|error)$'], + 'n/no-callback-literal': 'error', + 'n/no-deprecated-api': 'error', + 'n/no-exports-assign': 'error', + 'n/no-new-require': 'error', + 'n/no-path-concat': 'error', + 'n/process-exit-as-throw': 'error', + + 'promise/param-names': 'error', + }, +}; diff --git a/src/eslint-stylistic-config.js b/src/eslint-stylistic-config.js new file mode 100644 index 00000000..b902e575 --- /dev/null +++ b/src/eslint-stylistic-config.js @@ -0,0 +1,108 @@ +/** + * This is a local copy of the pending updates to eslint-config-prettier that + * will disable all the rules from the stylistic plugin. It can be removed in + * favor of the real package once #272 is merged and released. + * + * @see https://github.com/prettier/eslint-config-prettier/pull/272/ + */ + +export default { + rules: { + '@stylistic/array-bracket-newline': 'off', + '@stylistic/array-bracket-spacing': 'off', + '@stylistic/array-element-newline': 'off', + '@stylistic/arrow-parens': 'off', + '@stylistic/arrow-spacing': 'off', + '@stylistic/block-spacing': 'off', + '@stylistic/brace-style': 'off', + '@stylistic/comma-dangle': 'off', + '@stylistic/comma-spacing': 'off', + '@stylistic/comma-style': 'off', + '@stylistic/computed-property-spacing': 'off', + '@stylistic/curly-newline': 'off', + '@stylistic/dot-location': 'off', + '@stylistic/eol-last': 'off', + '@stylistic/func-call-spacing': 'off', + '@stylistic/function-call-argument-newline': 'off', + '@stylistic/function-call-spacing': 'off', + '@stylistic/function-paren-newline': 'off', + '@stylistic/generator-star-spacing': 'off', + '@stylistic/implicit-arrow-linebreak': 'off', + '@stylistic/indent': 'off', + '@stylistic/indent-binary-ops': 'off', + '@stylistic/jsx-child-element-spacing': 'off', + '@stylistic/jsx-closing-bracket-location': 'off', + '@stylistic/jsx-closing-tag-location': 'off', + '@stylistic/jsx-curly-brace-presence': 'off', + '@stylistic/jsx-curly-newline': 'off', + '@stylistic/jsx-curly-spacing': 'off', + '@stylistic/jsx-equals-spacing': 'off', + '@stylistic/jsx-first-prop-new-line': 'off', + '@stylistic/jsx-function-call-newline': 'off', + '@stylistic/jsx-indent': 'off', + '@stylistic/jsx-indent-props': 'off', + '@stylistic/jsx-max-props-per-line': 'off', + '@stylistic/jsx-newline': 'off', + '@stylistic/jsx-one-expression-per-line': 'off', + '@stylistic/jsx-pascal-case': 'off', + '@stylistic/jsx-props-no-multi-spaces': 'off', + '@stylistic/jsx-quotes': 'off', + '@stylistic/jsx-self-closing-comp': 'off', + '@stylistic/jsx-sort-props': 'off', + '@stylistic/jsx-tag-spacing': 'off', + '@stylistic/jsx-wrap-multilines': 'off', + '@stylistic/key-spacing': 'off', + '@stylistic/keyword-spacing': 'off', + '@stylistic/line-comment-position': 'off', + '@stylistic/linebreak-style': 'off', + '@stylistic/lines-around-comment': 'off', + '@stylistic/lines-between-class-members': 'off', + '@stylistic/max-len': 'off', + '@stylistic/max-statements-per-line': 'off', + '@stylistic/member-delimiter-style': 'off', + '@stylistic/multiline-comment-style': 'off', + '@stylistic/multiline-ternary': 'off', + '@stylistic/new-parens': 'off', + '@stylistic/newline-per-chained-call': 'off', + '@stylistic/no-confusing-arrow': 'off', + '@stylistic/no-extra-parens': 'off', + '@stylistic/no-extra-semi': 'off', + '@stylistic/no-floating-decimal': 'off', + '@stylistic/no-mixed-operators': 'off', + '@stylistic/no-mixed-spaces-and-tabs': 'off', + '@stylistic/no-multi-spaces': 'off', + '@stylistic/no-multiple-empty-lines': 'off', + '@stylistic/no-tabs': 'off', + '@stylistic/no-trailing-spaces': 'off', + '@stylistic/no-whitespace-before-property': 'off', + '@stylistic/nonblock-statement-body-position': 'off', + '@stylistic/object-curly-newline': 'off', + '@stylistic/object-curly-spacing': 'off', + '@stylistic/object-property-newline': 'off', + '@stylistic/one-var-declaration-per-line': 'off', + '@stylistic/operator-linebreak': 'off', + '@stylistic/padded-blocks': 'off', + '@stylistic/padding-line-between-statements': 'off', + '@stylistic/quote-props': 'off', + '@stylistic/quotes': 'off', + '@stylistic/rest-spread-spacing': 'off', + '@stylistic/semi': 'off', + '@stylistic/semi-spacing': 'off', + '@stylistic/semi-style': 'off', + '@stylistic/space-before-blocks': 'off', + '@stylistic/space-before-function-paren': 'off', + '@stylistic/space-in-parens': 'off', + '@stylistic/space-infix-ops': 'off', + '@stylistic/space-unary-ops': 'off', + '@stylistic/spaced-comment': 'off', + '@stylistic/switch-colon-spacing': 'off', + '@stylistic/template-curly-spacing': 'off', + '@stylistic/template-tag-spacing': 'off', + '@stylistic/type-annotation-spacing': 'off', + '@stylistic/type-generic-spacing': 'off', + '@stylistic/type-named-tuple-spacing': 'off', + '@stylistic/wrap-iife': 'off', + '@stylistic/wrap-regex': 'off', + '@stylistic/yield-star-spacing': 'off', + }, +}; diff --git a/src/rules.js b/src/rules.js deleted file mode 100644 index d95a4f5d..00000000 --- a/src/rules.js +++ /dev/null @@ -1,33 +0,0 @@ -const typescript = require('@typescript-eslint/eslint-plugin').rules; -const eslintImport = require('eslint-plugin-import').rules; -const jsdoc = require('eslint-plugin-jsdoc').rules; -const node = require('eslint-plugin-n').rules; -const promise = require('eslint-plugin-promise').rules; -const unicorn = require('eslint-plugin-unicorn').rules; - -const preferEarlyReturn = require('./rules/prefer-early-return'); - -/** - * Prefixes each rule of the config - * Example if `prefix` is `n`: - * changes rule callback-return to n/callback-return - * - * @param {string} prefix - * @param {{[key: string]: unknown}} rules - */ -const hoist = (prefix, rules) => - Object.fromEntries( - Object.entries(rules).map(([key, val]) => [`${prefix}/${key}`, val]), - ); - -const rules = { - ...hoist('n', node), - ...hoist('import', eslintImport), - ...hoist('promise', promise), - ...hoist('unicorn', unicorn), - ...hoist('jsdoc', jsdoc), - ...hoist('typescript-eslint', typescript), - 'prefer-early-return': preferEarlyReturn, -}; - -module.exports = rules; diff --git a/src/rules/prefer-early-return/README.md b/src/rules/prefer-early-return/README.md index e219846f..76a56e1c 100644 --- a/src/rules/prefer-early-return/README.md +++ b/src/rules/prefer-early-return/README.md @@ -10,11 +10,11 @@ The following patterns are considered warnings: ```js function foo() { - if (a) { - b(); - c(); - d(); - } + if (a) { + b(); + c(); + d(); + } } ``` @@ -22,30 +22,30 @@ The following patterns are not warnings: ```js function foo() { - if (!a) { - return; - } + if (!a) { + return; + } - b(); - c(); + b(); + c(); } function bar() { - if (a) { - b(); - c(); - } + if (a) { + b(); + c(); + } - d(); + d(); } function baz() { - if (a) { - b(); - c(); - } else { - d(); - } + if (a) { + b(); + c(); + } else { + d(); + } } ``` @@ -55,10 +55,10 @@ This plugin takes one option: an object with a integer `maximumStatements` prope ```js function foo() { - if (a) { - b(); - c(); - } + if (a) { + b(); + c(); + } } ``` @@ -66,11 +66,11 @@ Setting `maximumStatements` to `1` or `0` will cause the above to be a warning. ```js function foo() { - if (a) { - b(); - c(); - d(); - } + if (a) { + b(); + c(); + d(); + } } ``` diff --git a/src/rules/prefer-early-return/index.js b/src/rules/prefer-early-return/index.js index ff84d483..019c2adb 100644 --- a/src/rules/prefer-early-return/index.js +++ b/src/rules/prefer-early-return/index.js @@ -1,75 +1,75 @@ /** @type {import('eslint').Rule.RuleModule} */ -module.exports = { - meta: { - docs: { - description: - 'Prefer early returns over full-body conditional wrapping in function declarations.', - category: 'Best Practices', - recommended: false, - uri: 'https://github.com/cloudfour/eslint-config/blob/main/src/rules/prefer-early-return/README.md', - }, - schema: [ - { - type: 'object', - properties: { - maximumStatements: { - type: 'integer', - }, - }, - additionalProperties: false, - }, - ], - }, +export default { + meta: { + docs: { + description: + 'Prefer early returns over full-body conditional wrapping in function declarations.', + category: 'Best Practices', + recommended: false, + uri: 'https://github.com/cloudfour/eslint-config/blob/main/src/rules/prefer-early-return/README.md', + }, + schema: [ + { + type: 'object', + properties: { + maximumStatements: { + type: 'integer', + }, + }, + additionalProperties: false, + }, + ], + }, - create(context) { - const options = context.options[0] || { maximumStatements: 2 }; - const maxStatements = options.maximumStatements; + create(context) { + const options = context.options[0] || { maximumStatements: 2 }; + const maxStatements = options.maximumStatements; - /** @param {import('estree').Statement} consequent */ - function isOffendingConsequent(consequent) { - return ( - (consequent.type === 'ExpressionStatement' && maxStatements === 0) || - (consequent.type === 'BlockStatement' && - consequent.body.length > maxStatements) - ); - } + /** @param {import('estree').Statement} consequent */ + function isOffendingConsequent(consequent) { + return ( + (consequent.type === 'ExpressionStatement' && maxStatements === 0) || + (consequent.type === 'BlockStatement' && + consequent.body.length > maxStatements) + ); + } - /** @param {import('estree').Statement} statement */ - function isOffendingIfStatement(statement) { - return ( - isLonelyIfStatement(statement) && - isOffendingConsequent(statement.consequent) - ); - } + /** @param {import('estree').Statement} statement */ + function isOffendingIfStatement(statement) { + return ( + isLonelyIfStatement(statement) && + isOffendingConsequent(statement.consequent) + ); + } - /** @param {import('estree').BlockStatement} functionBody */ - function hasSimplifiableConditionalBody(functionBody) { - const body = functionBody.body; - return ( - functionBody.type === 'BlockStatement' && - body.length === 1 && - isOffendingIfStatement(body[0]) - ); - } + /** @param {import('estree').BlockStatement} functionBody */ + function hasSimplifiableConditionalBody(functionBody) { + const body = functionBody.body; + return ( + functionBody.type === 'BlockStatement' && + body.length === 1 && + isOffendingIfStatement(body[0]) + ); + } - /** @param {import('estree').FunctionDeclaration} functionNode */ - function checkFunctionBody(functionNode) { - const body = functionNode.body; + /** @param {import('estree').FunctionDeclaration} functionNode */ + function checkFunctionBody(functionNode) { + const body = functionNode.body; - if (hasSimplifiableConditionalBody(body)) { - context.report( - body, - 'Prefer an early return to a conditionally-wrapped function body', - ); - } - } + if (hasSimplifiableConditionalBody(body)) { + context.report( + body, + 'Prefer an early return to a conditionally-wrapped function body', + ); + } + } - return { - FunctionDeclaration: checkFunctionBody, - FunctionExpression: checkFunctionBody, - ArrowFunctionExpression: checkFunctionBody, - }; - }, + return { + FunctionDeclaration: checkFunctionBody, + FunctionExpression: checkFunctionBody, + ArrowFunctionExpression: checkFunctionBody, + }; + }, }; /** @@ -77,5 +77,5 @@ module.exports = { * @returns {statement is import('estree').IfStatement} */ function isLonelyIfStatement(statement) { - return statement.type === 'IfStatement' && statement.alternate === null; + return statement.type === 'IfStatement' && statement.alternate === null; }