diff --git a/.editorconfig b/.editorconfig index c18b0625..28c28a0c 120000 --- a/.editorconfig +++ b/.editorconfig @@ -1 +1 @@ -code-style/.editorconfig \ No newline at end of file +packages/code-style/.editorconfig \ No newline at end of file diff --git a/.eslintrc.yaml b/.eslintrc.yaml new file mode 100644 index 00000000..c6e5e2c1 --- /dev/null +++ b/.eslintrc.yaml @@ -0,0 +1,17 @@ +root: true +extends: + - '@code-style/eslint-config' + - '@code-style/eslint-config-node' + - '@code-style/eslint-config-cli' + - '@code-style/eslint-config-jest' + - '@code-style/eslint-config-typescript' + - '@code-style/eslint-config-esmodule' +ignorePatterns: + - '**/test/*/**' + +overrides: + - files: + - 'scripts/bump.ts' + - 'scripts/concurrently-ws.ts' + rules: + n/shebang: 'off' diff --git a/.github/workflows/build-publish.yaml b/.github/workflows/build-publish.yaml index db7d8391..f2040972 100644 --- a/.github/workflows/build-publish.yaml +++ b/.github/workflows/build-publish.yaml @@ -2,19 +2,48 @@ name: 'Publish NPM Package' on: push: - branches: - - 'main' - # Publish `v1.2.3` tags as releases. - # tags: - # - v* + tags-ignore: ['*'] + pull_request: permissions: contents: 'read' jobs: + build: + runs-on: 'ubuntu-latest' + steps: + - name: 'Setup node ๐Ÿ›Ž๏ธ' + uses: 'dudeofawesome/actions/node-setup@v1' + - name: 'Build ๐Ÿ—๏ธ' + run: 'npm run build' + + lint: + runs-on: 'ubuntu-latest' + steps: + - name: 'Setup node ๐Ÿ›Ž๏ธ' + uses: 'dudeofawesome/actions/node-setup@v1' + - name: 'Lint ๐Ÿงช' + run: 'npm run lint' + + test: + runs-on: 'ubuntu-latest' + steps: + - name: 'Setup node ๐Ÿ›Ž๏ธ' + uses: 'dudeofawesome/actions/node-setup@v1' + - name: 'Test ๐Ÿงช' + run: 'npm run test' + publish: runs-on: 'ubuntu-latest' environment: 'production' + permissions: + id-token: 'write' + packages: 'write' + contents: 'write' + needs: + - 'build' + - 'lint' + - 'test' steps: - name: 'Setup node ๐Ÿ›Ž๏ธ' uses: 'dudeofawesome/actions/node-setup@v1' @@ -22,10 +51,20 @@ jobs: install-modules: false - name: 'Publish to NPM ๐Ÿš€' - if: '${{ github.ref_name }} == ${{ github.event.repository.default_branch }}' env: NODE_AUTH_TOKEN: '${{ secrets.NPM_AUTH_TOKEN }}' - run: |- - npm publish \ - --access public \ - --workspaces + uses: 'dudeofawesome/actions/npm-publish@v1' + + - name: 'Get package version ๐Ÿ”–' + id: 'get-package-version' + run: 'echo "version=v$(npm pkg get version | jq --raw-output)" >> "$GITHUB_OUTPUT"' + - name: 'Build jsonschema ๐Ÿ—๏ธ' + run: 'npm run build:jsonschema --workspace packages/code-style' + - name: 'Publish files to Github Releases ๐Ÿš€' + uses: 'softprops/action-gh-release@v2' + with: + tag_name: '${{ steps.get-package-version.outputs.version }}' + prerelease: "${{ contains(steps.get-package-version.outputs.version, '-') }}" + generate_release_notes: true + files: | + packages/code-style/codestylerc.schema.json diff --git a/.gitignore b/.gitignore index 7215b9e6..7d0b3f9c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ node_modules/ .npm npm-debug.log + +# output +dist/ diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..3b4690e8 --- /dev/null +++ b/.npmrc @@ -0,0 +1,2 @@ +engine-strict=true +script-shell=bash diff --git a/.nvmrc b/.nvmrc index 3c032078..209e3ef4 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -18 +20 diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 441a1eef..00000000 --- a/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -"@dudeofawesome/code-style/.prettierrc.js" diff --git a/.prettierrc.mjs b/.prettierrc.mjs new file mode 100644 index 00000000..c189ad46 --- /dev/null +++ b/.prettierrc.mjs @@ -0,0 +1,7 @@ +/** + * https://prettier.io/docs/en/ + * Prettier configuration file + * In order to update the this config, update @code-style/code-style + */ +import config from '@code-style/code-style/prettierrc'; +export default config; diff --git a/.vscode b/.vscode deleted file mode 120000 index 3c20ee54..00000000 --- a/.vscode +++ /dev/null @@ -1 +0,0 @@ -code-style/.vscode/ \ No newline at end of file diff --git a/code-style/.vscode/extensions.json b/.vscode/extensions.json similarity index 78% rename from code-style/.vscode/extensions.json rename to .vscode/extensions.json index 7cd3092f..c8286d36 100644 --- a/code-style/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -3,6 +3,6 @@ "editorconfig.editorconfig", "dbaeumer.vscode-eslint", "esbenp.prettier-vscode", - "stylelint.vscode-stylelint" + "ghmcadams.lintlens" ] } diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..e237727f --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,12 @@ +{ + "configurations": [ + { + "type": "node", + "request": "attach", + "name": "Attach", + "skipFiles": ["/**"], + "restart": true, + "continueOnAttach": true + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..9249bb02 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,46 @@ +{ + "typescript.tsdk": "./node_modules/typescript/lib", + + "editor.formatOnSave": true, + "editor.formatOnType": true, + "editor.formatOnPaste": true, + "typescript.format.enable": false, + "javascript.format.enable": false, + "editor.defaultFormatter": "esbenp.prettier-vscode", + + "[ruby]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + + "files.associations": { + "**/typescript-configs/**/*.json": "jsonc", + "**/javascript-configs/**/*.json": "jsonc" + }, + "json.schemas": [ + { + "fileMatch": [ + "typescript-configs/**/*.json", + "!typescript-configs/package.json" + ], + "url": "https://json.schemastore.org/tsconfig" + }, + { + "fileMatch": [ + "javascript-configs/**/*.json", + "!javascript-configs/package.json" + ], + "url": "https://json.schemastore.org/jsconfig" + } + ], + "material-icon-theme.files.associations": { + "eslint-config*/*.yaml": "eslint", + "styleint-config/*.yaml": "stylelint", + "typescript-configs/**/*.json": "tsconfig", + "javascript-configs/**/*.json": "jsconfig" + }, + "yaml.schemas": { + "https://json.schemastore.org/eslintrc": ["eslint-config*/**/*.yaml"], + "https://json.schemastore.org/stylelintrc.json": ["stylelint-config/*.yaml"] + }, + "cSpell.words": ["esmodule"] +} diff --git a/README.md b/README.md index e9a9b487..00caee63 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ## Usage -See [code-style](/code-style/README.md) for usage information. +See [create-configs](/packages/create-configs/README.md) for usage information. ## Contributing @@ -10,5 +10,9 @@ See [code-style](/code-style/README.md) for usage information. 1. Author your code changes. 1. Commit your changes. -1. Run [`scripts/bump.sh`](scripts/bump.sh) to bump all package versions. +1. Run [`scripts/bump.ts`](scripts/bump.ts) to bump all package versions. 1. Push your changes! + +### Updating dependencies across workspaces / packages + +1. Run [`scripts/upgrade-packages.sh --help`](scripts/upgrade-packages.sh) to see usage information about upgrading packages. diff --git a/code-style.code-workspace b/code-style.code-workspace new file mode 100644 index 00000000..a7c01a0e --- /dev/null +++ b/code-style.code-workspace @@ -0,0 +1,130 @@ +{ + "folders": [ + { + "name": "root", + "path": ".", + }, + { "path": "packages/code-style" }, + { "path": "packages/create-configs" }, + { "path": "packages/eslint-config" }, + { "path": "packages/eslint-config-browser" }, + { "path": "packages/eslint-config-cli" }, + { "path": "packages/eslint-config-esmodule" }, + { "path": "packages/eslint-config-jest" }, + { "path": "packages/eslint-config-library" }, + { "path": "packages/eslint-config-nest" }, + { "path": "packages/eslint-config-nextjs" }, + { "path": "packages/eslint-config-node" }, + { "path": "packages/eslint-config-react" }, + { "path": "packages/eslint-config-typescript" }, + { "path": "packages/eslint-npm-hoist-packages" }, + { "path": "packages/eslint-npm-hoist-packages-esmodule" }, + { "path": "packages/eslint-npm-hoist-packages-jest" }, + { "path": "packages/eslint-npm-hoist-packages-nextjs" }, + { "path": "packages/eslint-npm-hoist-packages-node" }, + { "path": "packages/eslint-npm-hoist-packages-react" }, + { "path": "packages/eslint-npm-hoist-packages-typescript" }, + { "path": "packages/eslint-plugin-nest" }, + { "path": "packages/jest-configs" }, + { "path": "packages/rubocop-config" }, + { "path": "packages/stylelint-config" }, + { "path": "packages/stylelint-config-scss" }, + { "path": "packages/typescript-configs" }, + { "path": "utils" }, + ], + "settings": { + "typescript.tsdk": "./node_modules/typescript/lib", + + "editor.formatOnSave": true, + "editor.formatOnType": true, + "editor.formatOnPaste": true, + "typescript.format.enable": false, + "javascript.format.enable": false, + "editor.defaultFormatter": "esbenp.prettier-vscode", + + "[ruby]": { + "editor.defaultFormatter": "esbenp.prettier-vscode", + }, + + "files.associations": { + "**/typescript-configs/**/*.json": "jsonc", + "**/javascript-configs/**/*.json": "jsonc", + }, + "json.schemas": [ + { + "fileMatch": [ + "typescript-configs/**/*.json", + "!typescript-configs/package.json", + ], + "url": "https://json.schemastore.org/tsconfig", + }, + { + "fileMatch": [ + "javascript-configs/**/*.json", + "!javascript-configs/package.json", + ], + "url": "https://json.schemastore.org/jsconfig", + }, + ], + "material-icon-theme.files.associations": { + "eslint-config*/*.yaml": "eslint", + "styleint-config/*.yaml": "stylelint", + "typescript-configs/**/*.json": "tsconfig", + "javascript-configs/**/*.json": "jsconfig", + }, + "yaml.schemas": { + "https://json.schemastore.org/eslintrc": ["eslint-config*/**/*.yaml"], + "https://json.schemastore.org/stylelintrc.json": [ + "stylelint-config/*.yaml", + ], + }, + + "nodejs-testing.extensions": [ + { + "extensions": ["mjs", "cjs", "js"], + "parameters": [], + }, + { + "extensions": ["mts", "cts", "ts"], + "parameters": ["--require", "tsm"], + }, + ], + "jest.disabledWorkspaceFolders": [ + "root", + "code-style", + "eslint-config", + "eslint-config-browser", + "eslint-config-cli", + "eslint-config-esmodule", + "eslint-config-jest", + "eslint-config-library", + "eslint-config-nest", + "eslint-config-nextjs", + "eslint-config-node", + "eslint-config-react", + "eslint-config-typescript", + "eslint-npm-hoist-packages", + "eslint-npm-hoist-packages-esmodule", + "eslint-npm-hoist-packages-jest", + "eslint-npm-hoist-packages-nextjs", + "eslint-npm-hoist-packages-node", + "eslint-npm-hoist-packages-react", + "eslint-npm-hoist-packages-typescript", + "rubocop-config", + "stylelint-config", + "stylelint-config-scss", + "typescript-configs", + "utils", + ], + + "cSpell.words": ["esmodule"], + }, + "extensions": { + "recommendations": [ + "editorconfig.editorconfig", + "dbaeumer.vscode-eslint", + "esbenp.prettier-vscode", + "ghmcadams.lintlens", + ], + }, +} diff --git a/code-style/.prettierrc.js b/code-style/.prettierrc.js deleted file mode 100644 index df8ab8d0..00000000 --- a/code-style/.prettierrc.js +++ /dev/null @@ -1,56 +0,0 @@ -// https://prettier.io/docs/en/options.html - -const exec = require('child_process').exec; - -const is_prettier_gem_installed = exec('gem list -i prettier') === 'true'; - -const general = { - singleQuote: true, - semi: true, - trailingComma: 'all', - quoteProps: 'as-needed', // prettier default - bracketSpacing: true, // prettier default - bracketSameLine: false, // prettier default - arrowParens: 'always', // prettier default - proseWrap: 'preserve', // prettier default - singleAttributePerLine: false, // prettier default - embeddedLanguageFormatting: 'auto', // prettier default - // printWidth: // configured in .editorconfig->max_line_length - // useTabs: // configured in .editorconfig->indent_size - // tabWidth: // configured in .editorconfig->indent_style - // endOfLine: // configured in .editorconfig->end_of_line -}; - -const html = { - htmlWhitespaceSensitivity: 'css', // prettier default -}; - -const jsx = { - jsxSingleQuote: false, // prettier default -}; - -const vue = { - vueIndentScriptAndStyle: false, // prettier default -}; - -const ruby = { - rubyArrayLiteral: true, - rubyHashLabel: true, - rubyModifier: true, - rubySingleQuote: true, - rubyToProc: false, -}; - -module.exports = { - ...general, - ...html, - ...jsx, - ...vue, -}; - -if (is_prettier_gem_installed) { - module.exports = { - ...module.exports, - ...ruby, - }; -} diff --git a/code-style/.stylelintrc.json b/code-style/.stylelintrc.json deleted file mode 100644 index 2a2398a8..00000000 --- a/code-style/.stylelintrc.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "extends": ["stylelint-config-sass-guidelines", "stylelint-prettier/recommended"], - "rules": { - "at-rule-no-unknown": null, - "scss/at-rule-no-unknown": true, - "scss/at-mixin-pattern": null, - "scss/dollar-variable-pattern": null, - "color-named": null, - "selector-class-pattern": null, - "selector-no-qualifying-type": null, - "selector-no-vendor-prefix": null, - "property-no-vendor-prefix": null, - "value-no-vendor-prefix": null, - "scss/percent-placeholder-pattern": null, - "max-nesting-depth": 2, - "function-parentheses-space-inside": "never-single-line", - "order/order": [ - "dollar-variables", - "custom-properties", - "declarations", - "rules", - { - "type": "at-rule", - "name": "include", - "parameter": "media" - }, - { - "type": "at-rule", - "name": "include", - "parameter": "print" - } - ] - } -} diff --git a/code-style/.vscode/settings.json b/code-style/.vscode/settings.json deleted file mode 100644 index cf537dcf..00000000 --- a/code-style/.vscode/settings.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "typescript.tsdk": "./node_modules/typescript/lib", - - "editor.formatOnSave": true, - "editor.formatOnType": true, - "editor.formatOnPaste": true, - "typescript.format.enable": false, - "javascript.format.enable": false, - "editor.defaultFormatter": "esbenp.prettier-vscode", - - "[ruby]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - } -} diff --git a/code-style/examples/.eslintrc.yml b/code-style/examples/.eslintrc.yml deleted file mode 100644 index 902b1356..00000000 --- a/code-style/examples/.eslintrc.yml +++ /dev/null @@ -1,3 +0,0 @@ -extends: - - '@dudeofawesome' -root: true diff --git a/code-style/examples/.prettierrc b/code-style/examples/.prettierrc deleted file mode 100644 index 441a1eef..00000000 --- a/code-style/examples/.prettierrc +++ /dev/null @@ -1 +0,0 @@ -"@dudeofawesome/code-style/.prettierrc.js" diff --git a/code-style/examples/.rubocop.yml b/code-style/examples/.rubocop.yml deleted file mode 100644 index 58a9a17b..00000000 --- a/code-style/examples/.rubocop.yml +++ /dev/null @@ -1 +0,0 @@ -inherit_from: 'node_modules/@dudeofawesome/code-style/.rubocop.yml' diff --git a/code-style/examples/.stylelintrc.json b/code-style/examples/.stylelintrc.json deleted file mode 100644 index a9c23f30..00000000 --- a/code-style/examples/.stylelintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": ["@dudeofawesome/code-style/.stylelintrc.json"] -} diff --git a/code-style/package.json b/code-style/package.json deleted file mode 100644 index a5cba994..00000000 --- a/code-style/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "@dudeofawesome/code-style", - "description": "My code style configs", - "version": "1.3.0", - "repository": { - "type": "git", - "url": "git@github.com:dudeofawesome/code-style.git", - "directory": "/code-style" - }, - "keywords": [ - "style", - "lint", - "config", - "format" - ], - "author": "Louis Orleans ", - "license": "MIT", - "scripts": { - "test": "echo 'No tests'; exit 0" - }, - "bin": { - "add-code-style": "scripts/add-code-style.sh" - }, - "dependencies": { - "@dudeofawesome/eslint-config": "^1.0.0", - "@prettier/plugin-ruby": "^3.1.2", - "eslint": "^8.36.0", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", - "stylelint": "^14.6.0", - "stylelint-prettier": "^2.0.0" - } -} diff --git a/code-style/scripts/add-code-style.sh b/code-style/scripts/add-code-style.sh deleted file mode 100755 index 5db37f7a..00000000 --- a/code-style/scripts/add-code-style.sh +++ /dev/null @@ -1,161 +0,0 @@ -#!/usr/bin/env bash - -editorconfig=true -prettier=true -eslint=true -stylelint=true -rubocop=true -vscode=true - -overwrite=false - -write_files () { - # configure editorconfig - if [ $editorconfig = true ] && ([ ! -f .editorconfig ] || [ $overwrite = true ]); then - if [ $overwrite = true ]; then rm .editorconfig; fi; - ln -s node_modules/@dudeofawesome/code-style/.editorconfig .editorconfig; - echo "Symlinked .editorconfig"; - else - echo "Skipping editorconfig"; - fi - - # configure prettier - if [ $prettier = true ] && ([ ! -f .prettierrc ] || [ $overwrite = true ]); then - if [ $overwrite = true ]; then rm .prettierrc; fi; - cp node_modules/@dudeofawesome/code-style/examples/.prettierrc .; - echo "Created .prettierrc"; - else - echo "Skipping prettier"; - fi - - # configure eslint - if [ $eslint = true ] && ([ ! -f .eslintrc.yml ] || [ $overwrite = true ]); then - if [ $overwrite = true ]; then rm .eslintrc.yml; fi; - cp node_modules/@dudeofawesome/code-style/examples/.eslintrc.yml .; - echo "Created base .eslintrc.yml"; - echo "You probably want to add a 'parserOptions.ecmaVersion' to match this project's target" - else - echo "Skipping eslint"; - fi - - # configure stylelint - if [ $stylelint = true ] && ([ ! -f .stylelintrc.json ] || [ $overwrite = true ]); then - if [ $overwrite = true ]; then rm .stylelintrc.json; fi; - cp node_modules/@dudeofawesome/code-style/examples/.stylelintrc.json .; - echo "Created base .stylelintrc.json"; - else - echo "Skipping stylelint"; - fi - - # configure rubocop - if [ $rubocop = true ] && ([ ! -f .rubocop.yml ] || [ $overwrite = true ]); then - if [ $overwrite = true ]; then rm .rubocop.yml; fi; - cp node_modules/@dudeofawesome/code-style/examples/.rubocop.yml .; - echo "Created base .rubocop.yml"; - else - echo "Skipping rubocop"; - fi - - # configure vscode - if [ $vscode = true ]; then - mkdir .vscode - - if ([ ! -f .vscode/settings.json ] || [ $overwrite = true ]); then - if [ $overwrite = true ]; then rm .vscode/settings.json; fi; - cp node_modules/@dudeofawesome/code-style/.vscode/settings.json .vscode/; - echo "Created base .vscode/settings.json"; - else - echo "Skipping .vscode/settings.json"; - fi - - if ([ ! -f .vscode/extensions.json ] || [ $overwrite = true ]); then - if [ $overwrite = true ]; then rm .vscode/extensions.json; fi; - cp node_modules/@dudeofawesome/code-style/.vscode/extensions.json .vscode/; - echo "Created base .vscode/extensions.json"; - else - echo "Skipping .vscode/extensions.json"; - fi - else - echo "Skipping vscode"; - fi -} - -only_files () { - editorconfig=false - prettier=false - eslint=false - stylelint=false - rubocop=false - vscode=false - - for f in $@; do - set_file_toggle $f true - done -} - -skip_files () { - for f in $@; do - set_file_toggle $f false - done -} - -set_file_toggle () { - case "$1" in - editorconfig) editorconfig=$2;; - prettier) prettier=$2;; - eslint) eslint=$2;; - stylelint) stylelint=$2;; - rubocop) rubocop=$2;; - vscode) vscode=$2;; - *) echo "Unknown file '$1'"; exit 1;; - esac -} - -list_support_files () { - echo -e "editorconfig prettier eslint stylelint rubocop vscode" -} - -help () { - echo -e "" - echo -e "Usage:\t$(basename $0) [OPTIONS]" - echo -e "" - echo -e "Options:" - echo -e " -o, --only \"[opts]\" Only add the listed files" - echo -e " -s, --skip \"[opts]\" Skip the listed files" - echo -e " -w, --overwrite Overwrite config files that already exist" - echo -e " -l, --list List supported configs" - echo -e " -h, --help Show this message" -} - -option_error () { - echo "Unknown argument '$1'" - help - exit 128 -} - -main () { - while getopts 'o:s:wlh-:' opt; do - case "$opt" in - o) only_files "$OPTARG";; - s) skip_files "$OPTARG";; - w) overwrite=true;; - l) list_support_files; exit 0;; - h) help; exit 0;; - -) - case "${OPTARG}" in - only) only_files "$OPTARG";; - skip) skip_files "$OPTARG";; - overwrite) overwrite=true;; - list) list_support_files; exit 0;; - help) help; exit 0;; - *) option_error "$OPTARG";; - esac - ;; - *) option_error "$OPTARG";; - esac - done - - write_files -} - -main "$@" diff --git a/docs/upgrading-to-eslint-flat-config.md b/docs/upgrading-to-eslint-flat-config.md new file mode 100644 index 00000000..a15ecb51 --- /dev/null +++ b/docs/upgrading-to-eslint-flat-config.md @@ -0,0 +1,15 @@ +# Upgrading to ESLint v9 flat configs + +## Dependencies that have yet to add support for flat configs + +- [ ] [eslint-plugin-import / eslint-plugin-i](https://github.com/import-js/eslint-plugin-import/issues/2948) +- [x] [eslint-plugin-json-files](https://github.com/kellyselden/eslint-plugin-json-files) - no config provided +- [x] eslint-plugin-prettier +- [ ] [eslint-plugin-promise](https://github.com/eslint-community/eslint-plugin-promise/issues/449) +- [x] eslint-plugin-jest +- [x] eslint-plugin-n +- [ ] [eslint-plugin-jsx-a11y](https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/pull/891) +- [x] eslint-plugin-react +- [ ] [eslint-plugin-react-hooks](https://github.com/facebook/react/issues/28313) +- [x] @typescript-eslint/\* +- [ ] [@eslint-community/eslint-plugin-eslint-comments](https://github.com/eslint-community/eslint-plugin-eslint-comments/issues/182) diff --git a/eslint-config-jest/.eslintrc.yaml b/eslint-config-jest/.eslintrc.yaml deleted file mode 100644 index 77e1f0a0..00000000 --- a/eslint-config-jest/.eslintrc.yaml +++ /dev/null @@ -1,4 +0,0 @@ -plugins: - - 'jest' -env: - jest/globals: yes diff --git a/eslint-config-jest/README.md b/eslint-config-jest/README.md deleted file mode 100644 index fb15a8fc..00000000 --- a/eslint-config-jest/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# @dudeofawesome/eslint-config-jest - -My Jest eslint config - -## Usage - -1. Install this config plugin as a dev dependency. - - ```sh - npm i -D @dudeofawesome/eslint-config-jest - ``` - -1. Add the plugin to your `eslintrc`. - - You'll also want to have another eslint config for your environment. In this example, we'll use [my node one](../eslint-config-node/README.md) (which you'll need to install separately). - - ```yaml - extends: - - '@dudeofawesome' - - '@dudeofawesome/jest' - ``` diff --git a/eslint-config-jest/package.json b/eslint-config-jest/package.json deleted file mode 100644 index dd979057..00000000 --- a/eslint-config-jest/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "@dudeofawesome/eslint-config-jest", - "description": "My jest ESLint config", - "version": "1.3.0", - "repository": { - "type": "git", - "url": "git@github.com:dudeofawesome/code-style.git", - "directory": "/eslint-config-jest" - }, - "keywords": [ - "style", - "lint", - "config", - "eslint", - "jest" - ], - "author": "Louis Orleans ", - "license": "MIT", - "main": ".eslintrc.yaml", - "scripts": { - "test": "echo 'No tests'; exit 0" - }, - "dependencies": { - "@shopify/eslint-plugin": "^42.0.1", - "eslint": "^8.11.0" - }, - "peerDependencies": { - "@dudeofawesome/eslint-config": "^1.0.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1" - } -} diff --git a/eslint-config-node/.eslintrc.yaml b/eslint-config-node/.eslintrc.yaml deleted file mode 100644 index 11f52f05..00000000 --- a/eslint-config-node/.eslintrc.yaml +++ /dev/null @@ -1,7 +0,0 @@ -extends: - - 'plugin:@shopify/node' - -rules: - no-console: 'error' - radix: 'off' - node/exports-style: 'warn' diff --git a/eslint-config-node/README.md b/eslint-config-node/README.md deleted file mode 100644 index 77e9db8c..00000000 --- a/eslint-config-node/README.md +++ /dev/null @@ -1,26 +0,0 @@ -# @dudeofawesome/eslint-config-node - -My node eslint config - -## Usage - -1. Install this config plugin as a dev dependency. - - ```sh - npm i -D @dudeofawesome/eslint-config-node - ``` - -1. Add the plugin to your `eslintrc`. - - ```yaml - extends: - - '@dudeofawesome' - - '@dudeofawesome/node' - ``` - -1. You might also want to specify an `ecmaVersion`. - - ```yaml - parserOptions: - ecmaVersion: 2022 - ``` diff --git a/eslint-config-node/package.json b/eslint-config-node/package.json deleted file mode 100644 index fcdcb003..00000000 --- a/eslint-config-node/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "@dudeofawesome/eslint-config-node", - "description": "My node ESLint config", - "version": "1.3.0", - "repository": { - "type": "git", - "url": "git@github.com:dudeofawesome/code-style.git", - "directory": "/eslint-config-node" - }, - "keywords": [ - "style", - "lint", - "config", - "eslint" - ], - "author": "Louis Orleans ", - "license": "MIT", - "main": ".eslintrc.yaml", - "scripts": { - "test": "echo 'No tests'; exit 0" - }, - "dependencies": { - "@shopify/eslint-plugin": "^42.0.1" - }, - "peerDependencies": { - "@dudeofawesome/eslint-config": "^1.0.0" - } -} diff --git a/eslint-config-typescript/.eslintrc.yaml b/eslint-config-typescript/.eslintrc.yaml deleted file mode 100644 index 51089e83..00000000 --- a/eslint-config-typescript/.eslintrc.yaml +++ /dev/null @@ -1,29 +0,0 @@ -extends: - - 'plugin:@typescript-eslint/recommended' - - 'plugin:@shopify/typescript' - - 'plugin:import/typescript' - - 'plugin:prettier/recommended' -plugins: - - '@typescript-eslint' - -parser: '@typescript-eslint/parser' - -rules: - 'id-length': 'off' - 'no-negated-condition': 'off' - 'no-nested-ternary': 'off' - '@typescript-eslint/no-explicit-any': 'error' - '@typescript-eslint/no-inferrable-types': 'off' - '@typescript-eslint/no-unused-vars': - ['warn', { args: 'none', destructuredArrayIgnorePattern: '^_' }] - '@typescript-eslint/no-use-before-define': 'error' - '@typescript-eslint/naming-convention': 'off' - 'prettier/prettier': 'warn' - 'import/order': - - 'error' - - groups: - - 'builtin' - - 'external' - newlines-between: 'ignore' - 'import/no-cycle': 'off' - '@shopify/binary-assignment-parens': 'off' diff --git a/eslint-config-typescript/README.md b/eslint-config-typescript/README.md deleted file mode 100644 index c9212663..00000000 --- a/eslint-config-typescript/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# @dudeofawesome/eslint-config-typescript - -My Typescript eslint config - -## Usage - -1. Install this config plugin as a dev dependency. - - ```sh - npm i -D @dudeofawesome/eslint-config-typescript - ``` - -1. Add the plugin to your `eslintrc`. - - You'll also want to have another eslint config for your environment. In this example, we'll use [my node one](../eslint-config-node/README.md) (which you'll need to install separately). - - ```yaml - extends: - - '@dudeofawesome' - - '@dudeofawesome/node' - - '@dudeofawesome/typescript' - ``` - -1. You might want to add some `ignorePatterns` to not lint your transpiled JS. - - ```yaml - ignorePatterns: - - '/out' - ``` diff --git a/eslint-config-typescript/package.json b/eslint-config-typescript/package.json deleted file mode 100644 index 3d2873b1..00000000 --- a/eslint-config-typescript/package.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "name": "@dudeofawesome/eslint-config-typescript", - "description": "My Typescript ESLint config", - "version": "1.3.0", - "repository": { - "type": "git", - "url": "git@github.com:dudeofawesome/code-style.git", - "directory": "/eslint-config-typescript" - }, - "keywords": [ - "style", - "lint", - "config", - "eslint" - ], - "author": "Louis Orleans ", - "license": "MIT", - "main": ".eslintrc.yaml", - "scripts": { - "test": "echo 'No tests'; exit 0" - }, - "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.30.7", - "@typescript-eslint/parser": "^5.30.7" - }, - "peerDependencies": { - "@dudeofawesome/eslint-config": "^1.0.0", - "typescript": "^4.7.4" - } -} diff --git a/eslint-config/.eslintrc.yaml b/eslint-config/.eslintrc.yaml deleted file mode 100644 index be8ba23e..00000000 --- a/eslint-config/.eslintrc.yaml +++ /dev/null @@ -1,35 +0,0 @@ -extends: - - 'plugin:@shopify/esnext' - - 'plugin:prettier/recommended' -parserOptions: - ecmaVersion: 2022 # Version is inline with Node 16 - -rules: - '@babel/new-cap': 'off' - id-length: 'off' - import/order: - - 'warn' - - groups: - - 'builtin' - - 'external' - - 'internal' - import/no-default-export: 'error' - line-comment-position: 'off' - no-empty-function: 'warn' - no-negated-condition: 'off' - no-nested-ternary: 'off' - no-warning-comments: 'off' - prettier/prettier: 'warn' - require-atomic-updates: ['warn', { allowProperties: true }] - sort-class-members/sort-class-members: 'off' - import/extensions: 'off' - no-useless-constructor: 'off' - consistent-return: 'off' - require-await: 'off' - no-shadow: 'off' - promise/no-nesting: 'off' - import/no-cycle: 'off' - lines-between-class-members: 'off' - no-useless-return: 'off' - no-use-before-define: 'off' - '@shopify/binary-assignment-parens': 'off' diff --git a/eslint-config/README.md b/eslint-config/README.md deleted file mode 100644 index 9efd4c41..00000000 --- a/eslint-config/README.md +++ /dev/null @@ -1,10 +0,0 @@ -# @dudeofawesome/eslint-config - -You're probably looking to use this with one of our other configs: - -- [`@dudeofawesome/node`](../eslint-config-node/README.md) -- [`@dudeofawesome/typescript`](../eslint-config-typescript/README.md) -- [`@dudeofawesome/jest`](../eslint-config-jest/README.md) -- ~~[`@dudeofawesome/browser`](../eslint-config-browser/README.md)~~ (This does not yet exist at time of writing) - -However, if you're trying to build a new config for a new environment (maybe some new frontend framework or something), you'll want to use this config as your base. diff --git a/eslint-config/package.json b/eslint-config/package.json deleted file mode 100644 index c2a4b137..00000000 --- a/eslint-config/package.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "name": "@dudeofawesome/eslint-config", - "description": "My base ESLint config", - "version": "1.3.0", - "repository": { - "type": "git", - "url": "git@github.com:dudeofawesome/code-style.git", - "directory": "/eslint-config" - }, - "keywords": [ - "style", - "lint", - "config", - "eslint" - ], - "author": "Louis Orleans ", - "license": "MIT", - "main": ".eslintrc.yaml", - "scripts": { - "test": "echo 'No tests'; exit 0" - }, - "dependencies": { - "@shopify/eslint-plugin": "^42.0.1", - "eslint": "^8.11.0" - }, - "peerDependencies": { - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1" - } -} diff --git a/examples/eslint/jest/package.json b/examples/eslint/jest/package.json deleted file mode 100644 index b9c86cbc..00000000 --- a/examples/eslint/jest/package.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "name": "example-eslint-jest", - "version": "0.0.1", - "private": true, - "main": "src/index.js", - "scripts": { - "test": "echo 'No tests'; exit 0" - }, - "dependencies": { - "@dudeofawesome/eslint-config": "*", - "@shopify/eslint-plugin": "^42.0.1" - } -} diff --git a/package-lock.json b/package-lock.json index c91d988d..eabddfd6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1569 +1,1878 @@ { "name": "code-style-monorepo", - "version": "1.3.0", + "version": "2.0.0-26", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "code-style-monorepo", - "version": "1.3.0", + "version": "2.0.0-26", "license": "MIT", "workspaces": [ - "code-style", - "eslint-config", - "eslint-config-jest", - "eslint-config-node", - "eslint-config-typescript" + "packages/*", + "utils" ], + "bin": { + "bump": "scripts/bump.ts", + "concurrently-ws": "scripts/concurrently-ws.ts", + "upgrade-packages": "scripts/upgrade-packages.sh" + }, "devDependencies": { - "@dudeofawesome/code-style": "^1.0.0" - } - }, - "code-style": { - "name": "@dudeofawesome/code-style", - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "@dudeofawesome/eslint-config": "^1.0.0", - "@prettier/plugin-ruby": "^3.1.2", - "eslint": "^8.36.0", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1", - "stylelint": "^14.6.0", - "stylelint-prettier": "^2.0.0" + "@types/eslint": "^8.44.2", + "@types/node": "^20.8.4", + "tsm": "^2.3.0", + "yargs": "^17.7.2" }, - "bin": { - "add-code-style": "scripts/add-code-style.sh" + "engines": { + "node": ">=20" } }, - "code-style/node_modules/@csstools/selector-specificity": { - "version": "2.1.1", - "license": "CC0-1.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": "^14 || ^16 || >=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - }, - "peerDependencies": { - "postcss": "^8.4", - "postcss-selector-parser": "^6.0.10" + "node": ">=0.10.0" } }, - "code-style/node_modules/@prettier/plugin-ruby": { - "version": "3.2.2", - "license": "MIT", + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dependencies": { - "prettier": ">=2.3.0" - } - }, - "code-style/node_modules/@types/minimist": { - "version": "1.2.2", - "license": "MIT" - }, - "code-style/node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "license": "MIT" - }, - "code-style/node_modules/@types/parse-json": { - "version": "4.0.0", - "license": "MIT" - }, - "code-style/node_modules/arrify": { - "version": "1.0.1", - "license": "MIT", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "code-style/node_modules/astral-regex": { - "version": "2.0.0", - "license": "MIT", + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "code-style/node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "code-style/node_modules/camelcase-keys": { - "version": "6.2.2", - "license": "MIT", + "node_modules/@babel/core": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dependencies": { - "camelcase": "^5.3.1", - "map-obj": "^4.0.0", - "quick-lru": "^4.0.1" + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0", + "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": ">=8" + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "code-style/node_modules/colord": { - "version": "2.9.3", - "license": "MIT" + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } }, - "code-style/node_modules/cosmiconfig": { - "version": "7.1.0", - "license": "MIT", + "node_modules/@babel/generator": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "code-style/node_modules/css-functions-list": { - "version": "3.1.0", - "license": "MIT", + "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": ">=12.22" + "node": ">=6.9.0" } }, - "code-style/node_modules/cssesc": { - "version": "3.0.0", - "license": "MIT", + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" + "semver": "bin/semver.js" } }, - "code-style/node_modules/decamelize": { - "version": "1.2.0", - "license": "MIT", + "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": ">=0.10.0" + "node": ">=6.9.0" } }, - "code-style/node_modules/decamelize-keys": { - "version": "1.1.1", - "license": "MIT", + "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": { - "decamelize": "^1.1.0", - "map-obj": "^1.0.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { - "node": ">=0.10.0" + "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" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "code-style/node_modules/decamelize-keys/node_modules/map-obj": { - "version": "1.0.1", - "license": "MIT", + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dependencies": { + "@babel/types": "^7.24.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.9.0" } }, - "code-style/node_modules/error-ex": { - "version": "1.3.2", - "license": "MIT", + "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": { - "is-arrayish": "^0.2.1" + "@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" } }, - "code-style/node_modules/fastest-levenshtein": { - "version": "1.0.16", - "license": "MIT", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.0.tgz", + "integrity": "sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==", "engines": { - "node": ">= 4.9.1" + "node": ">=6.9.0" } }, - "code-style/node_modules/global-modules": { - "version": "2.0.0", - "license": "MIT", + "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": { - "global-prefix": "^3.0.0" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "code-style/node_modules/global-prefix": { - "version": "3.0.0", - "license": "MIT", + "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": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" + "@babel/types": "^7.22.5" }, "engines": { - "node": ">=6" + "node": ">=6.9.0" } }, - "code-style/node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "engines": { + "node": ">=6.9.0" } }, - "code-style/node_modules/globjoin": { - "version": "0.1.4", - "license": "MIT" + "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" + } }, - "code-style/node_modules/hard-rejection": { - "version": "2.1.0", - "license": "MIT", + "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" + "node": ">=6.9.0" } }, - "code-style/node_modules/hosted-git-info": { - "version": "4.1.0", - "license": "ISC", + "node_modules/@babel/helpers": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dependencies": { - "lru-cache": "^6.0.0" + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "code-style/node_modules/hosted-git-info/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", + "node_modules/@babel/highlight": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dependencies": { - "yallist": "^4.0.0" + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "code-style/node_modules/hosted-git-info/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "code-style/node_modules/html-tags": { - "version": "3.2.0", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "code-style/node_modules/import-lazy": { - "version": "4.0.0", - "license": "MIT", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "code-style/node_modules/indent-string": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" } }, - "code-style/node_modules/ini": { - "version": "1.3.8", - "license": "ISC" + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, - "code-style/node_modules/is-arrayish": { - "version": "0.2.1", - "license": "MIT" + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } }, - "code-style/node_modules/is-fullwidth-code-point": { + "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "engines": { - "node": ">=8" + "node": ">=4" } }, - "code-style/node_modules/is-plain-obj": { - "version": "1.1.0", - "license": "MIT", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">=4" } }, - "code-style/node_modules/is-plain-object": { - "version": "5.0.0", - "license": "MIT", + "node_modules/@babel/parser": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=0.10.0" + "node": ">=6.0.0" } }, - "code-style/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "license": "MIT" + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "code-style/node_modules/kind-of": { - "version": "6.0.3", - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/known-css-properties": { - "version": "0.26.0", - "license": "MIT" + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "code-style/node_modules/lines-and-columns": { - "version": "1.2.4", - "license": "MIT" - }, - "code-style/node_modules/lodash.truncate": { - "version": "4.4.2", - "license": "MIT" - }, - "code-style/node_modules/map-obj": { - "version": "4.3.0", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "code-style/node_modules/mathml-tag-names": { - "version": "2.1.3", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/meow": { - "version": "9.0.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "code-style/node_modules/min-indent": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=4" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/minimist-options": { - "version": "4.1.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", "dependencies": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0", - "kind-of": "^6.0.3" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { - "node": ">= 6" - } - }, - "code-style/node_modules/nanoid": { - "version": "3.3.4", - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" + "node": ">=6.9.0" }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/normalize-package-data": { - "version": "3.0.3", - "license": "BSD-2-Clause", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/normalize-package-data/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dependencies": { - "yallist": "^4.0.0" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/normalize-package-data/node_modules/semver": { - "version": "7.3.8", - "license": "ISC", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "@babel/helper-plugin-utils": "^7.10.4" }, - "engines": { - "node": ">=10" - } - }, - "code-style/node_modules/normalize-package-data/node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "code-style/node_modules/normalize-path": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "code-style/node_modules/p-try": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=6" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/parse-json": { - "version": "5.2.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "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" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/postcss": { - "version": "8.4.21", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - } - ], - "license": "MIT", + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dependencies": { - "nanoid": "^3.3.4", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "@babel/helper-plugin-utils": "^7.8.0" }, - "engines": { - "node": "^10 || ^12 || >=14" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/postcss-media-query-parser": { - "version": "0.2.3", - "license": "MIT" - }, - "code-style/node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "license": "MIT" - }, - "code-style/node_modules/postcss-safe-parser": { - "version": "6.0.0", - "license": "MIT", - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "postcss": "^8.3.3" + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/postcss-selector-parser": { - "version": "6.0.11", - "license": "MIT", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { - "node": ">=4" - } - }, - "code-style/node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT" - }, - "code-style/node_modules/quick-lru": { - "version": "4.0.1", - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/read-pkg": { - "version": "5.2.0", - "license": "MIT", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "code-style/node_modules/read-pkg-up": { - "version": "7.0.1", - "license": "MIT", + "node_modules/@babel/runtime": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" + "regenerator-runtime": "^0.14.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6.9.0" } }, - "code-style/node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "license": "MIT", + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "code-style/node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" + "node_modules/@babel/traverse": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "dependencies": { + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", + "@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.24.1", + "@babel/types": "^7.24.0", + "debug": "^4.3.1", + "globals": "^11.1.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "code-style/node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "code-style/node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "license": "MIT", + "node_modules/@babel/types": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", + "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", "dependencies": { - "p-limit": "^2.2.0" + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "code-style/node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, - "code-style/node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "license": "ISC" + "node_modules/@bufbuild/protobuf": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.8.0.tgz", + "integrity": "sha512-qR9FwI8QKIveDnUYutvfzbC21UZJJryYrLuZGjeZ/VGz+vXelUkK+xgkOHsvPEdYEdxtgUUq4313N8QtOehJ1Q==", + "peer": true }, - "code-style/node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } + "node_modules/@code-style/code-style": { + "resolved": "packages/code-style", + "link": true }, - "code-style/node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } + "node_modules/@code-style/create-configs": { + "resolved": "packages/create-configs", + "link": true }, - "code-style/node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=8" - } + "node_modules/@code-style/eslint-config": { + "resolved": "packages/eslint-config", + "link": true }, - "code-style/node_modules/redent": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "node_modules/@code-style/eslint-config-browser": { + "resolved": "packages/eslint-config-browser", + "link": true }, - "code-style/node_modules/require-from-string": { - "version": "2.0.2", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "node_modules/@code-style/eslint-config-cli": { + "resolved": "packages/eslint-config-cli", + "link": true }, - "code-style/node_modules/signal-exit": { - "version": "3.0.7", - "license": "ISC" + "node_modules/@code-style/eslint-config-esmodule": { + "resolved": "packages/eslint-config-esmodule", + "link": true }, - "code-style/node_modules/slice-ansi": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } + "node_modules/@code-style/eslint-config-jest": { + "resolved": "packages/eslint-config-jest", + "link": true }, - "code-style/node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "node_modules/@code-style/eslint-config-nest": { + "resolved": "packages/eslint-config-nest", + "link": true }, - "code-style/node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } + "node_modules/@code-style/eslint-config-nextjs": { + "resolved": "packages/eslint-config-nextjs", + "link": true }, - "code-style/node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" + "node_modules/@code-style/eslint-config-node": { + "resolved": "packages/eslint-config-node", + "link": true }, - "code-style/node_modules/source-map-js": { - "version": "1.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } + "node_modules/@code-style/eslint-config-react": { + "resolved": "packages/eslint-config-react", + "link": true }, - "code-style/node_modules/spdx-correct": { - "version": "3.2.0", - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } + "node_modules/@code-style/eslint-config-typescript": { + "resolved": "packages/eslint-config-typescript", + "link": true }, - "code-style/node_modules/spdx-exceptions": { - "version": "2.3.0", - "license": "CC-BY-3.0" + "node_modules/@code-style/eslint-npm-hoist-packages": { + "resolved": "packages/eslint-npm-hoist-packages", + "link": true }, - "code-style/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } + "node_modules/@code-style/eslint-npm-hoist-packages-esmodule": { + "resolved": "packages/eslint-npm-hoist-packages-esmodule", + "link": true }, - "code-style/node_modules/spdx-license-ids": { - "version": "3.0.13", - "license": "CC0-1.0" + "node_modules/@code-style/eslint-npm-hoist-packages-jest": { + "resolved": "packages/eslint-npm-hoist-packages-jest", + "link": true }, - "code-style/node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", + "node_modules/@code-style/eslint-npm-hoist-packages-nextjs": { + "resolved": "packages/eslint-npm-hoist-packages-nextjs", + "link": true + }, + "node_modules/@code-style/eslint-npm-hoist-packages-node": { + "resolved": "packages/eslint-npm-hoist-packages-node", + "link": true + }, + "node_modules/@code-style/eslint-npm-hoist-packages-react": { + "resolved": "packages/eslint-npm-hoist-packages-react", + "link": true + }, + "node_modules/@code-style/eslint-npm-hoist-packages-typescript": { + "resolved": "packages/eslint-npm-hoist-packages-typescript", + "link": true + }, + "node_modules/@code-style/eslint-plugin-nest": { + "resolved": "packages/eslint-plugin-nest", + "link": true + }, + "node_modules/@code-style/jest-configs": { + "resolved": "packages/jest-configs", + "link": true + }, + "node_modules/@code-style/rubocop-configs": { + "resolved": "packages/rubocop-config", + "link": true + }, + "node_modules/@code-style/stylelint-config": { + "resolved": "packages/stylelint-config", + "link": true + }, + "node_modules/@code-style/stylelint-config-scss": { + "resolved": "packages/stylelint-config-scss", + "link": true + }, + "node_modules/@code-style/typescript-configs": { + "resolved": "packages/typescript-configs", + "link": true + }, + "node_modules/@code-style/utils": { + "resolved": "utils", + "link": true + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "devOptional": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "code-style/node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "code-style/node_modules/strip-indent": { - "version": "3.0.0", - "license": "MIT", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "devOptional": true, "dependencies": { - "min-indent": "^1.0.0" - }, + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.1.tgz", + "integrity": "sha512-ubEkAaTfVZa+WwGhs5jbo5Xfqpeaybr/RvWzvFxRs4jfq16wH8l8Ty/QEEpINxll4xhuGfdMbipRyz5QZh9+FA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": ">=8" + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.2.4" } }, - "code-style/node_modules/style-search": { - "version": "0.1.0", - "license": "ISC" + "node_modules/@csstools/css-tokenizer": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.2.4.tgz", + "integrity": "sha512-PuWRAewQLbDhGeTvFuq2oClaSCKPIBmHyIobCV39JHRYN0byDcUWJl5baPeNUcqrjtdMNqFooE0FGl31I3JOqw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": "^14 || ^16 || >=18" + } }, - "code-style/node_modules/stylelint": { - "version": "14.16.1", - "license": "MIT", - "dependencies": { - "@csstools/selector-specificity": "^2.0.2", - "balanced-match": "^2.0.0", - "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", - "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", - "global-modules": "^2.0.0", - "globby": "^11.1.0", - "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", - "imurmurhash": "^0.1.4", - "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", - "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0", - "resolve-from": "^5.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", - "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" - }, - "bin": { - "stylelint": "bin/stylelint.js" - }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.9.tgz", + "integrity": "sha512-qqGuFfbn4rUmyOB0u8CVISIp5FfJ5GAR3mBrZ9/TKndHakdnm6pY0L/fbLcpPnrzwCyyTEZl1nUcXAYHEWneTA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": "^14 || ^16 || >=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4" } }, - "code-style/node_modules/stylelint-prettier": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.0" - }, + "node_modules/@csstools/selector-specificity": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.0.3.tgz", + "integrity": "sha512-KEPNw4+WW5AVEIyzC80rTbWEUatTW2lXpN8+8ILC8PiPeWPjwUzrPZDIOZ2wwqDmeqOYTdSGyL3+vE5GC3FB3Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14 || ^16 || >=18" }, "peerDependencies": { - "prettier": ">=2.0.0", - "stylelint": ">=14.0.0" + "postcss-selector-parser": "^6.0.13" } }, - "code-style/node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "license": "MIT" - }, - "code-style/node_modules/stylelint/node_modules/resolve-from": { - "version": "5.0.0", - "license": "MIT", - "engines": { - "node": ">=8" + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, - "code-style/node_modules/supports-hyperlinks": { - "version": "2.3.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, + "node_modules/@esbuild/android-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.18.tgz", + "integrity": "sha512-5GT+kcs2WVGjVs7+boataCkO5Fg0y4kCjzkB5bAip7H4jfnOS3dA6KPiww9W1OEKTKeAcUVhdZGvgI65OXmUnw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "code-style/node_modules/supports-hyperlinks/node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", + "node_modules/@esbuild/linux-loong64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.18.tgz", + "integrity": "sha512-L4jVKS82XVhw2nvzLg/19ClLWg0y27ulRwuP7lcyL6AbUWB5aPglXY3M21mauDQMDfRLs8cQmeT03r/+X3cZYQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "code-style/node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", + "node_modules/@eslint-community/eslint-plugin-eslint-comments": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-4.3.0.tgz", + "integrity": "sha512-6e93KtgsndNkvwCCa07LOQJSwzzLLxwrFll3+huyFoiiQXWG0KBcmo0Q1bVgYQQDLfWOOZl2VPBsXqZL6vHIBQ==", "dependencies": { - "has-flag": "^4.0.0" + "escape-string-regexp": "^4.0.0", + "ignore": "^5.2.4" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, - "code-style/node_modules/svg-tags": { - "version": "1.0.0" - }, - "code-style/node_modules/table": { - "version": "6.8.1", - "license": "BSD-3-Clause", + "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": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=10.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "code-style/node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "license": "MIT", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.0.2.tgz", + "integrity": "sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==", + "dev": true, + "peer": true, "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "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": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "url": "https://opencollective.com/eslint" } }, - "code-style/node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "license": "MIT" + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } }, - "code-style/node_modules/trim-newlines": { - "version": "3.0.1", - "license": "MIT", + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, "engines": { - "node": ">=8" + "node": ">=10.10.0" } }, - "code-style/node_modules/type-fest": { - "version": "0.18.1", - "license": "(MIT OR CC0-1.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": ">=10" + "node": ">=12.22" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "code-style/node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" + "node_modules/@humanwhocodes/momoa": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@humanwhocodes/momoa/-/momoa-2.0.4.tgz", + "integrity": "sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==", + "engines": { + "node": ">=10.10.0" + } }, - "code-style/node_modules/v8-compile-cache": { - "version": "2.3.0", - "license": "MIT" + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==" }, - "code-style/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "license": "Apache-2.0", + "node_modules/@inquirer/checkbox": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-1.5.2.tgz", + "integrity": "sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA==", "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "figures": "^3.2.0" + }, + "engines": { + "node": ">=14.18.0" } }, - "code-style/node_modules/write-file-atomic": { - "version": "4.0.2", - "license": "ISC", + "node_modules/@inquirer/confirm": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-2.0.17.tgz", + "integrity": "sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==", "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.7" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "chalk": "^4.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": ">=14.18.0" } }, - "code-style/node_modules/yaml": { - "version": "1.10.2", - "license": "ISC", + "node_modules/@inquirer/core": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-6.0.0.tgz", + "integrity": "sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==", + "dependencies": { + "@inquirer/type": "^1.1.6", + "@types/mute-stream": "^0.0.4", + "@types/node": "^20.10.7", + "@types/wrap-ansi": "^3.0.0", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "cli-spinners": "^2.9.2", + "cli-width": "^4.1.0", + "figures": "^3.2.0", + "mute-stream": "^1.0.0", + "run-async": "^3.0.0", + "signal-exit": "^4.1.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, "engines": { - "node": ">= 6" + "node": ">=14.18.0" } }, - "code-style/node_modules/yargs-parser": { - "version": "20.2.9", - "license": "ISC", + "node_modules/@inquirer/core/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==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, - "eslint-config": { - "name": "@dudeofawesome/eslint-config", - "version": "1.3.0", - "license": "MIT", + "node_modules/@inquirer/editor": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-1.2.15.tgz", + "integrity": "sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ==", "dependencies": { - "@shopify/eslint-plugin": "^42.0.1", - "eslint": "^8.11.0" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "chalk": "^4.1.2", + "external-editor": "^3.1.0" }, - "peerDependencies": { - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1" + "engines": { + "node": ">=14.18.0" } }, - "eslint-config-jest": { - "name": "@dudeofawesome/eslint-config-jest", - "version": "1.3.0", - "license": "MIT", + "node_modules/@inquirer/expand": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-1.1.16.tgz", + "integrity": "sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ==", "dependencies": { - "@shopify/eslint-plugin": "^42.0.1", - "eslint": "^8.11.0" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "chalk": "^4.1.2", + "figures": "^3.2.0" }, - "peerDependencies": { - "@dudeofawesome/eslint-config": "^1.0.0", - "eslint-config-prettier": "^8.5.0", - "eslint-plugin-prettier": "^4.2.1", - "prettier": "^2.7.1" + "engines": { + "node": ">=14.18.0" } }, - "eslint-config-node": { - "name": "@dudeofawesome/eslint-config-node", - "version": "1.3.0", - "license": "MIT", + "node_modules/@inquirer/input": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-1.2.16.tgz", + "integrity": "sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g==", "dependencies": { - "@shopify/eslint-plugin": "^42.0.1" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "chalk": "^4.1.2" }, - "peerDependencies": { - "@dudeofawesome/eslint-config": "^1.0.0" + "engines": { + "node": ">=14.18.0" } }, - "eslint-config-typescript": { - "name": "@dudeofawesome/eslint-config-typescript", - "version": "1.3.0", - "license": "MIT", + "node_modules/@inquirer/password": { + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-1.1.16.tgz", + "integrity": "sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw==", "dependencies": { - "@typescript-eslint/eslint-plugin": "^5.30.7", - "@typescript-eslint/parser": "^5.30.7" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2" }, - "peerDependencies": { - "@dudeofawesome/eslint-config": "^1.0.0", - "typescript": "^4.7.4" + "engines": { + "node": ">=14.18.0" } }, - "eslint-config-typescript/node_modules/typescript": { - "version": "4.9.5", - "license": "Apache-2.0", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "node_modules/@inquirer/prompts": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-3.3.2.tgz", + "integrity": "sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ==", + "dependencies": { + "@inquirer/checkbox": "^1.5.2", + "@inquirer/confirm": "^2.0.17", + "@inquirer/core": "^6.0.0", + "@inquirer/editor": "^1.2.15", + "@inquirer/expand": "^1.1.16", + "@inquirer/input": "^1.2.16", + "@inquirer/password": "^1.1.16", + "@inquirer/rawlist": "^1.2.16", + "@inquirer/select": "^1.3.3" }, "engines": { - "node": ">=4.2.0" + "node": ">=14.18.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==", - "peer": true, + "node_modules/@inquirer/rawlist": { + "version": "1.2.16", + "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-1.2.16.tgz", + "integrity": "sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ==", "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "chalk": "^4.1.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=14.18.0" } }, - "node_modules/@babel/code-frame": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", - "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "node_modules/@inquirer/select": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-1.3.3.tgz", + "integrity": "sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg==", "dependencies": { - "@babel/highlight": "^7.18.6" + "@inquirer/core": "^6.0.0", + "@inquirer/type": "^1.1.6", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "figures": "^3.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=14.18.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", - "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", - "peer": true, + "node_modules/@inquirer/type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-1.3.0.tgz", + "integrity": "sha512-RW4Zf6RCTnInRaOZuRHTqAUl+v6VJuQGglir7nW2BkT3OXOphMhkIFhvFRjorBx2l0VwtC/M4No8vYR65TdN9Q==", "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/core": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", - "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", - "peer": true, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.3", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.3", - "@babel/types": "^7.21.3", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" }, "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" + "node": ">=12" } }, - "node_modules/@babel/eslint-parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz", - "integrity": "sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==", - "dependencies": { - "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", - "eslint-visitor-keys": "^2.1.0", - "semver": "^6.3.0" - }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": ">=7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@babel/eslint-plugin": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/eslint-plugin/-/eslint-plugin-7.19.1.tgz", - "integrity": "sha512-ElGPkQPapKMa3zVqXHkZYzuL7I5LbRw9UWBUArgWsdWDDb9XcACqOpBib5tRPA9XvbVZYrFUkoQPbiJ4BFvu4w==", - "dependencies": { - "eslint-rule-composer": "^0.3.0" - }, + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "engines": { - "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/eslint-parser": ">=7.11.0", - "eslint": ">=7.5.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@babel/generator": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", - "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", - "peer": true, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dependencies": { - "@babel/types": "^7.21.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", - "peer": true, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", - "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", - "peer": true, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-validator-option": "^7.18.6", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=6.9.0" + "node": ">=12" }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - }, - "engines": { - "node": ">=6.9.0" + "sprintf-js": "~1.0.2" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config/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": { - "@babel/types": "^7.18.6" + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", - "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config/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==", "dependencies": { - "@babel/types": "^7.18.6" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, - "engines": { - "node": ">=6.9.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config/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": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "p-locate": "^4.1.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config/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": { - "@babel/types": "^7.20.2" + "p-try": "^2.0.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config/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": { - "@babel/types": "^7.18.6" + "p-limit": "^2.2.0" }, "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "peer": true, + "node_modules/@istanbuljs/load-nyc-config/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==", "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "engines": { - "node": ">=6.9.0" + "node": ">=8" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "peer": true, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "peer": true, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/parser": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", - "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", - "peer": true, - "bin": { - "parser": "bin/babel-parser.js" + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=6.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "peer": true, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/traverse": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", - "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", - "peer": true, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.21.3", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.3", - "@babel/types": "^7.21.3", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=6.9.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@babel/types": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", - "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", - "peer": true, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dependencies": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "engines": { - "node": ">=6.9.0" + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@dudeofawesome/code-style": { - "resolved": "code-style", - "link": true - }, - "node_modules/@dudeofawesome/eslint-config": { - "resolved": "eslint-config", - "link": true - }, - "node_modules/@dudeofawesome/eslint-config-jest": { - "resolved": "eslint-config-jest", - "link": true - }, - "node_modules/@dudeofawesome/eslint-config-node": { - "resolved": "eslint-config-node", - "link": true - }, - "node_modules/@dudeofawesome/eslint-config-typescript": { - "resolved": "eslint-config-typescript", - "link": true - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", - "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", + "node_modules/@jest/reporters/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "*" }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.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" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dependencies": { - "type-fest": "^0.20.2" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">=10.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.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==", - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "peer": true, + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "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==", - "peer": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "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==", - "peer": true + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "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==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@lukeed/csprng": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@lukeed/csprng/-/csprng-1.1.0.tgz", + "integrity": "sha512-Z7C/xXCiGWsg0KuKsHTKJxbWhpI3Vs5GwLfOean7MGyVFGqdRgBbAjOCh6u4bbjPc/8MJ2pZmK/0DLdCbivLDA==", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@nestjs/common": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-10.3.7.tgz", + "integrity": "sha512-gKFtFzcJznrwsRYjtNZoPAvSOPYdNgxbTYoAyLTpoy393cIKgLmJTHu6ReH8/qIB9AaZLdGaFLkx98W/tFWFUw==", + "peer": true, + "dependencies": { + "iterare": "1.2.1", + "tslib": "2.6.2", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "class-transformer": "*", + "class-validator": "*", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "class-transformer": { + "optional": true + }, + "class-validator": { + "optional": true + } + } + }, + "node_modules/@nestjs/core": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-10.3.7.tgz", + "integrity": "sha512-hsdlnfiQ3kgqHL5k7js3CU0PV7hBJVi+LfFMgCkoagRxNMf67z0GFGeOV2jk5d65ssB19qdYsDa1MGVuEaoUpg==", + "hasInstallScript": true, "peer": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@nuxtjs/opencollective": "0.3.2", + "fast-safe-stringify": "2.1.1", + "iterare": "1.2.1", + "path-to-regexp": "3.2.0", + "tslib": "2.6.2", + "uid": "2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/nest" + }, + "peerDependencies": { + "@nestjs/common": "^10.0.0", + "@nestjs/microservices": "^10.0.0", + "@nestjs/platform-express": "^10.0.0", + "@nestjs/websockets": "^10.0.0", + "reflect-metadata": "^0.1.12 || ^0.2.0", + "rxjs": "^7.1.0" + }, + "peerDependenciesMeta": { + "@nestjs/microservices": { + "optional": true + }, + "@nestjs/platform-express": { + "optional": true + }, + "@nestjs/websockets": { + "optional": true + } } }, - "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { - "version": "5.1.1-v1", - "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", - "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "node_modules/@next/env": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/env/-/env-14.2.1.tgz", + "integrity": "sha512-qsHJle3GU3CmVx7pUoXcghX4sRN+vINkbLdH611T8ZlsP//grzqVW87BSUgOZeSAD4q7ZdZicdwNe/20U2janA==", + "peer": true + }, + "node_modules/@next/eslint-plugin-next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-14.2.1.tgz", + "integrity": "sha512-Fp+mthEBjkn8r9qd6o4JgxKp0IDEzW0VYHD8ZC05xS5/lFNwHKuOdr2kVhWG7BQCO9L6eeepshM1Wbs2T+LgSg==", "dependencies": { - "eslint-scope": "5.1.1" + "glob": "10.3.10" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.2.1.tgz", + "integrity": "sha512-kGjnjcIJehEcd3rT/3NAATJQndAEELk0J9GmGMXHSC75TMnvpOhONcjNHbjtcWE5HUQnIHy5JVkatrnYm1QhVw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.2.1.tgz", + "integrity": "sha512-dAdWndgdQi7BK2WSXrx4lae7mYcOYjbHJUhvOUnJjMNYrmYhxbbvJ2xElZpxNxdfA6zkqagIB9He2tQk+l16ew==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.2.1.tgz", + "integrity": "sha512-2ZctfnyFOGvTkoD6L+DtQtO3BfFz4CapoHnyLTXkOxbZkVRgg3TQBUjTD/xKrO1QWeydeo8AWfZRg8539qNKrg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.2.1.tgz", + "integrity": "sha512-jazZXctiaanemy4r+TPIpFP36t1mMwWCKMsmrTRVChRqE6putyAxZA4PDujx0SnfvZHosjdkx9xIq9BzBB5tWg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.2.1.tgz", + "integrity": "sha512-VjCHWCjsAzQAAo8lkBOLEIkBZFdfW+Z18qcQ056kL4KpUYc8o59JhLDCBlhg+hINQRgzQ2UPGma2AURGOH0+Qg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-14.2.1.tgz", + "integrity": "sha512-7HZKYKvAp4nAHiHIbY04finRqjeYvkITOGOurP1aLMexIFG/1+oCnqhGogBdc4lao/lkMW1c+AkwWSzSlLasqw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.2.1.tgz", + "integrity": "sha512-YGHklaJ/Cj/F0Xd8jxgj2p8po4JTCi6H7Z3Yics3xJhm9CPIqtl8erlpK1CLv+HInDqEWfXilqatF8YsLxxA2Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-ia32-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.2.1.tgz", + "integrity": "sha512-o+ISKOlvU/L43ZhtAAfCjwIfcwuZstiHVXq/BDsZwGqQE0h/81td95MPHliWCnFoikzWcYqh+hz54ZB2FIT8RA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.1.tgz", + "integrity": "sha512-GmRoTiLcvCLifujlisknv4zu9/C4i9r0ktsA8E51EMqJL4bD4CpO7lDYr7SrUxCR0tS4RVcrqKmCak24T0ohaw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "engines": { + "node": ">= 10" } }, "node_modules/@nodelib/fs.scandir": { @@ -1598,80 +1907,317 @@ "node": ">= 8" } }, - "node_modules/@shopify/eslint-plugin": { - "version": "42.0.3", - "resolved": "https://registry.npmjs.org/@shopify/eslint-plugin/-/eslint-plugin-42.0.3.tgz", - "integrity": "sha512-Vve7bpv3qeiDSIViHx1v0oJ6jDSiwqFzUlJZXIcgU/AcQTMEVYHozhxnNO02XTVeN1CJS3hiMjq2ruZdBiKWPw==", + "node_modules/@nuxtjs/opencollective": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.3.2.tgz", + "integrity": "sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==", + "peer": true, "dependencies": { - "@babel/eslint-parser": "^7.16.3", - "@babel/eslint-plugin": "^7.14.5", - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "change-case": "^4.1.2", - "common-tags": "^1.8.2", - "doctrine": "^2.1.0", - "eslint-config-prettier": "^8.3.0", - "eslint-module-utils": "^2.7.1", - "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "^25.3.0", - "eslint-plugin-jest-formatting": "^3.1.0", - "eslint-plugin-jsx-a11y": "^6.5.0", - "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^4.1.0", - "eslint-plugin-promise": "^6.0.0", - "eslint-plugin-react": "^7.30.0", - "eslint-plugin-react-hooks": "^4.3.0", - "eslint-plugin-sort-class-members": "^1.14.0", - "jsx-ast-utils": "^3.2.1", - "pkg-dir": "^5.0.0", - "pluralize": "^8.0.0" + "chalk": "^4.1.0", + "consola": "^2.15.0", + "node-fetch": "^2.6.1" + }, + "bin": { + "opencollective": "bin/opencollective.js" + }, + "engines": { + "node": ">=8.0.0", + "npm": ">=5.0.0" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "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/@prettier/plugin-ruby": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@prettier/plugin-ruby/-/plugin-ruby-4.0.4.tgz", + "integrity": "sha512-lCpvfS/dQU5WrwN3AQ5vR8qrvj2h5gE41X08NNzAAXvHdM4zwwGRcP2sHSxfu6n6No+ljWCVx95NvJPFTTjCTg==", "peerDependencies": { - "eslint": "^8.3.0" + "prettier": "^3.0.0" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "peer": true + }, + "node_modules/@swc/helpers": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.5.tgz", + "integrity": "sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==", + "peer": true, + "dependencies": { + "@swc/counter": "^0.1.3", + "tslib": "^2.4.0" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "devOptional": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "devOptional": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "devOptional": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "devOptional": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/common-tags": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/@types/common-tags/-/common-tags-1.8.4.tgz", + "integrity": "sha512-S+1hLDJPjWNDhcGxsxEbepzaxWqURP/o+3cP4aa2w7yBXgdcmKGQtZzP8JbyfOd0m+33nh+8+kvxYE2UJtBDkg==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.56.9", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.9.tgz", + "integrity": "sha512-W4W3KcqzjJ0sHg2vAq9vfml6OhsJ53TcUjUqfzzZf/EChUtwspszj/S0pzMxnfRcO55/iGq47dscXw71Fxc4Zg==", + "devOptional": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "devOptional": true + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" + "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/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" + }, + "node_modules/@types/mute-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/mute-stream/-/mute-stream-0.0.4.tgz", + "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "20.12.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", + "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.77", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.77.tgz", + "integrity": "sha512-CUT9KUUF+HytDM7WiXKLF9qUSg4tGImwy4FXTlfEDPEkkNUzJ7rVFolYweJ9fS1ljoIaP7M7Rdjc5eUm/Yu5AA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==" + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==" + }, + "node_modules/@types/wrap-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz", + "integrity": "sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==" + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "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": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1679,90 +2225,67 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/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" + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" }, "engines": { - "node": ">=10" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" + "node": "^16.0.0 || >=18.0.0" }, - "bin": { - "semver": "bin/semver.js" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, - "engines": { - "node": ">=10" + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/eslint-plugin/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/@typescript-eslint/experimental-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.56.0.tgz", - "integrity": "sha512-sxWuj0eO5nItmKgZmsBbChVt90EhfkuncDCPbLAVeEJ+SCjXMcZN3AhhNbxed7IeGJ4XwsdL3/FMvD4r+FLqqA==", + "node_modules/@typescript-eslint/rule-tester": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/rule-tester/-/rule-tester-6.21.0.tgz", + "integrity": "sha512-twxQo4He8+AQ/YG70Xt7Fl/ImBLpi7qElxHN6/aK+U4z97JsITCG7DdIIUw5M+qKtDMCYkZCEE2If8dnHI7jWA==", + "dev": true, "dependencies": { - "@typescript-eslint/utils": "5.56.0" + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "ajv": "^6.10.0", + "lodash.merge": "4.6.2", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@eslint/eslintrc": ">=2", + "eslint": ">=8" } }, - "node_modules/@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz", + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==", "dependencies": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", - "debug": "^4.3.4" + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", - "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1770,24 +2293,24 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", "dependencies": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1796,11 +2319,11 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz", + "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1808,20 +2331,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz", + "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==", "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1833,119 +2357,77 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/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==", + "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": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@typescript-eslint/typescript-estree/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/@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/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/@typescript-eslint/utils/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/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/@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz", + "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==", "dependencies": { - "@typescript-eslint/types": "5.56.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.21.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -1961,6 +2443,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "devOptional": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1976,6 +2467,20 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "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==", + "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", @@ -1985,50 +2490,75 @@ } }, "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==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "devOptional": true + }, "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/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "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==", + "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.2", - "is-array-buffer": "^3.0.1" + "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.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", + "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": { @@ -2046,14 +2576,52 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "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.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.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "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.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2064,13 +2632,13 @@ } }, "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==", + "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.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2080,27 +2648,70 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "node_modules/array.prototype.toreversed": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz", + "integrity": "sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==", "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" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.3.tgz", + "integrity": "sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.3", + "es-errors": "^1.1.0", + "es-shim-unscopables": "^1.0.2" + } + }, + "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/ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "engines": { + "node": ">=8" + } }, "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==", + "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" }, @@ -2109,19 +2720,128 @@ } }, "node_modules/axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz", + "integrity": "sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==", "engines": { "node": ">=4" } }, "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/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/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dependencies": { - "deep-equal": "^2.0.5" + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/balanced-match": { @@ -2129,6 +2849,24 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/better-ajv-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-1.2.0.tgz", + "integrity": "sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "@humanwhocodes/momoa": "^2.0.2", + "chalk": "^4.1.2", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0 < 4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "ajv": "4.11.8 - 8" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2150,9 +2888,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "funding": [ { "type": "opencollective", @@ -2161,14 +2899,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], - "peer": true, "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2177,40 +2918,106 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "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==", + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "fast-json-stable-stringify": "2.x" }, - "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": ">= 6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" + "node-int64": "^0.4.0" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001468", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz", - "integrity": "sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==", - "funding": [ + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "peer": true + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "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.1.0", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.1.0.tgz", + "integrity": "sha512-SW9lzGTLvWTP1AY8xeAMZimqDrIaSdLQUcVr9DMef51niJ022Ri87SwRRKYm4A6iHfkPaiVUu/Duw2Wc4J7kKg==", + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "peer": true, + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001609", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001609.tgz", + "integrity": "sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==", + "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" @@ -2218,64 +3025,132 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } - ], - "peer": true + ] }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "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": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" + }, + "node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "peer": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dependencies": { - "camel-case": "^4.1.2", - "capital-case": "^1.0.4", - "constant-case": "^3.0.4", - "dot-case": "^3.0.4", - "header-case": "^2.0.4", - "no-case": "^3.0.4", - "param-case": "^3.0.4", - "pascal-case": "^3.1.2", - "path-case": "^3.0.4", - "sentence-case": "^3.0.4", - "snake-case": "^3.0.4", - "tslib": "^2.0.3" + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" } }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, "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==", + "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.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + "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/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" }, "node_modules/common-tags": { "version": "1.8.2", @@ -2290,22 +3165,110 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "node_modules/concurrently": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", + "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "date-fns": "^2.30.0", + "lodash": "^4.17.21", + "rxjs": "^7.8.1", + "shell-quote": "^1.8.1", + "spawn-command": "0.0.2", + "supports-color": "^8.1.1", + "tree-kill": "^1.2.2", + "yargs": "^17.7.2" + }, + "bin": { + "conc": "dist/bin/concurrently.js", + "concurrently": "dist/bin/concurrently.js" + }, + "engines": { + "node": "^14.13.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" + } + }, + "node_modules/concurrently/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==", "peer": 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/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "devOptional": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2319,66 +3282,88 @@ "node": ">= 8" } }, + "node_modules/css-functions-list": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", + "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true + }, "node_modules/damerau-levenshtein": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "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": { - "ms": "2.1.2" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { - "node": ">=6.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "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.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" + "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/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-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==", + "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": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2387,87 +3372,252 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, "dependencies": { - "path-type": "^4.0.0" + "@babel/runtime": "^7.21.0" }, "engines": { - "node": ">=8" + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" } }, - "node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { - "esutils": "^2.0.2" + "ms": "2.1.2" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "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/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "devOptional": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, "node_modules/electron-to-chromium": { - "version": "1.4.334", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.334.tgz", - "integrity": "sha512-laZ1odk+TRen6q0GeyQx/JEkpD3iSZT7ewopCpKqg9bTjP1l8XRfU3Bg20CFjNPZkp5+NDBl3iqd4o/kPO+Vew==", - "peer": true + "version": "1.4.736", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.736.tgz", + "integrity": "sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "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==", + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "engines": { + "node": ">=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": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", + "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.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", + "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": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", + "hasown": "^2.0.2", + "internal-slot": "^1.0.7", + "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", + "is-data-view": "^1.0.1", + "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", + "is-shared-array-buffer": "^1.0.3", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "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", + "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.9" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -2476,44 +3626,79 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "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": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "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-iterator-helpers": { + "version": "1.0.18", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.18.tgz", + "integrity": "sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" + "internal-slot": "^1.0.7", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.1.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">= 0.4" + } + }, + "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.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "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.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "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.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "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": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -2532,188 +3717,544 @@ "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==", - "peer": true, + "node_modules/esbuild": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.15.18.tgz", + "integrity": "sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.15.18", + "@esbuild/linux-loong64": "0.15.18", + "esbuild-android-64": "0.15.18", + "esbuild-android-arm64": "0.15.18", + "esbuild-darwin-64": "0.15.18", + "esbuild-darwin-arm64": "0.15.18", + "esbuild-freebsd-64": "0.15.18", + "esbuild-freebsd-arm64": "0.15.18", + "esbuild-linux-32": "0.15.18", + "esbuild-linux-64": "0.15.18", + "esbuild-linux-arm": "0.15.18", + "esbuild-linux-arm64": "0.15.18", + "esbuild-linux-mips64le": "0.15.18", + "esbuild-linux-ppc64le": "0.15.18", + "esbuild-linux-riscv64": "0.15.18", + "esbuild-linux-s390x": "0.15.18", + "esbuild-netbsd-64": "0.15.18", + "esbuild-openbsd-64": "0.15.18", + "esbuild-sunos-64": "0.15.18", + "esbuild-windows-32": "0.15.18", + "esbuild-windows-64": "0.15.18", + "esbuild-windows-arm64": "0.15.18" + } + }, + "node_modules/esbuild-android-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz", + "integrity": "sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6" + "node": ">=12" } }, - "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==", + "node_modules/esbuild-android-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.18.tgz", + "integrity": "sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=0.8.0" + "node": ">=12" } }, - "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "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.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", - "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", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "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.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, + "node_modules/esbuild-darwin-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.18.tgz", + "integrity": "sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" + "node_modules/esbuild-darwin-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.18.tgz", + "integrity": "sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "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/esbuild-freebsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.18.tgz", + "integrity": "sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "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/esbuild-freebsd-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.18.tgz", + "integrity": "sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dependencies": { - "debug": "^3.2.7" - }, + "node_modules/esbuild-linux-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.18.tgz", + "integrity": "sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "node": ">=12" } }, - "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/esbuild-linux-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.18.tgz", + "integrity": "sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/eslint-plugin-es": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", - "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", - "dependencies": { - "eslint-utils": "^2.0.0", - "regexpp": "^3.0.0" - }, + "node_modules/esbuild-linux-arm": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.18.tgz", + "integrity": "sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.18.tgz", + "integrity": "sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.18.tgz", + "integrity": "sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.18.tgz", + "integrity": "sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.18.tgz", + "integrity": "sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.18.tgz", + "integrity": "sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.18.tgz", + "integrity": "sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.18.tgz", + "integrity": "sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.18.tgz", + "integrity": "sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.18.tgz", + "integrity": "sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.18.tgz", + "integrity": "sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.15.18", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.18.tgz", + "integrity": "sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "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": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", + "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" }, "peerDependencies": { - "eslint": ">=4.19.1" + "eslint": ">=6.0.0" } }, - "node_modules/eslint-plugin-eslint-comments": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-eslint-comments/-/eslint-plugin-eslint-comments-3.2.0.tgz", - "integrity": "sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==", + "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-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": { - "escape-string-regexp": "^1.0.5", - "ignore": "^5.0.5" + "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.8.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz", + "integrity": "sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==", + "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.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.6.0.tgz", + "integrity": "sha512-I0AmeNgevgaTR7y2lrVCJmGYF0rjoznpDvqV/kIkZSZbZ8Rw3eu4cGlvBBULScfkSOCzqKbff5LR4CNrV7mZHA==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0", + "eslint-compat-utils": "^0.5.0" }, "engines": { - "node": ">=6.5.0" + "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ota-meshi" }, "peerDependencies": { - "eslint": ">=4.19.1" + "eslint": ">=8" } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz", + "integrity": "sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "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.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" @@ -2730,19 +4271,39 @@ "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-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-jest": { - "version": "25.7.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", - "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", "dependencies": { - "@typescript-eslint/experimental-utils": "^5.0.0" + "@typescript-eslint/utils": "^5.10.0" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { @@ -2753,171 +4314,102 @@ } } }, - "node_modules/eslint-plugin-jest-formatting": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest-formatting/-/eslint-plugin-jest-formatting-3.1.0.tgz", - "integrity": "sha512-XyysraZ1JSgGbLSDxjj5HzKKh0glgWf+7CkqxbTqb7zEhW7X2WHo5SBQ8cGhnszKN+2Lj3/oevBlHNbHezoc/A==", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": ">=0.8.0" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dependencies": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-node": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", - "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", - "dependencies": { - "eslint-plugin-es": "^3.0.0", - "eslint-utils": "^2.0.0", - "ignore": "^5.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.10.1", - "semver": "^6.1.0" - }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "engines": { - "node": ">=8.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": ">=5.16.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-prettier": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", - "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" }, "engines": { - "node": ">=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "peerDependencies": { - "eslint": ">=7.28.0", - "prettier": ">=2.0.0" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" }, "peerDependenciesMeta": { - "eslint-config-prettier": { + "typescript": { "optional": true } } }, - "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==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/eslint-plugin-sort-class-members": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sort-class-members/-/eslint-plugin-sort-class-members-1.16.0.tgz", - "integrity": "sha512-8l0IqUmoupk9PvO5D4I5zJqirVe9sax5Hpfv9xQmnrSpLYkc8BSYGnUjuHGMSSe4jKuC73NIr38kQv1tPbO+Xg==", - "engines": { - "node": ">=4.0.0" - }, - "peerDependencies": { - "eslint": ">=0.8.0" - } - }, - "node_modules/eslint-rule-composer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz", - "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==", - "engines": { - "node": ">=4.0.0" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-scope": { + "node_modules/eslint-plugin-jest/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", @@ -2929,7 +4421,7 @@ "node": ">=8.0.0" } }, - "node_modules/eslint-scope/node_modules/estraverse": { + "node_modules/eslint-plugin-jest/node_modules/estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", @@ -2937,178 +4429,377 @@ "node": ">=4.0" } }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "node_modules/eslint-plugin-json-files": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-json-files/-/eslint-plugin-json-files-4.1.0.tgz", + "integrity": "sha512-oK9SxvFp5vyq+cXo76Ily9rN/iPM2w8T6MtPgJAlKP2jfZeDdeD0qgTIGiMeHZjS0eURXs5Vn+KgYVh0e/u7pA==", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "ajv": "^8.2.0", + "better-ajv-errors": "^1.2.0", + "requireindex": "^1.2.0", + "semver": "^7.0.0", + "sort-package-json": "^1.22.1" }, "engines": { - "node": ">=6" + "node": ">=18.12" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-plugin-json-files/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "node_modules/eslint-plugin-json-files/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.8.0.tgz", + "integrity": "sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "aria-query": "^5.3.0", + "array-includes": "^3.1.7", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "=4.7.0", + "axobject-query": "^3.2.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "es-iterator-helpers": "^1.0.15", + "hasown": "^2.0.0", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7" + }, "engines": { - "node": ">=4" + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "node_modules/eslint-plugin-jsx-a11y/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/eslint-plugin-n": { + "version": "16.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.6.2.tgz", + "integrity": "sha512-6TyDmZ1HXoFQXnhCTUjVFULReoBPOAjpuiKELMkeP40yffI/1ZRO+d9ug/VC6fqISo2WkuIBk3cvuRPALaWlOQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.5.0", + "get-tsconfig": "^4.7.0", + "globals": "^13.24.0", + "ignore": "^5.2.4", + "is-builtin-module": "^3.2.1", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, "engines": { - "node": ">=10" + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "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==", + "node_modules/eslint-plugin-n/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dependencies": { - "color-convert": "^2.0.1" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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" - }, + "node_modules/eslint-plugin-n/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/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/eslint-plugin-prettier": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.3.tgz", + "integrity": "sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==", "dependencies": { - "color-name": "~1.1.4" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.6" }, "engines": { - "node": ">=7.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } } }, - "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-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/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" + "node_modules/eslint-plugin-react": { + "version": "7.34.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.34.1.tgz", + "integrity": "sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==", + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlast": "^1.2.4", + "array.prototype.flatmap": "^1.3.2", + "array.prototype.toreversed": "^1.1.2", + "array.prototype.tosorted": "^1.1.3", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.17", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.7", + "object.fromentries": "^2.0.7", + "object.hasown": "^1.1.3", + "object.values": "^1.1.7", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.10" }, "engines": { - "node": ">=6.0.0" + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" } }, - "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==", + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", "engines": { "node": ">=10" }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/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-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "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/sindresorhus" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-react/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/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "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/node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "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/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "node_modules/eslint/node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dependencies": { - "type-fest": "^0.20.2" + "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": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/eslint/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": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "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==", + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dependencies": { - "has-flag": "^4.0.0" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "dev": true, + "peer": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.11.3", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^4.0.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "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": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz", + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==", + "dev": true, + "peer": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.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==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" } }, "node_modules/esquery": { @@ -3149,20 +4840,83 @@ "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-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==" - }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/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==" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "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==", + "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-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==" + }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "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", @@ -3195,14 +4949,58 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "peer": true + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "engines": { + "node": ">= 4.9.1" + } + }, "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "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/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/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/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -3241,11 +5039,12 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -3253,9 +5052,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + "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", @@ -3265,25 +5064,57 @@ "is-callable": "^1.1.3" } }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "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.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "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.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -3304,31 +5135,74 @@ "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==", - "peer": true, "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "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-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", + "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "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.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4" }, "engines": { "node": ">= 0.4" @@ -3337,20 +5211,41 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.3.tgz", + "integrity": "sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/git-hooks-list": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-1.0.3.tgz", + "integrity": "sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3367,13 +5262,74 @@ "node": ">=10.13.0" } }, + "node_modules/glob/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/glob/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, "peer": true, "engines": { - "node": ">=4" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { @@ -3409,6 +5365,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==" + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -3420,21 +5381,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==" + "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/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/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", @@ -3445,28 +5400,28 @@ } }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "engines": { - "node": ">=4" + "node": ">=8" } }, "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==", + "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": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" }, "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==", + "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" }, @@ -3486,11 +5441,11 @@ } }, "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==", + "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.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -3499,23 +5454,66 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "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/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" + "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==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } }, + "node_modules/immutable": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", + "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "peer": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -3531,6 +5529,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3553,26 +5569,31 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "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==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { "node": ">= 0.4" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "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", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -3581,14 +5602,20 @@ "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3620,6 +5647,20 @@ "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", @@ -3632,11 +5673,25 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-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": { - "has": "^1.0.3" + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3664,6 +5719,47 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3676,17 +5772,20 @@ } }, "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "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==", + "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" }, @@ -3724,6 +5823,22 @@ "node": ">=8" } }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "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", @@ -3740,24 +5855,41 @@ } }, "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "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==", + "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.2" + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-string": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", @@ -3787,15 +5919,11 @@ } }, "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==", + "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": { - "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" + "which-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" @@ -3805,9 +5933,12 @@ } }, "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3824,12 +5955,15 @@ } }, "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3845,581 +5979,3928 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "engines": { + "node": ">=8" } }, - "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==", + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", "dependencies": { - "argparse": "^2.0.1" + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=10" } }, - "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "peer": true, - "bin": { - "jsesc": "bin/jsesc" + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" } }, - "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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "peer": true, - "bin": { - "json5": "lib/cli.js" + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" }, "engines": { - "node": ">=6" + "node": ">=10" } }, - "node_modules/jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dependencies": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" - }, - "node_modules/language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dependencies": { - "language-subtag-registry": "~0.3.2" + "node_modules/iterare": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz", + "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==", + "peer": 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==", + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" } }, - "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==", + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dependencies": { - "p-locate": "^5.0.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "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/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" }, "bin": { - "loose-envify": "cli.js" + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dependencies": { - "tslib": "^2.0.3" + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", - "peer": true, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, "engines": { - "node": ">= 8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=8.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/jest-config/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "brace-expansion": "^1.1.7" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" - } - }, - "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" + "url": "https://github.com/sponsors/isaacs" } }, - "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": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "peer": true - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dependencies": { + "detect-newline": "^3.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "fsevents": "^2.3.2" } }, - "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" }, "engines": { - "node": ">= 0.4" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } } }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dependencies": { - "wrappy": "1" + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dependencies": { - "yocto-queue": "^0.1.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dependencies": { - "p-limit": "^3.0.2" + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "node_modules/jest-runtime/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/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" + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { - "node": ">=6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "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==", + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, "engines": { - "node": ">=8" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dependencies": { + "has-flag": "^4.0.0" + }, "engines": { - "node": ">=8.6" + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "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": { - "find-up": "^5.0.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=10" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "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-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": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "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/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz", + "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "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/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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "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.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "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/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "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.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "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/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/next": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/next/-/next-14.2.1.tgz", + "integrity": "sha512-SF3TJnKdH43PMkCcErLPv+x/DY1YCklslk3ZmwaVoyUfDgHKexuKlf9sEfBQ69w+ue8jQ3msLb+hSj1T19hGag==", + "peer": true, + "dependencies": { + "@next/env": "14.2.1", + "@swc/helpers": "0.5.5", + "busboy": "1.6.0", + "caniuse-lite": "^1.0.30001579", + "graceful-fs": "^4.2.11", + "postcss": "8.4.31", + "styled-jsx": "5.1.1" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=18.17.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "14.2.1", + "@next/swc-darwin-x64": "14.2.1", + "@next/swc-linux-arm64-gnu": "14.2.1", + "@next/swc-linux-arm64-musl": "14.2.1", + "@next/swc-linux-x64-gnu": "14.2.1", + "@next/swc-linux-x64-musl": "14.2.1", + "@next/swc-win32-arm64-msvc": "14.2.1", + "@next/swc-win32-ia32-msvc": "14.2.1", + "@next/swc-win32-x64-msvc": "14.2.1" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.41.2", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "peer": 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-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "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-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "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.entries": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz", + "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "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.hasown": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.4.tgz", + "integrity": "sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==", + "dependencies": { + "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.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/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "engines": { + "node": ">=0.10.0" + } + }, + "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/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/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-equal": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/path-equal/-/path-equal-1.2.5.tgz", + "integrity": "sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==", + "dev": true + }, + "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": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-to-regexp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==", + "peer": true + }, + "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/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "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==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/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/pkg-dir/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/pkg-dir/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/pkg-dir/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/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/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "peer": true, + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==" + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", + "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz", + "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sorting": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-8.0.2.tgz", + "integrity": "sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==", + "peerDependencies": { + "postcss": "^8.4.20" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "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.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/prettier-plugin-packagejson": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/prettier-plugin-packagejson/-/prettier-plugin-packagejson-2.5.0.tgz", + "integrity": "sha512-6XkH3rpin5QEQodBSVNg+rBo4r91g/1mCaRwS1YGdQJZ6jwqrg2UchBsIG9tpS1yK1kNBvOt84OILsX8uHzBGg==", + "dependencies": { + "sort-package-json": "2.10.0", + "synckit": "0.9.0" + }, + "peerDependencies": { + "prettier": ">= 1.16.0" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/detect-indent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-7.0.1.tgz", + "integrity": "sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/detect-newline": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-4.0.1.tgz", + "integrity": "sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/git-hooks-list": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-3.1.0.tgz", + "integrity": "sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==", + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/sort-package-json": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-2.10.0.tgz", + "integrity": "sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g==", + "dependencies": { + "detect-indent": "^7.0.1", + "detect-newline": "^4.0.0", + "get-stdin": "^9.0.0", + "git-hooks-list": "^3.0.0", + "globby": "^13.1.2", + "is-plain-obj": "^4.1.0", + "semver": "^7.6.0", + "sort-object-keys": "^1.1.3" + }, + "bin": { + "sort-package-json": "cli.js" + } + }, + "node_modules/prettier-plugin-packagejson/node_modules/synckit": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.0.tgz", + "integrity": "sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==", + "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/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "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/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "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/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/reflect-metadata": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "peer": true + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz", + "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.1", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "dependencies": { + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz", + "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==", + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/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==", + "engines": { + "node": ">=8" + } + }, + "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/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "engines": { + "node": ">=10" + } + }, + "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/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "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/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass-embedded": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.75.0.tgz", + "integrity": "sha512-8ZhQYJSCcjMRClyPpA09ZQ9p0Q9NtYxfMbhifBgUoQZC47Co5QJa0ykhfV/SY6mIqK7aAhMF7NAD5h0MEe2vpg==", + "peer": true, + "dependencies": { + "@bufbuild/protobuf": "^1.0.0", + "buffer-builder": "^0.2.0", + "immutable": "^4.0.0", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "varint": "^6.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-android-arm": "1.75.0", + "sass-embedded-android-arm64": "1.75.0", + "sass-embedded-android-ia32": "1.75.0", + "sass-embedded-android-x64": "1.75.0", + "sass-embedded-darwin-arm64": "1.75.0", + "sass-embedded-darwin-x64": "1.75.0", + "sass-embedded-linux-arm": "1.75.0", + "sass-embedded-linux-arm64": "1.75.0", + "sass-embedded-linux-ia32": "1.75.0", + "sass-embedded-linux-musl-arm": "1.75.0", + "sass-embedded-linux-musl-arm64": "1.75.0", + "sass-embedded-linux-musl-ia32": "1.75.0", + "sass-embedded-linux-musl-x64": "1.75.0", + "sass-embedded-linux-x64": "1.75.0", + "sass-embedded-win32-arm64": "1.75.0", + "sass-embedded-win32-ia32": "1.75.0", + "sass-embedded-win32-x64": "1.75.0" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.75.0.tgz", + "integrity": "sha512-3GNCfVEw2D34aEntYHv1+VFb0fOsU2nJdz/kpHXDlE7m/zIsi9ySn9WhvYlXkNQKBXvHRf8mWrU2/mC0QXTxxQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.75.0.tgz", + "integrity": "sha512-puVKsTovpqntG0b/jjxg6+jWD907UEnc/oJ1ia89KRkvLOPD8kE+EYzxxRYrgaG2tiGSMZNuOmYcAKfQNdLdig==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.75.0.tgz", + "integrity": "sha512-SObSy6USALhGQoX/Lu1Gctwsb6Ob4Hkg1ISHSV8SNHeWIko4ZiHbAb1r9UMJtRznyawvZ6fjKgOY5fLJAfk3xQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.75.0.tgz", + "integrity": "sha512-CCroBmmwbVZbwOXzFg6GdbOwcczhtjJ/75cfpAoku0InDJzxCP+sVJz8LL16rLWDsVveDoXX7JKFw9Nb9zQyjQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.75.0.tgz", + "integrity": "sha512-lb7Wkq69+AfD/tnopRX9RSu3d99Gsu1iIAhs3GyMh2N2AnVooASqKJ6I3IAbKnGh+MkXOISsoeyTP4hSnPyuqw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.75.0.tgz", + "integrity": "sha512-Lw02PAS0bY7Q4v2fWxlFUU/T/1AV49H2+Oirxtij5nF8rTgjNHlr/7cOQp/f8bRdG5SnPhJspy//c6K8X7cF9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.75.0.tgz", + "integrity": "sha512-s4yDbv/MEMVWr6E6uk7T/Fh4iX71NQDBDVQ/tbq4+VgF/SAo2YdnW1p97zwJjqwxNgIo76o21HaZO4rs66Ur8A==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.75.0.tgz", + "integrity": "sha512-v1d1Zzje46dXzRFm594RfkwdFnbPz1vlxM5vtLoz2d/r+TijhpVzNyy4dY4Dz0MEIcAU+edzB2P9MIHdX9yP9A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.75.0.tgz", + "integrity": "sha512-fxpWoX9Bc4rSA863aehnPPibiIRisSBktqKY5vkQnTg4L7SDxPwXMvHeL0LZQOG1t6+baSnjhOUZSjfwbl09MQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.75.0.tgz", + "integrity": "sha512-mVczW2hkGxXAs8I7H+m4bfZZIHd9tFR+UA2mHI+XkLE+cjyPC2FuWokc+WXyaWpqbE/KDSwqgSqY08zND7gcbA==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.75.0.tgz", + "integrity": "sha512-5ZlghwIG82spTNvutXbyXRC2cOMx7TZdWoiEqZ5QXuhChB35AHk43Ex1CdItPOLX0JjRv5eSuSelCY4nBGDe8A==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.75.0.tgz", + "integrity": "sha512-8RjKtvc1F9xP1hr+ht72CawkSr7/fZMSAhE/TORFncsPKpwN2WGqkoTBXdL22WGwi95ZAz5Zr2ZnGy8OXMDprQ==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.75.0.tgz", + "integrity": "sha512-bsuOEy6rjIwfc7qihDSrEnmaePUn8bR5NAAzeljlfQkRFRxivB1gysQfRPjLPbheJfChFDLiiFX2z2CQkcdKuQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.75.0.tgz", + "integrity": "sha512-L7x3orLODCRds6PpDfrb6bbh6IdqHDzcwyt6VkcbTN+KtbMI4PfNGKHeo7f2K8wMbCiFK3BGJqMSPxNRuVp19A==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.75.0.tgz", + "integrity": "sha512-wdVHtJBVykRWA2YEYsJ1bLf9sjcwa9BhHRzf03nSwS88Vc7GmflY6HyuY2Ynz+dWoth7MelgJL/XlonOs5y6/Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-ia32": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.75.0.tgz", + "integrity": "sha512-q/uE8q8PLG7Y7mcP1Lsiwg+6FwShj8dLk76Fa2FB68odLn42/aZ2eDHbpy+bbMgAqZqlcDDsqbCDHF9O3d0KrA==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.75.0.tgz", + "integrity": "sha512-lIT3ziKm2L9XGwP3S1D0Kk9ySJ6lVBLm+GZ2goQi8cAWepHSnmRz+mcd/AEqxDGEvrgNmmmvu3ylwlJ/6Nrm9w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "peer": true, + "bin": { + "sass": "dart-sass/sass.bat" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/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/semver/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/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/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "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/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==" + }, + "node_modules/sort-package-json": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-1.57.0.tgz", + "integrity": "sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==", + "dependencies": { + "detect-indent": "^6.0.0", + "detect-newline": "3.1.0", + "git-hooks-list": "1.0.3", + "globby": "10.0.0", + "is-plain-obj": "2.1.0", + "sort-object-keys": "^1.1.3" + }, + "bin": { + "sort-package-json": "cli.js" + } + }, + "node_modules/sort-package-json/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sort-package-json/node_modules/globby": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.0.tgz", + "integrity": "sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==", + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/spawn-command": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", + "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", + "dev": true + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "peer": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz", + "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==", + "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", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.7", + "regexp.prototype.flags": "^1.5.2", + "set-function-name": "^2.0.2", + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-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-ansi-cjs": { + "name": "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": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.1.tgz", + "integrity": "sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==", + "peer": true, + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/stylelint": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.3.1.tgz", + "integrity": "sha512-/JOwQnBvxEKOT2RtNgGpBVXnCSMBgKOL2k7w0K52htwCyJls4+cHvc4YZgXlVoAZS9QJd2DgYAiRnja96pTgxw==", + "dependencies": { + "@csstools/css-parser-algorithms": "^2.6.1", + "@csstools/css-tokenizer": "^2.2.4", + "@csstools/media-query-list-parser": "^2.1.9", + "@csstools/selector-specificity": "^3.0.2", + "@dual-bundle/import-meta-resolve": "^4.0.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.1", + "css-tree": "^2.3.1", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^8.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.3.1", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.30.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.38", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.0.16", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.0.0", + "svg-tags": "^1.0.0", + "table": "^6.8.1", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.0.tgz", + "integrity": "sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", + "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^14.0.0", + "stylelint-scss": "^6.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.0.2" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "36.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-36.0.0.tgz", + "integrity": "sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==", + "dependencies": { + "stylelint-config-recommended": "^14.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-13.1.0.tgz", + "integrity": "sha512-Eo5w7/XvwGHWkeGLtdm2FZLOMYoZl1omP2/jgFCXyl2x5yNz7/8vv4Tj6slHvMSSUNTaGoam/GAZ0ZhukvalfA==", + "dependencies": { + "stylelint-config-recommended-scss": "^14.0.0", + "stylelint-config-standard": "^36.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.3.1" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-order": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-6.0.4.tgz", + "integrity": "sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==", + "dependencies": { + "postcss": "^8.4.32", + "postcss-sorting": "^8.0.2" + }, + "peerDependencies": { + "stylelint": "^14.0.0 || ^15.0.0 || ^16.0.1" + } + }, + "node_modules/stylelint-order/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/stylelint-scss": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.2.1.tgz", + "integrity": "sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==", + "dependencies": { + "known-css-properties": "^0.29.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.15", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.2" + } + }, + "node_modules/stylelint-scss/node_modules/known-css-properties": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.29.0.tgz", + "integrity": "sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==" + }, + "node_modules/stylelint/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==" + }, + "node_modules/stylelint/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/stylelint/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/stylelint/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/stylelint/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "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/supports-hyperlinks": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz", + "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "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/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" + }, + "node_modules/synckit": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.8.tgz", + "integrity": "sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==", + "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/table": { + "version": "6.8.2", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz", + "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "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": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "peer": true + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-jest": { + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "devOptional": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsm": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tsm/-/tsm-2.3.0.tgz", + "integrity": "sha512-++0HFnmmR+gMpDtKTnW3XJ4yv9kVGi20n+NfyQWB9qwJvTaIWY9kBmzek2YUQK5APTQ/1DTrXmm4QtFPmW9Rzw==", + "dev": true, + "dependencies": { + "esbuild": "^0.15.16" + }, + "bin": { + "tsm": "bin.js" + }, "engines": { - "node": ">=4" + "node": ">=12" } }, - "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==", + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "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/prettier": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.5.tgz", - "integrity": "sha512-3gzuxrHbKUePRBB4ZeU08VNkUcqEHaUaouNt0m7LGP4Hti/NuB07C7PPTM/LkWqXoJYJn2McEo5+kxPNrtQkLQ==", - "bin": { - "prettier": "bin-prettier.js" + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": ">=10.13.0" + "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/prettier/prettier?sponsor=1" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "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": { - "fast-diff": "^1.1.2" + "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": ">=6.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "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": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "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/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, "engines": { - "node": ">=6" + "node": ">=14.17" } }, - "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==", + "node_modules/typescript-json-schema": { + "version": "0.63.0", + "resolved": "https://registry.npmjs.org/typescript-json-schema/-/typescript-json-schema-0.63.0.tgz", + "integrity": "sha512-vBfMBq4U/rZ5FIRi7u4o/YAdeRHsSabdGHogUlCPi0cYU0CGvS4Bdu8bSzyUsF+Kf5PTQUGh2TictJuQTDK6eQ==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/node": "^16.9.2", + "glob": "^7.1.7", + "path-equal": "^1.2.5", + "safe-stable-stringify": "^2.2.0", + "ts-node": "^10.9.1", + "typescript": "~5.1.0", + "yargs": "^17.1.1" + }, + "bin": { + "typescript-json-schema": "bin/typescript-json-schema" + } + }, + "node_modules/typescript-json-schema/node_modules/@types/node": { + "version": "16.18.96", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.96.tgz", + "integrity": "sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ==", + "dev": true + }, + "node_modules/typescript-json-schema/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/typescript-json-schema/node_modules/typescript": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uid": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uid/-/uid-2.0.2.tgz", + "integrity": "sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==", + "peer": true, + "dependencies": { + "@lukeed/csprng": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + }, + "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": "github", - "url": "https://github.com/sponsors/feross" + "type": "opencollective", + "url": "https://opencollective.com/browserslist" }, { - "type": "patreon", - "url": "https://www.patreon.com/feross" + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" }, { - "type": "consulting", - "url": "https://feross.org/support" + "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/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + "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/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==" + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "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==", + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "devOptional": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "peer": true + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "peer": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "peer": 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-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" }, "engines": { "node": ">= 0.4" @@ -4428,562 +9909,713 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, "engines": { - "node": ">=8" + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "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": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "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" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": ">= 0.4" }, "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/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "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==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/wrap-ansi-cjs": { + "name": "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==", "dependencies": { - "glob": "^7.1.3" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "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/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "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==", + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" + "node_modules/write-file-atomic/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==" + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" } }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.1.tgz", + "integrity": "sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" } }, - "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==", + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "shebang-regex": "^3.0.0" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=8" + "node": ">=12" } }, - "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==", + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { - "node": ">=8" + "node": ">=12" } }, - "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" + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "devOptional": true, + "engines": { + "node": ">=6" + } + }, + "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/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "packages/code-style": { + "name": "@code-style/code-style", + "version": "2.0.0-26", + "license": "MIT", + "dependencies": { + "@prettier/plugin-ruby": "^4.0.2", + "deepmerge": "^4.3.1", + "prettier": "^3.1.0", + "prettier-plugin-packagejson": "^2.4.6" + }, + "bin": { + "add-code-style": "scripts/add-code-style.sh" + }, + "devDependencies": { + "concurrently": "^8.2.2", + "typescript": "^5.2.2", + "typescript-json-schema": "^0.63.0" + }, "engines": { - "node": ">=8" + "node": ">=18" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "packages/create-configs": { + "name": "@code-style/create-configs", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" + "@code-style/code-style": "^2.0.0-26", + "@inquirer/prompts": "^3.2.0", + "common-tags": "^1.8.2", + "json5": "^2.2.3", + "prettier": "^3.1.0", + "yaml": "^2.3.2", + "yargs": "^17.7.2" + }, + "bin": { + "create-configs": "bin/create-configs.js" + }, + "devDependencies": { + "@code-style/eslint-config": "^2.0.0-26", + "@code-style/eslint-config-cli": "^2.0.0-26", + "@code-style/eslint-config-typescript": "^2.0.0-26", + "@code-style/jest-configs": "^2.0.0-26", + "@code-style/typescript-configs": "^2.0.0-26", + "@types/common-tags": "^1.8.3", + "@types/jest": "^29.5.6", + "jest": "^29.7.0", + "stylelint": "^16.3.1", + "ts-jest": "^29.1.1", + "typescript": "^5.2.2" + }, + "engines": { + "node": ">=18" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "packages/eslint-config": { + "name": "@code-style/eslint-config", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "internal-slot": "^1.0.4" + "@eslint-community/eslint-plugin-eslint-comments": "^4.1.0", + "eslint": "^8.49.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-json-files": "^4.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages": "2.0.0-26", + "prettier": "^3.1.0" } }, - "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "packages/eslint-config-browser": { + "name": "@code-style/eslint-config-browser", + "version": "2.0.0-26", + "license": "MIT", + "devDependencies": { + "tsm": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^8.49.0" + } + }, + "packages/eslint-config-cli": { + "name": "@code-style/eslint-config-cli", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" + "@code-style/eslint-config-node": "^2.0.0-26" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^8.49.0" } }, - "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==", + "packages/eslint-config-esmodule": { + "name": "@code-style/eslint-config-esmodule", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "eslint-plugin-import": "^2.28.1" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" }, "engines": { - "node": ">= 0.4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-esmodule": "2.0.0-26", + "eslint": "^8.49.0" } }, - "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==", + "packages/eslint-config-jest": { + "name": "@code-style/eslint-config-jest", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "eslint-plugin-jest": "^27.4.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "devDependencies": { + "tsm": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-jest": "2.0.0-26", + "eslint": "^8.49.0", + "jest": "*" } }, - "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==", + "packages/eslint-config-nest": { + "name": "@code-style/eslint-config-nest", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "@code-style/eslint-config-node": "2.0.0-26", + "@code-style/eslint-config-typescript": "2.0.0-26", + "@code-style/eslint-plugin-nest": "2.0.0-26" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^8.49.0" } }, - "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==", + "packages/eslint-config-nextjs": { + "name": "@code-style/eslint-config-nextjs", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "@code-style/eslint-config-react": "^2.0.0-26", + "@next/eslint-plugin-next": "^14.1.1" + }, + "devDependencies": { + "@types/react": "^18.2.23", + "react": "^18.2.0", + "tsm": "^2.3.0" }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-react": "2.0.0-26", + "eslint": "^8.49.0", + "next": "*" } }, - "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==", + "packages/eslint-config-node": { + "name": "@code-style/eslint-config-node", + "version": "2.0.0-26", + "license": "MIT", + "dependencies": { + "eslint-plugin-n": "^16.1.0" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-node": "2.0.0-26", + "eslint": "^8.49.0" + } + }, + "packages/eslint-config-react": { + "name": "@code-style/eslint-config-react", + "version": "2.0.0-26", + "license": "MIT", + "dependencies": { + "@code-style/eslint-config-browser": "^2.0.0-26", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "devDependencies": { + "@types/react": "^18.2.23", + "react": "^18.2.0", + "tsm": "^2.3.0" + }, "engines": { - "node": ">=4" + "node": ">=18" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-react": "2.0.0-26", + "eslint": "^8.49.0", + "react": ">=16.8", + "react-dom": ">=16.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==", + "packages/eslint-config-typescript": { + "name": "@code-style/eslint-config-typescript", + "version": "2.0.0-26", + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", + "eslint-plugin-import": "^2.29.1" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, "engines": { - "node": ">=8" + "node": ">=18" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-typescript": "2.0.0-26", + "eslint": "^8.49.0", + "typescript": ">=5.0.0" } }, - "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==", + "packages/eslint-npm-hoist-packages": { + "name": "@code-style/eslint-npm-hoist-packages", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@eslint-community/eslint-plugin-eslint-comments": "^4.1.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-json-files": "^4.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1" }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "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" + "packages/eslint-npm-hoist-packages-esmodule": { + "name": "@code-style/eslint-npm-hoist-packages-esmodule", + "version": "2.0.0-26", + "license": "MIT", + "dependencies": { + "eslint-plugin-import": "^2.28.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=18" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" - }, - "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==", - "peer": true, + "packages/eslint-npm-hoist-packages-jest": { + "name": "@code-style/eslint-npm-hoist-packages-jest", + "version": "2.0.0-26", + "license": "MIT", + "dependencies": { + "eslint-plugin-jest": "^27.4.0" + }, "engines": { - "node": ">=4" + "node": ">=18" } }, - "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==", + "packages/eslint-npm-hoist-packages-nextjs": { + "name": "@code-style/eslint-npm-hoist-packages-nextjs", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "is-number": "^7.0.0" + "@next/eslint-plugin-next": "^14.1.1" }, "engines": { - "node": ">=8.0" + "node": ">=18" } }, - "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==", + "packages/eslint-npm-hoist-packages-node": { + "name": "@code-style/eslint-npm-hoist-packages-node", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" + "eslint-plugin-n": "^16.1.0" + }, + "engines": { + "node": ">=18" } }, - "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==", + "packages/eslint-npm-hoist-packages-react": { + "name": "@code-style/eslint-npm-hoist-packages-react", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "minimist": "^1.2.0" + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=18" } }, - "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "packages/eslint-npm-hoist-packages-typescript": { + "name": "@code-style/eslint-npm-hoist-packages-typescript", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "tslib": "^1.8.1" + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", + "eslint-plugin-import": "^2.28.1" }, "engines": { - "node": ">= 6" + "node": ">=18" + } + }, + "packages/eslint-plugin-nest": { + "name": "@code-style/eslint-plugin-nest", + "version": "2.0.0-26", + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "^6.11.0", + "@typescript-eslint/utils": "^6.11.0" + }, + "devDependencies": { + "@code-style/eslint-config": "^2.0.0-26", + "@code-style/eslint-config-node": "^2.0.0-26", + "@code-style/eslint-config-typescript": "^2.0.0-26", + "@code-style/jest-configs": "^2.0.0-26", + "@code-style/typescript-configs": "^2.0.0-26", + "@types/eslint": "^8.44.2", + "@types/jest": "^29.5.8", + "@types/node": "^20.6.3", + "@typescript-eslint/rule-tester": "^6.11.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "tsm": "^2.3.0", + "typescript": "^5.2.2" + }, + "engines": { + "node": ">=18" }, "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + "@nestjs/core": "*", + "eslint": "^8.49.0" } }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "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==", + "packages/jest-configs": { + "name": "@code-style/jest-configs", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "prelude-ls": "^1.2.1" + "ts-jest": "^29.1.2" + }, + "devDependencies": { + "@types/jest": "^29.5.5", + "@types/node": "^20.6.3", + "tsm": "^2.3.0", + "typescript": "^5.0.0" }, "engines": { - "node": ">= 0.8.0" + "node": ">=18" + }, + "peerDependencies": { + "jest": ">=29", + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "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" + "packages/rubocop-config": { + "name": "@code-style/rubocop-configs", + "version": "2.0.0-26", + "license": "MIT", + "devDependencies": { + "@types/jest": "^29.5.5", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } }, - "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==", + "packages/stylelint-config": { + "name": "@code-style/stylelint-config", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" + "stylelint": "^16.3.1", + "stylelint-config-standard": "^36.0.0", + "stylelint-order": "^6.0.4", + "stylelint-prettier": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" + "devDependencies": { + "@types/node": "^20.8.4", + "tsm": "^2.3.0" }, "engines": { - "node": ">=12.20" + "node": ">=18" + }, + "peerDependencies": { + "prettier": "^3.1.0" } }, - "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==", + "packages/stylelint-config-scss": { + "name": "@code-style/stylelint-config-scss", + "version": "2.0.0-26", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" + "stylelint": "^16.3.1", + "stylelint-config-sass-guidelines": "^11.1.0", + "stylelint-config-standard-scss": "^13.1.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "devDependencies": { + "@types/node": "^20.8.4", + "tsm": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "sass-embedded": "^1.33.0" } }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "packages/stylelint-config-scss/node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "funding": [ { "type": "opencollective", - "url": "https://opencollective.com/browserslist" + "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "peer": true, "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "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" + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "packages/stylelint-config-scss/node_modules/stylelint-config-sass-guidelines": { + "version": "11.1.0", + "license": "MIT", "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" + "postcss-scss": "^4.0.9", + "stylelint-scss": "^6.2.1" }, "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" + "node": ">=18.12.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.21", + "stylelint": "^16.1.0" } }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "packages/stylelint-config/node_modules/stylelint-prettier": { + "version": "5.0.0", + "license": "MIT", "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" + "prettier-linter-helpers": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "prettier": ">=3.0.0", + "stylelint": ">=16.0.0" } }, - "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==", + "packages/typescript-configs": { + "name": "@code-style/typescript-configs", + "version": "2.0.0-26", + "license": "MIT", "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" + "tslib": "^2.6.2" }, - "engines": { - "node": ">= 0.4" + "devDependencies": { + "@types/jest": "^29.5.5", + "@types/node": "^20.6.3", + "@types/react": "^18.2.23", + "tsm": "^2.3.0", + "typescript": "^5.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "engines": { - "node": ">=0.10.0" + "node": ">=18" + }, + "peerDependencies": { + "typescript": ">=5.0.0" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "peer": true - }, - "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" + "utils": { + "name": "@code-style/utils", + "version": "2.0.0-26", + "dependencies": { + "eslint": "^8.51.0", + "stylelint": "^16.3.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=18" } } } diff --git a/package.json b/package.json index 80c30635..1402f174 100644 --- a/package.json +++ b/package.json @@ -1,35 +1,57 @@ { "name": "code-style-monorepo", - "description": "My code style configs", - "version": "1.3.0", + "version": "2.0.0-26", "private": true, - "repository": { - "type": "git", - "url": "git+https://github.com/dudeofawesome/code-style.git" - }, - "bugs": { - "url": "https://github.com/dudeofawesome/code-style/issues" - }, - "homepage": "https://github.com/dudeofawesome/code-style#readme", - "author": "Louis Orleans ", - "license": "MIT", + "description": "My code style configs", "keywords": [ "style", "lint", "config", "format" ], + "homepage": "https://github.com/dudeofawesome/code-style#readme", + "bugs": { + "url": "https://github.com/dudeofawesome/code-style/issues" + }, + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git" + }, + "license": "MIT", + "author": "Louis Orleans ", + "type": "module", + "bin": { + "bump": "scripts/bump.ts", + "concurrently-ws": "scripts/concurrently-ws.ts", + "upgrade-packages": "scripts/upgrade-packages.sh" + }, "workspaces": [ - "code-style", - "eslint-config", - "eslint-config-jest", - "eslint-config-node", - "eslint-config-typescript" + "packages/*", + "utils" ], "scripts": { - "bump": "scripts/bump.sh" + "build": "scripts/build.sh", + "bump": "scripts/bump.ts", + "prelint": "npm run build", + "lint": "scripts/concurrently-ws.ts lint 'npm:lint:*' && echo 'All lint passed.'", + "lint:js": "tsc --noEmit", + "lint:types": "eslint .", + "pretest": "npm run build", + "test": "scripts/concurrently-ws.ts test && echo 'All tests passed.'", + "upgrade-packages": "scripts/upgrade-packages.sh" }, "devDependencies": { - "@dudeofawesome/code-style": "^1.0.0" + "@types/eslint": "^8.44.2", + "@types/node": "^20.8.4", + "tsm": "^2.3.0", + "yargs": "^17.7.2" + }, + "engines": { + "node": ">=20" + }, + "overrides": { + "eslint-plugin-import": { + "tsconfig-paths": "^4.2.0" + } } } diff --git a/code-style/.editorconfig b/packages/code-style/.editorconfig similarity index 100% rename from code-style/.editorconfig rename to packages/code-style/.editorconfig diff --git a/packages/code-style/.eslintrc.yaml b/packages/code-style/.eslintrc.yaml new file mode 100644 index 00000000..3bc2cae6 --- /dev/null +++ b/packages/code-style/.eslintrc.yaml @@ -0,0 +1,14 @@ +root: true +extends: + - '@code-style' + - '@code-style/node' + - '@code-style/esmodule' + - '@code-style/typescript' + +ignorePatterns: + - '/prettierrc.*' + - '/config-types.*' + +rules: + import/no-default-export: 'off' + n/no-sync: 'off' diff --git a/packages/code-style/.gitignore b/packages/code-style/.gitignore new file mode 100644 index 00000000..f5549292 --- /dev/null +++ b/packages/code-style/.gitignore @@ -0,0 +1,7 @@ +# compiled output +/prettierrc.* +/config-types.* +*.schema.json + +# caches +*.tsbuildinfo diff --git a/packages/code-style/README.md b/packages/code-style/README.md new file mode 100644 index 00000000..025c2a25 --- /dev/null +++ b/packages/code-style/README.md @@ -0,0 +1,9 @@ +# My Code Style Guide + +A few configuration files for code style standards. Intended to be shared across all of my repos. + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +## Usage + +See [create-configs](../create-configs/README.md) for usage information. diff --git a/packages/code-style/package.json b/packages/code-style/package.json new file mode 100644 index 00000000..25868350 --- /dev/null +++ b/packages/code-style/package.json @@ -0,0 +1,65 @@ +{ + "name": "@code-style/code-style", + "version": "2.0.0-26", + "description": "My code style configs", + "keywords": [ + "style", + "lint", + "config", + "format" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/code-style/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/code-style" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + "./prettierrc": { + "types": "./prettierrc.d.mts", + "default": "./prettierrc.mjs" + }, + "./config-types": { + "types": "./config-types.d.ts" + } + }, + "bin": { + "add-code-style": "scripts/add-code-style.sh" + }, + "files": [ + "/src/", + "/prettierrc.*", + "/config-types.*", + "/.editorconfig", + "*.schema.json", + "/scripts/add-code-style.sh" + ], + "scripts": { + "build": "concurrently --group --prefix none \"npm:build:*\"", + "build:jsonschema": "typescript-json-schema src/config-types.ts CodeStyleSetupOptions > codestylerc.schema.json", + "build:ts": "tsc", + "lint": "eslint . --ext ts,mts,cts,js,json", + "prepublishOnly": "npm run build", + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "@prettier/plugin-ruby": "^4.0.2", + "deepmerge": "^4.3.1", + "prettier": "^3.1.0", + "prettier-plugin-packagejson": "^2.4.6" + }, + "devDependencies": { + "concurrently": "^8.2.2", + "typescript": "^5.2.2", + "typescript-json-schema": "^0.63.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/code-style/scripts/add-code-style.sh b/packages/code-style/scripts/add-code-style.sh new file mode 100755 index 00000000..05d53c7f --- /dev/null +++ b/packages/code-style/scripts/add-code-style.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +>&2 echo "This script has been deprecated!" +>&2 echo "Use `npm init @code-style/create-configs` instead." +exit 1 diff --git a/packages/code-style/src/config-types.ts b/packages/code-style/src/config-types.ts new file mode 100644 index 00000000..d7f1a31f --- /dev/null +++ b/packages/code-style/src/config-types.ts @@ -0,0 +1,36 @@ +export type ProjectType = 'web-app' | 'backend' | 'cli'; +export type Language = 'ts' | 'js' | 'rb' | 'py' | 'css' | 'scss'; +export type Technology = + | 'react' + | 'react-native' + | 'nextjs' + | 'nestjs' + | 'jest' + | 'vs-code' + | 'esm' + | 'commonjs'; +export type Builder = 'tsc' | 'esbuild' | 'swc' | 'bun' | 'babel' | 'none'; +export type Runtime = 'nodejs' | 'bun'; + +export interface CodeStyleSetupOptions { + /** The general type of the project. */ + project_type: ProjectType; + /** Languages that will be used in the project. */ + languages: Language[]; + /** The runtime that will be used. */ + runtime?: Runtime; + /** The builder that will be used. */ + builder: Builder; + /** The source directory. */ + input_dir?: string; + /** The build output directory. */ + output_dir?: string; + /** Any technologies, tools, etc that will be used in this project. */ + technologies: Technology[]; + /** Whether or not this project is a library that other projects will consume. */ + library: boolean; + /** Whether or not to use lenient rulesets. */ + lenient: boolean; + /** Whether or not to overwrite files. */ + overwrite: boolean; +} diff --git a/packages/code-style/src/prettier-plugin-packagejson.d.ts b/packages/code-style/src/prettier-plugin-packagejson.d.ts new file mode 100644 index 00000000..882e6665 --- /dev/null +++ b/packages/code-style/src/prettier-plugin-packagejson.d.ts @@ -0,0 +1,7 @@ +declare module 'prettier-plugin-packagejson' { + import type { Plugin } from 'prettier'; + + const plugin: Plugin; + + export default plugin; +} diff --git a/packages/code-style/src/prettier__plugin-ruby.d.ts b/packages/code-style/src/prettier__plugin-ruby.d.ts new file mode 100644 index 00000000..02f555ca --- /dev/null +++ b/packages/code-style/src/prettier__plugin-ruby.d.ts @@ -0,0 +1,26 @@ +declare module '@prettier/plugin-ruby' { + import type { Options, Plugin } from 'prettier'; + + export type RubyConfig = { + /** + * Allows you to configure your Ruby executable path. + * @default 'ruby' + */ + rubyExecutablePath: string; + /** + * The comma-separated list of plugins to require. + * See [Syntax Tree](https://github.com/ruby-syntax-tree/syntax_tree#plugins). + * @default '' + */ + rubyPlugins: string; + /** + * Whether or not to default to single quotes for Ruby code. + * See [Syntax Tree](https://github.com/ruby-syntax-tree/syntax_tree#plugins). + * @default false + */ + rubySingleQuote: boolean; + } & Options; + const plugin: Plugin; + + export default plugin; +} diff --git a/packages/code-style/src/prettierrc.mts b/packages/code-style/src/prettierrc.mts new file mode 100644 index 00000000..10309096 --- /dev/null +++ b/packages/code-style/src/prettierrc.mts @@ -0,0 +1,71 @@ +// https://prettier.io/docs/en/options.html + +import { execSync } from 'child_process'; +import deepmerge from 'deepmerge'; +import type { RubyConfig } from '@prettier/plugin-ruby'; +import type { Config } from 'prettier'; + +const is_prettier_gem_installed: boolean = (() => { + try { + return ( + // TODO(0): re-enable ruby + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-binary-expression + false && + execSync('gem list -i prettier_print').toString().trim() === 'true' + ); + } catch { + return false; + } +})(); + +const option_sets: Record = { + general: { + singleQuote: true, + semi: true, + trailingComma: 'all', + quoteProps: 'as-needed', // prettier default + bracketSpacing: true, // prettier default + bracketSameLine: false, // prettier default + arrowParens: 'always', // prettier default + proseWrap: 'preserve', // prettier default + singleAttributePerLine: false, // prettier default + embeddedLanguageFormatting: 'auto', // prettier default + // printWidth: // configured in .editorconfig->max_line_length + // useTabs: // configured in .editorconfig->indent_style + // tabWidth: // configured in .editorconfig->indent_size + // endOfLine: // configured in .editorconfig->end_of_line + }, + + html: { + htmlWhitespaceSensitivity: 'css', // prettier default + }, + + jsx: { + jsxSingleQuote: false, // prettier default + }, + + vue: { + vueIndentScriptAndStyle: false, // prettier default + }, + + package_json: { + // TODO(0): consider switching to `prettier-plugin-pkg` + plugins: ['prettier-plugin-packagejson'], + }, + + ruby: is_prettier_gem_installed + ? { + plugins: ['@prettier/plugin-ruby'], + + rubySingleQuote: true, + // rubyPlugins: ['plugin/single_quotes'], + } + : {}, +}; + +const config = deepmerge.all([ + {}, + ...Object.entries(option_sets).map(([_, v]) => v), +]); + +export default config; diff --git a/packages/code-style/tsconfig.json b/packages/code-style/tsconfig.json new file mode 100644 index 00000000..5cf35eac --- /dev/null +++ b/packages/code-style/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule", + "@code-style/typescript-configs/layers/library" + ], + "compilerOptions": { + "outDir": "./" + }, + "include": ["src/"], + "exclude": ["./*.*"] +} diff --git a/packages/create-configs/.eslintrc.yaml b/packages/create-configs/.eslintrc.yaml new file mode 100644 index 00000000..5402a95f --- /dev/null +++ b/packages/create-configs/.eslintrc.yaml @@ -0,0 +1,11 @@ +root: true +extends: + - '@code-style/eslint-config' + - '@code-style/eslint-config-node' + - '@code-style/eslint-config-cli' + - '@code-style/eslint-config-typescript' + - '@code-style/eslint-config-esmodule' + +ignorePatterns: + - '/bin/create-configs.js' + - '/jest.config.js' diff --git a/packages/create-configs/.gitignore b/packages/create-configs/.gitignore new file mode 100644 index 00000000..178135c2 --- /dev/null +++ b/packages/create-configs/.gitignore @@ -0,0 +1 @@ +/dist/ diff --git a/code-style/README.md b/packages/create-configs/README.md similarity index 76% rename from code-style/README.md rename to packages/create-configs/README.md index d4e83c15..5d1a038a 100644 --- a/code-style/README.md +++ b/packages/create-configs/README.md @@ -1,32 +1,26 @@ -# My Code Style Guide +# @code-style/create-configs -A bunch of configuration files for code style standards. Intended to be shared across all of my repos. +A script to create configuration files to conform to code style standards. ## Usage -### Add config files +1. Create your config files. -1. Install the files - - ```sh - npm i -D @dudeofawesome/code-style - npx add-code-style + ``` + $ npm init @code-style/configs ``` -1. Verify settings match the type of project you're working on. - - ESLint in particular has a bunch of settings that will vary base on the type of project you're working on. Node vs browser, what version of ES / TS you're working with, etc. +1. Answer the prompted questions. - We provide some other eslint configs for different environments: +1. Verify settings match the type of project you're working on. - - [`@dudeofawesome/node`](../eslint-config-node/README.md) - - [`@dudeofawesome/typescript`](../eslint-config-typescript/README.md) + ESLint in particular has a bunch of settings that will vary based on the type of project you're working on. ### Consider adding some editor settings - VS Code - [.vscode/settings.json](.vscode/settings.json) + Handled by this script - Vim @@ -37,9 +31,12 @@ A bunch of configuration files for code style standards. Intended to be shared a ### Consider installing editor plugins -This will automatically apply formatting and linting to your files. +This will automatically apply formatting and linting to your files as you work. + +- VS Code + + Handled by this script -- [VS Code](.vscode/extensions.json) - Vim - https://github.com/prettier/vim-prettier - https://github.com/editorconfig/editorconfig-vim @@ -55,6 +52,8 @@ This will automatically apply formatting and linting to your files. ### Formatting a pre-existing project +If you'd like to maintain git-blame information, you can use the following method (with varying amounts of success): + 1. Make sure you've got a clean working tree 1. Run Prettier diff --git a/packages/create-configs/bin/create-configs.js b/packages/create-configs/bin/create-configs.js new file mode 100755 index 00000000..6c4ee4b1 --- /dev/null +++ b/packages/create-configs/bin/create-configs.js @@ -0,0 +1,5 @@ +#!/usr/bin/env -S node --trace-uncaught + +import { main } from '../dist/index.js'; + +main(); diff --git a/packages/create-configs/jest.config.js b/packages/create-configs/jest.config.js new file mode 100644 index 00000000..1200de71 --- /dev/null +++ b/packages/create-configs/jest.config.js @@ -0,0 +1,4 @@ +import { config } from '@code-style/jest-configs/ts-esm'; + +// eslint-disable-next-line import/no-default-export +export default config; diff --git a/packages/create-configs/package.json b/packages/create-configs/package.json new file mode 100644 index 00000000..24147bf4 --- /dev/null +++ b/packages/create-configs/package.json @@ -0,0 +1,64 @@ +{ + "name": "@code-style/create-configs", + "version": "2.0.0-26", + "description": "A script to create configuration files to conform to code style standards.", + "keywords": [ + "style", + "lint", + "config", + "format", + "setup" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/create-configs/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/create-configs" + }, + "license": "MIT", + "author": "Louis Orleans ", + "type": "module", + "main": "dist/index.js", + "bin": "bin/create-configs.js", + "files": [ + "/dist/", + "/bin/" + ], + "scripts": { + "build": "tsc", + "prelint": "npm run build", + "lint": "eslint . --ext ts,js,json", + "prepublishOnly": "npm run build", + "start": "node bin/create-configs.js", + "test": "NODE_OPTIONS=--experimental-vm-modules npx jest" + }, + "dependencies": { + "@code-style/code-style": "^2.0.0-26", + "@inquirer/prompts": "^3.2.0", + "common-tags": "^1.8.2", + "json5": "^2.2.3", + "prettier": "^3.1.0", + "yaml": "^2.3.2", + "yargs": "^17.7.2" + }, + "devDependencies": { + "@code-style/eslint-config": "^2.0.0-26", + "@code-style/eslint-config-cli": "^2.0.0-26", + "@code-style/eslint-config-typescript": "^2.0.0-26", + "@code-style/jest-configs": "^2.0.0-26", + "@code-style/typescript-configs": "^2.0.0-26", + "@types/common-tags": "^1.8.3", + "@types/jest": "^29.5.6", + "jest": "^29.7.0", + "stylelint": "^16.3.1", + "ts-jest": "^29.1.1", + "typescript": "^5.2.2" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/create-configs/src/build.ts b/packages/create-configs/src/build.ts new file mode 100644 index 00000000..bd1aa550 --- /dev/null +++ b/packages/create-configs/src/build.ts @@ -0,0 +1,109 @@ +import { CodeStyleSetupOptions as SetupOptions } from '@code-style/code-style/config-types'; +import { + create_jest_config, + create_ts_config, + set_package_type, +} from './steps/language-configuration.js'; +import { + create_editor_config, + create_prettier_config, +} from './steps/formatting.js'; +import { + create_eslint_config, + create_stylelint_config, +} from './steps/lint-configuration.js'; +import { + install_dependencies, + uninstall_duplicate_dependencies, +} from './steps/dependencies.js'; +import { create_vscode_config } from './steps/editor.js'; +import { create_gitignore } from './steps/git.js'; +import { includes_js } from './utils.js'; +import { add_npm_scripts } from './steps/scripts.js'; + +export async function build({ + project_type, + languages, + runtime, + builder, + input_dir = 'src/', + output_dir = 'dist/', + technologies = [], + library = false, + lenient = false, + overwrite = false, +}: SetupOptions) { + await uninstall_duplicate_dependencies({ runtime }); + await Promise.all([ + create_editor_config(overwrite), + create_prettier_config(overwrite), + includes_js(languages) + ? install_dependencies({ + project_type, + languages, + technologies, + runtime, + builder, + }) + : null, + ]); + + await Promise.all( + [ + technologies.includes('vs-code') + ? create_vscode_config(project_type, languages, technologies, overwrite) + : null, + + create_gitignore({ + languages, + technologies, + project_type, + builder, + output_dir, + }), + + languages.includes('css') || languages.includes('scss') + ? create_stylelint_config({ languages, lenient, overwrite }) + : null, + + includes_js(languages) + ? [ + set_package_type({ technologies, library }), + create_ts_config({ + project_type, + technologies, + library, + input_dir, + output_dir, + overwrite, + lenient, + }), + create_eslint_config({ + project_type, + languages, + technologies, + lenient, + overwrite, + }), + add_npm_scripts({ + languages, + technologies, + runtime, + builder, + overwrite, + }), + ] + : null, + + includes_js(languages) && technologies.includes('jest') + ? create_jest_config({ + languages, + technologies, + overwrite, + }) + : null, + ] + .filter(Boolean) + .flat(), + ); +} diff --git a/packages/create-configs/src/index.ts b/packages/create-configs/src/index.ts new file mode 100644 index 00000000..b98308b5 --- /dev/null +++ b/packages/create-configs/src/index.ts @@ -0,0 +1,116 @@ +import Yargs from 'yargs/yargs'; +import { hideBin } from 'yargs/helpers'; +import { Options } from 'yargs'; +import { + ProjectType, + Language, + Technology, + Builder, + Runtime, + CodeStyleSetupOptions as SetupOptions, +} from '@code-style/code-style/config-types'; + +import { build } from './build.js'; +import { interactive_setup } from './interactive.js'; +import { load_rc } from './rc-file.js'; + +// TODO(4): add support for ruby +// TODO(1): add deeper support for build systems +// TODO(2): add deeper support for runtimes + +export async function main() { + const options = await Yargs(hideBin(process.argv)) + .scriptName('create-configs') + .option('overwrite', { + alias: 'o', + description: 'Allows overwriting files.', + type: 'boolean', + default: false, + }) + .command( + 'create', + 'Create your new project with CLI arguments.', + (yargs) => { + // TODO(0): bring yargs up to date with prompt + yargs + .option( + 'project_type', + { + alias: 't', + description: 'Pick a project type', + choices: ['web-app', 'backend', 'cli'], + }, + ) + .option('language', { + alias: 'l', + description: 'Pick a language', + choices: ['ts', 'js', 'rb', 'py', 'css', 'scss'], + array: true, + default: ['ts'], + }) + .option('runtime', { + alias: 'r', + description: 'Pick a runtime', + choices: ['nodejs', 'bun'], + default: 'nodejs', + }) + .option('builder', { + alias: 'b', + description: 'Pick a builder', + choices: ['tsc', 'esbuild', 'swc', 'babel', 'bun', 'none'], + default: 'esbuild', + }) + .option('input_dir', { + alias: 'i', + description: 'Pick an input directory', + default: 'src/', + }) + .option('output_dir', { + alias: 'o', + description: 'Pick an output directory', + default: 'dist/', + }) + .option('technologies', { + alias: 'c', + description: 'Choose some technologies you will use', + choices: ['react', 'nestjs', 'jest', 'vs-code'], + array: true, + default: ['jest', 'vs-code'], + }); + }, + async (argv) => { + await build({ + ...(argv as unknown as SetupOptions), + overwrite: options.overwrite, + }); + process.exit(0); + }, + ) + .command( + 'prompt', + 'Walk through a set of prompts to configure your new project', + async (yargs) => { + await start_interactive_setup(); + }, + (argv) => { + return; + }, + ) + .parserConfiguration({ + 'strip-aliased': true, + 'strip-dashed': true, + }).argv; + + if (options._.length === 0) await start_interactive_setup(); +} + +async function start_interactive_setup() { + const config = await load_rc({ throw_no_config: true }) + .then((config) => { + console.log(`Using codestyleinitrc file to set defaults.`); + return config; + }) + .catch(() => ({})); + + return interactive_setup(config); +} diff --git a/packages/create-configs/src/interactive.ts b/packages/create-configs/src/interactive.ts new file mode 100644 index 00000000..5ca0b12b --- /dev/null +++ b/packages/create-configs/src/interactive.ts @@ -0,0 +1,259 @@ +import { checkbox, select, input, confirm } from '@inquirer/prompts'; +import { + ProjectType, + Language, + Technology, + Builder, + Runtime, + CodeStyleSetupOptions, +} from '@code-style/code-style/config-types'; + +import { build } from './build.js'; +import { includes_js } from './utils.js'; +import { save_rc } from './rc-file.js'; + +export async function interactive_setup( + defaults: Partial = {}, +) { + const project_type = await select({ + message: 'Project type', + choices: [ + { name: 'Web App', value: 'web-app' }, + { name: 'Backend', value: 'backend' }, + { name: 'CLI tool', value: 'cli' }, + ], + default: defaults.project_type, + }); + + const languages = await checkbox({ + message: `Languages (Only select languages you will write source-code in.)\n `, + instructions: `(Press to select and to proceed)`, + choices: [ + { + name: 'Javascript', + value: 'js', + checked: defaults.languages?.includes('js'), + }, + { + name: 'Typescript', + value: 'ts', + checked: defaults.languages?.includes('ts') ?? true, + }, + (() => { + const disabled = !['web-app'].includes(project_type); + return { + name: 'CSS', + value: 'css', + checked: defaults.languages?.includes('css') && !disabled, + disabled, + }; + })(), + (() => { + const disabled = !['web-app'].includes(project_type); + return { + name: 'SASS', + value: 'scss', + checked: defaults.languages?.includes('scss') && !disabled, + disabled, + }; + })(), + (() => { + const disabled = !['backend', 'cli'].includes(project_type); + return { + name: 'ruby', + value: 'rb', + checked: defaults.languages?.includes('rb') && !disabled, + disabled, + }; + })(), + { + name: 'python', + value: 'py', + checked: defaults.languages?.includes('py'), + disabled: '(not yet supported)', + }, + ], + }); + + const runtime: Runtime | undefined = includes_js(languages) + ? await select({ + message: 'Runtime', + choices: [ + { name: 'nodejs', value: 'nodejs' }, + { name: 'bun', value: 'bun' }, + ], + default: defaults.runtime, + }) + : undefined; + + const builder: Builder = includes_js(languages) + ? await select({ + message: 'Builder', + choices: [ + { + name: 'esbuild', + value: 'esbuild', + disabled: runtime !== 'nodejs', + }, + { + name: 'tsc', + value: 'tsc', + disabled: !languages.includes('ts') || runtime !== 'nodejs', + }, + { name: 'SWC', value: 'swc', disabled: runtime !== 'nodejs' }, + { + name: 'Babel', + value: 'babel', + disabled: languages.includes('ts') || runtime !== 'nodejs', + }, + { + name: 'Bun', + value: 'bun', + disabled: !languages.includes('ts') || runtime !== 'bun', + }, + { + name: 'none', + value: 'none', + disabled: languages.includes('ts') || runtime === 'bun', + }, + ], + default: defaults.builder, + }) + : 'none'; + + const technologies: Technology[] = await checkbox({ + message: `Tools (Select any tools / frameworks you will be using for this project.)\n `, + instructions: `(Press to select and to proceed)`, + choices: [ + (() => { + const disabled = !includes_js(languages) || project_type !== 'web-app'; + return { + name: 'React', + value: 'react', + checked: defaults.technologies?.includes('react') && !disabled, + disabled, + }; + })(), + (() => { + const disabled = !includes_js(languages) || project_type !== 'web-app'; + return { + name: 'Next.JS', + value: 'nextjs', + checked: defaults.technologies?.includes('nextjs') && !disabled, + disabled, + }; + })(), + (() => { + const disabled = + `The configurator doesn't yet have support for React Native, but you can still configure it manually` as + | string + | boolean; + return { + name: 'React Native', + value: 'react-native', + checked: + defaults.technologies?.includes('react-native') && + !(disabled !== false), + disabled, + }; + })(), + (() => { + const disabled = !includes_js(languages) || project_type !== 'backend'; + return { + name: 'NestJS', + value: 'nestjs', + checked: defaults.technologies?.includes('nestjs') && !disabled, + disabled, + }; + })(), + (() => { + const disabled = !includes_js(languages); + return { + name: 'Jest', + value: 'jest', + checked: + (defaults.technologies?.includes('jest') ?? + includes_js(languages)) && + !disabled, + disabled, + }; + })(), + (() => { + const disabled = false; + return { + name: 'Visual Studio Code', + value: 'vs-code', + checked: + (defaults.technologies?.includes('vs-code') ?? true) && !disabled, + disabled, + }; + })(), + (() => { + const disabled = !includes_js(languages); + return { + name: 'ES Modules', + value: 'esm', + checked: + (defaults.technologies?.includes('esm') ?? true) && !disabled, + disabled, + }; + })(), + ], + }); + + const library = await confirm({ + message: 'Is this a library that other projects will consume?', + default: defaults.library ?? false, + }); + + const lenient = !(await confirm({ + message: 'Use strict configs & rulesets?', + default: !(defaults.lenient ?? false), + })); + + const overwrite = await confirm({ + message: 'Overwrite existing config files?', + default: defaults.overwrite ?? true, + }); + + let input_dir: string | undefined; + let output_dir: string | undefined; + if (builder !== 'none') { + input_dir = await input({ + message: 'Input directory', + default: defaults.input_dir ?? 'src/', + }); + output_dir = await input({ + message: 'Output directory', + default: defaults.output_dir ?? 'dist/', + }); + } + + const config: CodeStyleSetupOptions = { + project_type, + languages, + runtime, + builder, + input_dir, + output_dir, + technologies, + library, + lenient, + overwrite, + }; + + if ( + !(await confirm({ + message: 'Do all your choices look good?', + default: true, + })) + ) { + console.info('Restarting config selectionโ€ฆ'); + await interactive_setup(config); + return; + } + + await save_rc(config); + + await build(config); +} diff --git a/packages/create-configs/src/rc-file.ts b/packages/create-configs/src/rc-file.ts new file mode 100644 index 00000000..3d2617d8 --- /dev/null +++ b/packages/create-configs/src/rc-file.ts @@ -0,0 +1,56 @@ +import { access, readFile, writeFile } from 'node:fs/promises'; +import { URL } from 'node:url'; +import { parse, stringify } from 'yaml'; +import type { CodeStyleSetupOptions } from '@code-style/code-style/config-types'; + +export const default_config_path = '.codestyleinitrc.yaml'; + +export interface LoadRCOptions { + config_path?: string; + throw_no_config?: boolean; +} +export async function load_rc({ + config_path = default_config_path, + throw_no_config = false, +}: LoadRCOptions = {}): Promise> { + const found = await access(config_path) + .then(() => true) + .catch(() => false); + if (found) { + return readFile(config_path) + .then((buf) => buf.toString()) + .then>( + (str) => (parse(str) ?? {}) as Partial, + ) + .catch((err) => { + if (throw_no_config) throw err; + else return {}; + }); + } else if (throw_no_config) { + throw new Error(); + } else { + return {}; + } +} + +export interface SaveRCOptions { + config_path?: string; +} +export async function save_rc( + config: Partial, + { config_path = default_config_path }: SaveRCOptions = {}, +): Promise { + const package_version = await readFile( + new URL('../package.json', import.meta.url).pathname, + ) + .then((buf) => buf.toString()) + .then>( + (str) => JSON.parse(str) as Record, + ) + .then((pkg) => pkg.version as string); + + const header = `# yaml-language-server: $schema=https://github.com/dudeofawesome/code-style/releases/download/v${package_version}/codestylerc.schema.json`; + const contents = `${header}\n\n${stringify(config)}`; + + await writeFile(config_path, contents); +} diff --git a/packages/create-configs/src/steps/dependencies.ts b/packages/create-configs/src/steps/dependencies.ts new file mode 100644 index 00000000..e1d53572 --- /dev/null +++ b/packages/create-configs/src/steps/dependencies.ts @@ -0,0 +1,225 @@ +import { log } from 'node:console'; +import { promisify } from 'node:util'; +import { exec as execCallback } from 'node:child_process'; + +import { + ProjectType, + Language, + Technology, + Builder, + Runtime, + CodeStyleSetupOptions as SetupOptions, +} from '@code-style/code-style/config-types'; + +const exec = promisify(execCallback); + +export async function uninstall_duplicate_dependencies({ + runtime, +}: Pick): Promise { + const packages = [ + 'prettier', + 'prettier-plugin-packagejson', + 'eslint', + 'eslint-config-prettier', + 'eslint-plugin-prettier', + 'eslint-plugin-promise', + 'eslint-plugin-i', + 'eslint-plugin-import', + 'eslint-plugin-json-files', + 'eslint-plugin-jest', + 'eslint-plugin-n', + 'eslint-plugin-node', + 'eslint-plugin-jsx-a11y', + 'eslint-plugin-react', + 'eslint-plugin-react-hooks', + '@typescript-eslint/eslint-plugin', + '@typescript-eslint/parser', + 'tslib', + 'typescript', + 'ts-jest', + ]; + + const uninstall_cmd = ((): string => { + switch (runtime) { + case 'bun': + return 'bun uninstall'; + case 'nodejs': + default: + return 'npm uninstall'; + } + })(); + + await exec(`${uninstall_cmd} ${packages.join(' ')}`); +} + +export type InstallDependenciesOptions = { + project_type: ProjectType; + languages: Language[]; + technologies: Technology[]; + builder: Builder; + runtime?: Runtime; +}; +export async function install_dependencies({ + project_type, + languages, + technologies, + builder, + runtime, +}: InstallDependenciesOptions) { + const prod_packages: (string | undefined)[] = []; + const dev_packages: (string | undefined)[] = [ + '@code-style/code-style@latest', + '@code-style/eslint-config@latest', + '@code-style/eslint-npm-hoist-packages@latest', + ]; + + switch (project_type) { + case 'web-app': + if (technologies.includes('nextjs')) { + dev_packages.push( + '@code-style/eslint-config-nextjs@latest', + '@code-style/eslint-npm-hoist-packages-nextjs@latest', + ); + } else if (technologies.includes('react')) { + dev_packages.push( + '@code-style/eslint-config-react@latest', + '@code-style/eslint-npm-hoist-packages-react@latest', + ); + } else { + dev_packages.push('@code-style/eslint-config-browser@latest'); + } + break; + case 'backend': + if (languages.includes('ts')) dev_packages.push('@types/node'); + dev_packages.push( + '@code-style/eslint-config-node@latest', + '@code-style/eslint-npm-hoist-packages-node@latest', + ); + break; + case 'cli': + if (languages.includes('ts')) dev_packages.push('@types/node'); + dev_packages.push('@code-style/eslint-config-cli@latest'); + break; + } + + if (languages.includes('js') || languages.includes('ts')) { + dev_packages.push('@code-style/typescript-configs@latest'); + } + + for (const language of languages) { + switch (language) { + case 'ts': + dev_packages.push( + 'typescript', + '@code-style/eslint-config-typescript@latest', + '@code-style/eslint-npm-hoist-packages-typescript@latest', + ); + break; + case 'css': + dev_packages.push('@code-style/stylelint-config@latest'); + break; + case 'scss': + dev_packages.push( + 'sass-embedded', + '@code-style/stylelint-config@latest', + '@code-style/stylelint-config-scss@latest', + ); + break; + default: + } + } + + for (const tech of technologies) { + switch (tech) { + case 'jest': + dev_packages.push( + 'jest', + '@types/jest', + '@code-style/eslint-config-jest@latest', + '@code-style/eslint-npm-hoist-packages-jest@latest', + ); + if (languages.includes('ts')) dev_packages.push('ts-jest@latest'); + break; + case 'react': + case 'nextjs': + prod_packages.push('react', 'react-dom'); + if (languages.includes('ts')) { + dev_packages.push('@types/react', '@types/react-dom'); + } + + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (tech === 'nextjs') { + prod_packages.push('next'); + } + break; + case 'nestjs': + dev_packages.push('@code-style/eslint-config-nest@latest'); + break; + case 'esm': + dev_packages.push( + '@code-style/eslint-config-esmodule@latest', + '@code-style/eslint-npm-hoist-packages-esmodule@latest', + ); + break; + default: + } + } + + switch (builder) { + case 'babel': + dev_packages.push('babel@latest'); + break; + case 'esbuild': + dev_packages.push('esbuild@latest'); + break; + case 'swc': + dev_packages.push('@swc/cli@latest', '@swc/core@latest'); + break; + case 'tsc': // we already added typescript + case 'bun': // bun is not installed via npm + case 'none': // this one is pretty obvious + default: + } + + log( + `Installing ${(prod_packages.length > 0 + ? prod_packages + : ['no prod packages'] + ).join(', ')} & ${dev_packages.join(', ')}`, + ); + + const install_cmd = ((): string => { + switch (runtime) { + case 'bun': + return 'bun install'; + case 'nodejs': + default: + return 'npm install'; + } + })(); + const install_cmd_prod = ((): string => { + switch (runtime) { + case 'bun': + return `${install_cmd} --production`; + case 'nodejs': + default: + return `${install_cmd} --save-prod`; + } + })(); + const install_cmd_dev = ((): string => { + switch (runtime) { + case 'bun': + return `${install_cmd} --development`; + case 'nodejs': + default: + return `${install_cmd} --save-dev`; + } + })(); + + if (prod_packages.length > 0) { + await exec(`${install_cmd_prod} ${prod_packages.join(' ')}`); + } + if (dev_packages.length > 0) { + await exec(`${install_cmd_dev} ${dev_packages.join(' ')}`); + } +} diff --git a/packages/create-configs/src/steps/editor.ts b/packages/create-configs/src/steps/editor.ts new file mode 100644 index 00000000..326a6d65 --- /dev/null +++ b/packages/create-configs/src/steps/editor.ts @@ -0,0 +1,171 @@ +import { mkdir, readFile } from 'node:fs/promises'; +import json5 from 'json5'; +import { stripIndent } from 'common-tags'; +import { + ProjectType, + Language, + Technology, +} from '@code-style/code-style/config-types'; + +import { create_file, prettify, verify_missing } from '../utils.js'; + +export interface LaunchJson { + configurations?: LaunchConfiguration[]; +} + +export interface LaunchConfiguration { + type: string; + request: string; + name: string; + skipFiles?: string[]; + restart?: boolean; + continueOnAttach?: boolean; +} + +export async function create_vscode_config( + project_type: ProjectType, + languages: Language[], + technologies: Technology[], + overwrite: boolean = false, +) { + await mkdir('.vscode/').catch(() => {}); + + await Promise.allSettled([ + Promise.resolve('.vscode/settings.json') + .then((path) => + verify_missing({ path, remove: false, reject: true }).then(() => path), + ) + .then(async (path) => + create_file( + path, + await prettify( + path, + JSON.stringify({ + // bring in existing settings + ...(await readFile(path) + .catch(() => '{}') + .then((buf) => buf.toString()) + .then((str) => json5.parse>(str)) + .catch(() => ({}) as Record)), + + ...{ + 'editor.formatOnSave': true, + 'editor.formatOnType': true, + 'editor.formatOnPaste': true, + 'editor.defaultFormatter': 'esbenp.prettier-vscode', + }, + + ...(languages.includes('js') || languages.includes('ts') + ? { + 'typescript.format.enable': false, + 'javascript.format.enable': false, + + 'typescript.tsdk': './node_modules/typescript/lib', + } + : {}), + ...(languages.includes('rb') + ? { + '[ruby]': { + 'editor.defaultFormatter': 'esbenp.prettier-vscode', + }, + } + : {}), + }), + ), + overwrite, + ), + ), + + Promise.resolve('.vscode/extensions.json') + .then((path) => + verify_missing({ path, remove: overwrite, reject: true }).then( + () => path, + ), + ) + .then(async (path) => + create_file( + path, + await prettify( + path, + stripIndent` + // A list of recommended extensions for this workspace. + ${JSON.stringify({ + recommendations: [ + ...['editorconfig.editorconfig', 'esbenp.prettier-vscode'], + + ...(languages.includes('js') || languages.includes('ts') + ? ['dbaeumer.vscode-eslint'] + : []), + ...(languages.includes('rb') + ? ['Shopify.ruby-lsp', 'castwide.solargraph'] + : []), + ...(languages.includes('py') + ? [ + 'ms-python.black-formatter', + 'ms-python.python', + 'ms-python.vscode-pylance', + ] + : []), + ...(languages.includes('css') || languages.includes('scss') + ? ['stylelint.vscode-stylelint'] + : []), + + ...(technologies.includes('jest') + ? ['Orta.vscode-jest'] + : []), + ], + })} + `, + ), + ), + ), + + Promise.resolve('.vscode/launch.json') + .then((path) => + verify_missing({ path, remove: false, reject: true }).then(() => path), + ) + .then(async (path) => { + // bring in existing settings + const existing = await readFile(path) + .catch(() => '{}') + .then((buf) => buf.toString()) + .then((str) => json5.parse(str)) + .catch(() => ({}) as LaunchJson); + + function is_attach(cfg: LaunchConfiguration): boolean { + return cfg.name === 'Attach'; + } + + return create_file( + path, + await prettify( + path, + stripIndent` + // https://code.visualstudio.com/Docs/editor/debugging#_launch-configurations + ${JSON.stringify({ + ...existing, + configurations: [ + ...(existing.configurations ?? []), + ...((languages.includes('js') || languages.includes('ts')) && + ['backend', 'cli'].includes(project_type) && + !existing.configurations?.some(is_attach) + ? [ + { + type: 'node', + request: 'attach', + name: 'Attach', + skipFiles: ['/**'], + restart: true, + continueOnAttach: true, + }, + ] + : []), + ], + } as LaunchJson)} + `, + ), + overwrite, + ); + }), + ]); +} diff --git a/packages/create-configs/src/steps/formatting.ts b/packages/create-configs/src/steps/formatting.ts new file mode 100644 index 00000000..9fef8740 --- /dev/null +++ b/packages/create-configs/src/steps/formatting.ts @@ -0,0 +1,34 @@ +import { stat, symlink } from 'node:fs/promises'; +import { stripIndent } from 'common-tags'; +import { create_file, verify_missing } from '../utils.js'; + +export async function create_prettier_config(overwrite: boolean = false) { + const preferred = '.prettierrc.mjs'; + const paths = [ + preferred, + /^\.?prettier(rc|\.config)?(\.(json[5c]?|ya?ml|toml|[mc]?js))?$/u, + ]; + if (await verify_missing({ path: paths, remove: overwrite })) { + await create_file( + preferred, + stripIndent` + /** + * https://prettier.io/docs/en/ + * Prettier configuration file + * In order to update the this config, update @code-style/code-style + */ + import config from '@code-style/code-style/prettierrc'; + export default config; + `, + ); + } +} + +export async function create_editor_config(overwrite: boolean = false) { + const path = '.editorconfig'; + if (await verify_missing({ path, remove: overwrite })) { + if (!(await stat(path).catch(() => ({ isFile: () => false }))).isFile()) { + await symlink('node_modules/@code-style/code-style/.editorconfig', path); + } + } +} diff --git a/packages/create-configs/src/steps/git.spec.ts b/packages/create-configs/src/steps/git.spec.ts new file mode 100644 index 00000000..6bea6809 --- /dev/null +++ b/packages/create-configs/src/steps/git.spec.ts @@ -0,0 +1,164 @@ +import { describe, it, expect } from '@jest/globals'; +import { gitignore_sets, _generate_gitignore } from './git.js'; + +describe('git', () => { + describe('gitignore_sets', () => { + describe(gitignore_sets.reports.name, () => { + it(`should add diagnostic reports for node`, () => { + expect(gitignore_sets.reports({ languages: ['js'] })).toContain( + 'report.[', + ); + }); + it(`should not add diagnostic reports`, () => { + expect(gitignore_sets.reports({ languages: [] })).toBeUndefined(); + }); + }); + + describe(gitignore_sets.dependencies.name, () => { + it(`should add node_modules for node`, () => { + expect(gitignore_sets.dependencies({ languages: ['js'] })).toContain( + 'node_modules', + ); + }); + it(`should not add node_modules`, () => { + expect(gitignore_sets.dependencies({ languages: [] })).toBeUndefined(); + }); + }); + + describe(gitignore_sets.compiled.name, () => { + it(`should add build dir`, () => { + expect(gitignore_sets.compiled(['build'])).toContain('build'); + }); + it(`should not add anything`, () => { + expect(gitignore_sets.compiled([])).toBeUndefined(); + }); + }); + + describe(gitignore_sets.logs.name, () => { + it(`should add logs dir`, () => { + expect(gitignore_sets.logs({ languages: [] })).toContain('*.log'); + }); + it(`should add npm logs`, () => { + expect(gitignore_sets.logs({ languages: ['js'] })).toContain( + 'npm-debug.log', + ); + }); + }); + + describe(gitignore_sets.caches.name, () => { + it(`should add ts cache dir`, () => { + expect( + gitignore_sets.caches({ + languages: ['ts'], + technologies: [], + builder: 'tsc', + }), + ).toContain('.tsbuildinfo'); + }); + it(`should add eslint cache dir`, () => { + expect( + gitignore_sets.caches({ + languages: ['js'], + technologies: [], + builder: 'none', + }), + ).toContain('.eslintcache'); + }); + it(`should add stylelint cache dir`, () => { + expect( + gitignore_sets.caches({ + languages: ['css'], + technologies: [], + builder: 'none', + }), + ).toContain('.stylelintcache'); + }); + it(`should add next cache dir`, () => { + expect( + gitignore_sets.caches({ + languages: ['ts'], + technologies: ['nextjs'], + builder: 'tsc', + }), + ).toContain('.next/'); + }); + }); + + describe(gitignore_sets.testing.name, () => { + it(`should add coverage dir`, () => { + expect(gitignore_sets.testing({ languages: [] })).toContain('coverage'); + }); + it(`should add lcov`, () => { + expect(gitignore_sets.testing({ languages: ['js'] })).toContain( + '.lcov', + ); + }); + }); + + describe(gitignore_sets.secrets.name, () => { + it(`should add .env`, () => { + expect(gitignore_sets.secrets({ languages: [] })).toContain('.env'); + }); + it(`should add lcov`, () => { + expect(gitignore_sets.secrets({ languages: ['js'] })).toContain( + '.npmrc', + ); + }); + }); + }); + + describe(_generate_gitignore.name, () => { + it('should build basic gitignore', () => { + const basic = _generate_gitignore({ + languages: [], + project_type: 'backend', + technologies: [], + builder: 'none', + }); + + expect(basic).toContain('.vscode'); + expect(basic).toContain('.DS_Store'); + }); + + it('should build nodejs gitignore', () => { + const nodejs = _generate_gitignore({ + languages: ['js'], + project_type: 'backend', + technologies: [], + builder: 'none', + }); + + expect(nodejs).toContain('.vscode'); + expect(nodejs).toContain('.DS_Store'); + expect(nodejs).toContain('node_modules'); + expect(nodejs).toContain('.eslintcache'); + expect(nodejs).toContain('.lcov'); + }); + + it('should build typescript gitignore', () => { + const web = _generate_gitignore({ + languages: ['ts'], + project_type: 'web-app', + technologies: [], + builder: 'tsc', + }); + + expect(web).toContain('.vscode'); + expect(web).toContain('.DS_Store'); + expect(web).toContain('node_modules'); + expect(web).toContain('.eslintcache'); + expect(web).toContain('tsbuildinfo'); + }); + + it('should have no lines with leading spaces', () => { + const react = _generate_gitignore({ + languages: ['ts'], + project_type: 'web-app', + technologies: ['react'], + builder: 'tsc', + }); + + expect(react).not.toMatch(/^\s+\S+$/gmu); + }); + }); +}); diff --git a/packages/create-configs/src/steps/git.ts b/packages/create-configs/src/steps/git.ts new file mode 100644 index 00000000..bee9d404 --- /dev/null +++ b/packages/create-configs/src/steps/git.ts @@ -0,0 +1,136 @@ +import { stripIndent, stripIndents } from 'common-tags'; +import { CodeStyleSetupOptions as SetupOptions } from '@code-style/code-style/config-types'; + +import { create_file, includes_js, verify_missing } from '../utils.js'; + +export const gitignore_sets = { + reports: ({ languages }: Pick) => + includes_js(languages) + ? stripIndent` + # Diagnostic reports (https://nodejs.org/api/report.html) + report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + ` + : undefined, + dependencies: ({ languages }: Pick) => + includes_js(languages) + ? stripIndent` + # dependencies + node_modules/ + .npm + ` + : undefined, + compiled: (compiled_paths: (string | undefined)[]) => { + const filtered_paths = compiled_paths.filter(Boolean); + return filtered_paths.length > 0 + ? stripIndents` + # compiled output + ${filtered_paths.join('\n')} + ` + : undefined; + }, + logs: ({ languages }: Pick) => + stripIndents` + # logs + logs/ + *.log + ${ + includes_js(languages) + ? stripIndents` + npm-debug.log* + pnpm-debug.log* + yarn-debug.log* + yarn-error.log* + ` + : '' + } + `.trim(), + caches: ({ + languages, + builder, + technologies, + }: Pick) => stripIndents` + # caches + ${[ + includes_js(languages) ? '.eslintcache' : null, + // TODO(0): is this actually the right file + '.prettiercache', + languages.includes('ts') ? '*.tsbuildinfo' : null, + languages.includes('css') || languages.includes('scss') + ? '.stylelintcache' + : null, + technologies.includes('nextjs') ? '.next/' : null, + builder === 'esbuild' ? '.esbuild/' : null, + ] + .filter((l) => l != null) + .join('\n')} + `, + os: stripIndent` + # OS + .DS_Store + thumbs.db + `, + testing: ({ languages }: Pick) => + stripIndents` + # test output + /coverage + ${ + includes_js(languages) + ? stripIndent` + /.nyc_output + *.lcov + ` + : '' + } + `.trim(), + IDEs: stripIndents` + # IDEs and editors + .vscode/* + !.vscode/settings.json + !.vscode/tasks.json + !.vscode/launch.json + !.vscode/extensions.json + *.sublime-workspace + `, + secrets: ({ languages }: Pick) => + stripIndents` + # Secrets + *.env + *.env.* + *.bin + *.key + *_accessKeys.csv + ${includes_js(languages) ? '.npmrc' : ''} + `.trim(), +}; + +type Options = Pick< + SetupOptions, + 'project_type' | 'languages' | 'technologies' | 'output_dir' | 'builder' +>; + +/** @private */ +export function _generate_gitignore(options: Options): string { + return [ + gitignore_sets.compiled([options.output_dir]), + gitignore_sets.dependencies(options), + gitignore_sets.logs(options), + gitignore_sets.reports(options), + gitignore_sets.caches(options), + gitignore_sets.testing(options), + gitignore_sets.os, + gitignore_sets.IDEs, + gitignore_sets.secrets(options), + ] + .filter((s) => s != null && s.trim() !== '') + .join('\n\n'); +} + +export async function create_gitignore( + options: Options, + overwrite: boolean = true, +) { + const path = '.gitignore'; + if (await verify_missing({ path, remove: overwrite })) { + return create_file(path, _generate_gitignore(options)); + } +} diff --git a/packages/create-configs/src/steps/language-configuration.ts b/packages/create-configs/src/steps/language-configuration.ts new file mode 100644 index 00000000..1e4ac84c --- /dev/null +++ b/packages/create-configs/src/steps/language-configuration.ts @@ -0,0 +1,158 @@ +import { exec as execCallback } from 'node:child_process'; +import { promisify } from 'node:util'; +import { stripIndent } from 'common-tags'; +import { CodeStyleSetupOptions as SetupOptions } from '@code-style/code-style/config-types'; + +import { create_file, prettify, verify_missing } from '../utils.js'; + +const exec = promisify(execCallback); + +/** @private */ +export function _generate_ts_config({ + project_type, + technologies, + library, + input_dir, + output_dir, + lenient, +}: Omit): string { + const config = { + extends: [] as string[], + compilerOptions: { + baseUrl: './', + outDir: output_dir, + }, + include: [input_dir], + exclude: [output_dir], + }; + + switch (project_type) { + case 'web-app': + config.extends.push('@code-style/typescript-configs/roles/browser'); + if (technologies.includes('nextjs')) { + config.extends.push('@code-style/typescript-configs/layers/nextjs'); + } else if (technologies.includes('react')) { + config.extends.push('@code-style/typescript-configs/layers/react'); + } + break; + case 'backend': + case 'cli': + if (technologies.includes('nestjs')) { + config.extends.push('@code-style/typescript-configs/roles/nest'); + } else { + config.extends.push('@code-style/typescript-configs/roles/node'); + } + break; + } + + if (technologies.includes('esm')) { + config.extends.push('@code-style/typescript-configs/layers/esmodule'); + } + + if (library) { + config.extends.push('@code-style/typescript-configs/layers/library'); + } + + // TODO(2): add support for library.json tsconfig + + if (lenient) { + config.extends.push('@code-style/typescript-configs/layers/lenient'); + } + + return stripIndent` + // In order to update the this config, update @code-style/typescript-configs + ${JSON.stringify(config, null, 2)} + `; +} + +export type CreateTSConfigOptions = Pick< + SetupOptions, + | 'project_type' + | 'technologies' + | 'library' + | 'input_dir' + | 'output_dir' + | 'overwrite' + | 'lenient' +>; +export async function create_ts_config({ + project_type, + technologies, + library, + input_dir, + output_dir, + overwrite = true, + lenient, +}: CreateTSConfigOptions) { + // TODO(2): create a separate tsconfig for tests + // if (technologies.includes('jest')) { + // config.extends.push('@code-style/typescript-configs/layers/jest.json'); + // } + + const path = 'tsconfig.json'; + if (await verify_missing({ path, remove: overwrite })) { + await create_file( + path, + await prettify( + path, + _generate_ts_config({ + project_type, + technologies, + library, + input_dir, + output_dir, + lenient, + }), + ), + ); + } +} + +export async function set_package_type({ + technologies, + library, +}: Pick) { + const type: 'commonjs' | 'module' = + technologies.includes('esm') && !library && !technologies.includes('nestjs') + ? 'module' + : 'commonjs'; + await exec(`npm pkg set type='${type}'`); +} + +/** @private */ +export function _generate_jest_config({ + technologies, +}: Omit): string { + return stripIndent` + import { config } from '@code-style/jest-configs/ts-${technologies.includes('esm') ? 'esm' : 'cjs'}'; + + // eslint-disable-next-line import/no-default-export + export default config; + `; +} + +export type CreateJestConfigOptions = Pick< + SetupOptions, + 'languages' | 'technologies' | 'overwrite' +>; +export async function create_jest_config({ + languages, + technologies, + overwrite, +}: CreateJestConfigOptions) { + if (languages.includes('ts')) { + const path = 'jest.config.mjs'; + if (await verify_missing({ path, remove: overwrite })) { + await create_file( + path, + await prettify( + path, + _generate_jest_config({ + languages, + technologies, + }), + ), + ); + } + } +} diff --git a/packages/create-configs/src/steps/lint-configuration.spec.ts b/packages/create-configs/src/steps/lint-configuration.spec.ts new file mode 100644 index 00000000..4a3bf226 --- /dev/null +++ b/packages/create-configs/src/steps/lint-configuration.spec.ts @@ -0,0 +1,81 @@ +import { describe, it, expect } from '@jest/globals'; +import { parse } from 'yaml'; +import { + _generate_eslint_config, + _transform_eslint_package_name, +} from './lint-configuration.js'; + +describe('lint-configuration', () => { + describe(_generate_eslint_config.name, () => { + it(`should generate valid config`, () => { + const output = _generate_eslint_config({ + project_type: 'web-app', + languages: ['ts'], + technologies: ['jest'], + lenient: false, + }); + // ensure output is valid YAML + expect(() => parse(output) as unknown).not.toThrow(); + const parsed: { root: boolean; extends: string[] } = parse( + output, + ) as typeof parsed; + + // ensure we have a leading comment + expect(output).toMatch(/^#/u); + // ensure config is set to root + expect(parsed.root).toBe(true); + // ensure we include relevant configs + expect(parsed.extends).toStrictEqual([ + '@code-style/eslint-config', + '@code-style/eslint-config-browser', + '@code-style/eslint-config-typescript', + '@code-style/eslint-config-jest', + ]); + }); + + it(`should generate valid lenient config`, () => { + const output = _generate_eslint_config({ + project_type: 'web-app', + languages: ['ts'], + technologies: ['jest'], + lenient: true, + }); + // ensure output is valid YAML + expect(() => parse(output) as unknown).not.toThrow(); + const parsed: { root: boolean; extends: string[] } = parse( + output, + ) as typeof parsed; + + // ensure we have a leading comment + expect(output).toMatch(/^#/u); + // ensure config is set to root + expect(parsed.root).toBe(true); + // ensure we include relevant configs + expect(parsed.extends).toStrictEqual([ + '@code-style/eslint-config', + '@code-style/eslint-config/lenient', + '@code-style/eslint-config-browser', + '@code-style/eslint-config-typescript', + '@code-style/eslint-config-typescript/lenient', + '@code-style/eslint-config-jest', + '@code-style/eslint-config-jest/lenient', + ]); + }); + }); + + describe(_transform_eslint_package_name.name, () => { + it(`should transform eslint package names`, () => { + expect(_transform_eslint_package_name('foo')).toEqual( + 'eslint-config-foo', + ); + + expect(_transform_eslint_package_name('@foo')).toEqual( + '@foo/eslint-config', + ); + + expect(_transform_eslint_package_name('@foo/bar')).toEqual( + '@foo/eslint-config-bar', + ); + }); + }); +}); diff --git a/packages/create-configs/src/steps/lint-configuration.ts b/packages/create-configs/src/steps/lint-configuration.ts new file mode 100644 index 00000000..f5882b89 --- /dev/null +++ b/packages/create-configs/src/steps/lint-configuration.ts @@ -0,0 +1,179 @@ +import { stringify } from 'yaml'; +import type { ESLint } from 'eslint'; +import type { Config } from 'stylelint'; +import { stripIndent } from 'common-tags'; +import { + CodeStyleSetupOptions as SetupOptions, + Language, +} from '@code-style/code-style/config-types'; + +import { create_file, prettify, verify_missing } from '../utils.js'; + +/** @private */ +export function _transform_eslint_package_name(extend: string): string { + if (extend.includes('eslint-config')) return extend; + + if (extend.startsWith('@')) { + return extend + .replace(/^(@[^/]+)\/(\S+)$/iu, '$1/eslint-config-$2') + .replace(/^(@[^/]+)$/iu, '$1/eslint-config'); + } else { + return extend.replace(/^([^@/]+)$/iu, 'eslint-config-$1'); + } +} + +/** @private */ +export function _generate_dependency_list(config: ESLint.ConfigData): string[] { + if (Array.isArray(config.extends)) { + return config.extends.map(_transform_eslint_package_name); + } else if (typeof config.extends === 'string') { + return [_transform_eslint_package_name(config.extends)]; + } else { + return []; + } +} + +/** @private */ +export function _generate_eslint_config({ + project_type, + languages, + technologies, + lenient, +}: Pick< + SetupOptions, + 'project_type' | 'languages' | 'technologies' | 'lenient' +>): string { + const config: ESLint.ConfigData & { extends: string[] } = { + root: true, + extends: ['@code-style/eslint-config'], + parserOptions: { + ecmaVersion: 2022, + }, + }; + if (lenient) config.extends.push('@code-style/eslint-config/lenient'); + + switch (project_type) { + case 'web-app': + config.extends.push('@code-style/eslint-config-browser'); + + if (technologies.includes('react') || technologies.includes('nextjs')) + config.extends.push('@code-style/eslint-config-react'); + if (technologies.includes('nextjs')) + config.extends.push('@code-style/eslint-config-nextjs'); + break; + case 'backend': + config.extends.push('@code-style/eslint-config-node'); + if (lenient) + config.extends.push('@code-style/eslint-config-node/lenient'); + + if (technologies.includes('nestjs')) { + config.extends.push('@code-style/eslint-config-nest'); + if (lenient) + config.extends.push('@code-style/eslint-config-nest/lenient'); + } + break; + case 'cli': + config.extends.push('@code-style/eslint-config-node'); + if (lenient) + config.extends.push('@code-style/eslint-config-node/lenient'); + + config.extends.push('@code-style/eslint-config-cli'); + if (lenient) config.extends.push('@code-style/eslint-config-cli/lenient'); + break; + } + + if (languages.includes('ts')) { + config.extends.push('@code-style/eslint-config-typescript'); + if (lenient) + config.extends.push('@code-style/eslint-config-typescript/lenient'); + } + + if (technologies.includes('jest')) { + config.extends.push('@code-style/eslint-config-jest'); + if (lenient) config.extends.push('@code-style/eslint-config-jest/lenient'); + } + + if (technologies.includes('esm')) + config.extends.push('@code-style/eslint-config-esmodule'); + + return stripIndent` + # In order to update the this config, update: +${_generate_dependency_list(config) + .map((p) => `# ${p}`) + .join('\n')} +${stringify(config)} + `; +} + +export async function create_eslint_config({ + project_type, + languages, + technologies, + lenient, + overwrite = true, +}: Pick< + SetupOptions, + 'project_type' | 'languages' | 'technologies' | 'lenient' | 'overwrite' +>) { + const preferred = '.eslintrc.yaml'; + if ( + await verify_missing({ + path: [preferred, /^\.?eslint(rc|\.config)\.([mc]?js|ya?ml|json)$/u], + remove: overwrite, + }) + ) { + return create_file( + preferred, + await prettify( + preferred, + _generate_eslint_config({ + project_type, + languages, + technologies, + lenient, + }), + ), + ); + } +} + +/** @private */ +export function _generate_stylelint_config(languages: Language[]): string { + const config: Config & { extends: string[] } = { + extends: ['@code-style/stylelint-config'], + }; + + if (languages.includes('scss')) { + config.extends.push('@code-style/stylelint-config-scss'); + } + + return stripIndent` + # In order to update the this config, update ${ + Array.isArray(config.extends) ? config.extends.join(', ') : config.extends + } + + ${stringify(config)} + `; +} + +export async function create_stylelint_config({ + languages, + lenient, + overwrite = true, +}: Pick) { + const preferred = '.stylelintrc.yaml'; + if ( + await verify_missing({ + path: [ + preferred, + /^\.?stylelint(\.config|rc)(\.([cm]?js|json|ya?ml))?$/u, + ], + remove: overwrite, + }) + ) { + return create_file( + preferred, + await prettify(preferred, _generate_stylelint_config(languages)), + ); + } +} diff --git a/packages/create-configs/src/steps/scripts.spec.ts b/packages/create-configs/src/steps/scripts.spec.ts new file mode 100644 index 00000000..e960965f --- /dev/null +++ b/packages/create-configs/src/steps/scripts.spec.ts @@ -0,0 +1,16 @@ +import { describe, it, expect } from '@jest/globals'; +import { _generate_lint_script } from './scripts.js'; + +describe('scripts', () => { + describe(_generate_lint_script.name, () => { + it(`should create lint scripts`, () => { + const output = _generate_lint_script({ + builder: 'esbuild', + languages: ['ts'], + technologies: ['react'], + }); + expect(output.lint).toMatch(/concurrently.+"npm:lint:\*"/u); + expect(output['lint:js']).toMatch(/^eslint/u); + }); + }); +}); diff --git a/packages/create-configs/src/steps/scripts.ts b/packages/create-configs/src/steps/scripts.ts new file mode 100644 index 00000000..feafc5e7 --- /dev/null +++ b/packages/create-configs/src/steps/scripts.ts @@ -0,0 +1,188 @@ +import { exec as execCallback } from 'node:child_process'; +import { promisify } from 'node:util'; + +import { + CodeStyleSetupOptions as SetupOptions, + Builder, + Language, +} from '@code-style/code-style/config-types'; +import { includes_js, verify_missing_script } from '../utils.js'; + +const exec = promisify(execCallback); + +const concurrently_opts = '--group --prefix none'; + +export type AddNPMScriptsOptions = Pick< + SetupOptions, + 'languages' | 'technologies' | 'builder' | 'runtime' | 'overwrite' +>; + +export async function add_npm_scripts(options: AddNPMScriptsOptions) { + await exec(`npm install --save-dev concurrently`); + + // TODO(2): add npm script for build, prepublishOnly + // await set_build_script(options); + await set_lint_script(options); + await set_test_script(options); + await set_check_script(options); +} + +export async function set_build_script({ + languages, + technologies, + builder, + overwrite = false, +}: AddNPMScriptsOptions) { + if (await verify_missing_script({ json_path: 'scripts.build', overwrite })) { + if (technologies.includes('nestjs')) { + await exec(`npm pkg set scripts.build='nest build'`); + } else { + const build_step: Set | 'scss'> = + new Set(); + switch (builder) { + case 'babel': + case 'esbuild': + case 'swc': + case 'tsc': + build_step.add(builder); + break; + default: + } + if (languages.includes('scss')) { + build_step.add('scss'); + } + + if (build_step.has('esbuild')) { + if (languages.includes('scss')) { + // + } else { + // + } + } + const script = ''; + await exec(`npm pkg set scripts.build='${script}'`); + } + } +} + +type LintScripts = Record<`lint:${string}`, string>; + +/** @private */ +export function _generate_lint_script({ + languages, + technologies, + builder, +}: Omit): { + [key: `lint:${string}`]: string; + lint: string; +} { + const linters: Set<'eslint' | 'stylelint' | 'tsc'> = new Set(); + if (includes_js(languages)) linters.add('eslint'); + if (languages.includes('ts') && builder !== 'tsc') linters.add('tsc'); + if (languages.includes('css') || languages.includes('scss')) { + linters.add('eslint'); + } + + const steps: LintScripts = Array.from(linters.values()).reduce( + (scripts, linter) => { + switch (linter) { + case 'eslint': + return { + ...scripts, + 'lint:js': `eslint . --ext ${languages + .filter((l) => ['js', 'ts'].includes(l)) + .reduce((extensions, ext) => { + return [ + ...extensions, + ...(technologies.includes('react') + ? [ext] + : [ext, `${ext}x`]), + 'json', + ]; + }, []) + .join(',')} --cache`, + }; + case 'stylelint': + return { + ...scripts, + 'lint:css': `stylelint **/*.{${languages + .filter((l) => ['css' as Language, 'scss'].includes(l)) + .join(',')}}`, + }; + case 'tsc': + return { ...scripts, 'lint:types': 'tsc --noEmit --pretty true' }; + default: + throw new TypeError(`Unexpected linter type "${linter as string}"`); + } + }, + {}, + ); + + return { + ...steps, + lint: `concurrently ${concurrently_opts} "npm:lint:*"`, + }; +} + +export async function set_lint_script(options: AddNPMScriptsOptions) { + if ( + await verify_missing_script({ + json_path: 'scripts.lint', + overwrite: options.overwrite, + }) + ) { + const scripts = _generate_lint_script(options); + const command: string = ((runtime): string => { + switch (runtime) { + case 'nodejs': + return `npm pkg set ${Object.entries(scripts) + .map(([name, script]) => `'scripts.${name}'='${script}'`) + .join(' ')}`; + default: + throw new Error(`Unsupported runtime "${runtime}"`); + } + })(options.runtime); + await exec(command); + } +} + +export async function set_test_script(options: AddNPMScriptsOptions) { + if ( + await verify_missing_script({ + json_path: 'scripts.test', + overwrite: options.overwrite, + }) + ) { + const command: string = ((runtime): string => { + switch (runtime) { + case 'nodejs': + return `npm pkg set 'scripts.test'='jest'`; + default: + throw new Error(`Unsupported runtime "${runtime}"`); + } + })(options.runtime); + await exec(command); + } +} + +export async function set_check_script({ + runtime, + overwrite = false, +}: Pick) { + if ( + await verify_missing_script({ + json_path: 'scripts.check', + overwrite: overwrite, + }) + ) { + const command: string = ((runtime): string => { + switch (runtime) { + case 'nodejs': + return `npm pkg set 'scripts.check'='concurrently ${concurrently_opts} "npm:test" "npm:lint"'`; + default: + throw new Error(`Unsupported runtime "${runtime}"`); + } + })(runtime); + await exec(command); + } +} diff --git a/packages/create-configs/src/utils.ts b/packages/create-configs/src/utils.ts new file mode 100644 index 00000000..e4cc0369 --- /dev/null +++ b/packages/create-configs/src/utils.ts @@ -0,0 +1,164 @@ +import { exec as execCallback } from 'node:child_process'; +import { promisify } from 'node:util'; +import { + access, + readlink, + readFile, + readdir, + rm, + stat, + writeFile, +} from 'node:fs/promises'; +import { format, Options } from 'prettier'; +import default_config from '@code-style/code-style/prettierrc'; +import { Language } from '@code-style/code-style/config-types'; + +const exec = promisify(execCallback); + +export async function create_file( + path: string, + content: string, + overwrite = false, +): Promise { + if ( + (await stat(path).catch(() => ({ isFile: () => false }))).isFile() && + !overwrite + ) { + return; + } + + await writeFile(path, ensure_trailing_newline(content), { + // rw- rw- r-- + mode: 0b110110100, + }); +} + +export function ensure_trailing_newline(content: string): string { + return content.at(-1) === '\n' ? content : `${content}\n`; +} + +/** + * @param path The path to check. + * @returns Whether or not the file exists. + */ +export function file_exists(path: string | RegExp): Promise { + if (typeof path === 'string') { + return access(path) + .then(() => [path]) + .catch(() => + // `access` doesn't work well for symlinks, so we need to handle them. + readlink(path) + .then(() => [path]) + .catch(() => false), + ); + } else { + return readdir('.').then((entries) => { + const matches = entries.filter((entry) => entry.match(path)); + return matches.length > 0 ? matches : false; + }); + } +} + +export type VerifyMissingOptions = { + /** The path of the file to possibly delete. */ + path: string | RegExp | (string | RegExp)[]; + /** Whether or not to delete the file should it exist. */ + remove?: boolean; + /** Whether or not the promise should reject upon finding an existing file. */ + reject?: boolean; +}; +/** + * @returns Whether or not the file is missing. + */ +export async function verify_missing({ + path, + remove = false, + reject = false, +}: VerifyMissingOptions): Promise { + const paths = Array.isArray(path) ? path : [path]; + return Promise.all( + paths.map(async (path) => { + const existing_files = await file_exists(path); + if (existing_files !== false) { + if (remove) { + await Promise.all( + existing_files.map((existing_file) => rm(existing_file)), + ); + return true; + } else { + const message = `File "${path}" already exists.`; + if (reject) { + throw new Error(message); + } else { + console.info(message); + return false; + } + } + } else { + return true; + } + }), + ) + .then(() => true) + .catch(() => false); +} + +export type VerifyMissingScriptOptions = Omit< + VerifyMissingOptions, + 'path' | 'remove' +> & { + /** The path of the file to possibly delete. */ + path?: string; + /** The path to key in the JSON file. */ + json_path: string; + /** Whether or not to allow overwriting the key. */ + overwrite: boolean; +}; +/** + * @returns Whether or not the script is missing. + */ +export async function verify_missing_script({ + path, + json_path, + overwrite = false, + reject = false, +}: VerifyMissingScriptOptions): Promise { + if ((await exec(`npm pkg get '${json_path}'`)).stdout.trim() !== '{}') { + if (overwrite) { + return true; + } else { + const message = `Path "${json_path}" already exists.`; + if (reject) { + throw new Error(message); + } else { + console.info(message); + return false; + } + } + } else { + return true; + } +} + +export async function prettify( + path: string, + content?: string, +): Promise { + const config: Options = { + filepath: path, + ...(default_config as Options), + }; + + if (content != null) { + return await format(content, config); + } else { + const source = (await readFile(path)).toString(); + const formatted = await format(source, config); + await writeFile(path, formatted); + return formatted; + } +} + +export function includes_js(languages: Language[]): boolean { + return languages.includes('js') || languages.includes('ts'); +} diff --git a/packages/create-configs/tsconfig.json b/packages/create-configs/tsconfig.json new file mode 100644 index 00000000..3c386d56 --- /dev/null +++ b/packages/create-configs/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule" + ], + "compilerOptions": { + "baseUrl": "src/", + "outDir": "dist/" + }, + "include": ["src/"], + "exclude": ["dist/"] +} diff --git a/packages/eslint-config-browser/README.md b/packages/eslint-config-browser/README.md new file mode 100644 index 00000000..c514babf --- /dev/null +++ b/packages/eslint-config-browser/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-browser + +My browser eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-browser + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-browser' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-browser/base.yaml b/packages/eslint-config-browser/base.yaml new file mode 100644 index 00000000..5c9fc4c2 --- /dev/null +++ b/packages/eslint-config-browser/base.yaml @@ -0,0 +1,2 @@ +env: + browser: true diff --git a/packages/eslint-config-browser/examples/.eslintrc.yaml b/packages/eslint-config-browser/examples/.eslintrc.yaml new file mode 100644 index 00000000..557076fe --- /dev/null +++ b/packages/eslint-config-browser/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style' + - '@code-style/browser' diff --git a/packages/eslint-config-browser/package.json b/packages/eslint-config-browser/package.json new file mode 100644 index 00000000..7a20e2ea --- /dev/null +++ b/packages/eslint-config-browser/package.json @@ -0,0 +1,45 @@ +{ + "name": "@code-style/eslint-config-browser", + "version": "2.0.0-26", + "description": "My browser ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-browser/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-browser" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "devDependencies": { + "tsm": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.49.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-browser/test/index.ts b/packages/eslint-config-browser/test/index.ts new file mode 100644 index 00000000..165ed64a --- /dev/null +++ b/packages/eslint-config-browser/test/index.ts @@ -0,0 +1,30 @@ +import { describe, it } from 'node:test'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { testRuleFail } from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: ['@code-style', '@code-style/browser'], +}); + +void describe('eslint-config-browser', () => { + defaultTestSet(linter); + + void describe('passes', () => {}); + + void describe('fails', () => { + void it(`should fail no-console`, () => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('foo');\n` }], + })); + + void it(`should fail radix`, async () => + testRuleFail({ + linter, + ruleId: 'radix', + files: [{ code: `parseInt('10');\n` }], + })); + }); +}); diff --git a/packages/eslint-config-cli/README.md b/packages/eslint-config-cli/README.md new file mode 100644 index 00000000..b0f8e72a --- /dev/null +++ b/packages/eslint-config-cli/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-cli + +My CLI project eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-cli + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-cli' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-cli/base.yaml b/packages/eslint-config-cli/base.yaml new file mode 100644 index 00000000..0ffb8408 --- /dev/null +++ b/packages/eslint-config-cli/base.yaml @@ -0,0 +1,7 @@ +rules: + # Allow scripts to log with `console`. + # Since we're creating a CLI app, we're probably just trying to show output to the user. + no-console: 'off' + + # Allow scripts to exit. + n/no-process-exit: 'off' diff --git a/packages/eslint-config-cli/examples/.eslintrc.yaml b/packages/eslint-config-cli/examples/.eslintrc.yaml new file mode 100644 index 00000000..a8cff2f3 --- /dev/null +++ b/packages/eslint-config-cli/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style' + - '@code-style/cli' diff --git a/packages/eslint-config-cli/package.json b/packages/eslint-config-cli/package.json new file mode 100644 index 00000000..7849ad26 --- /dev/null +++ b/packages/eslint-config-cli/package.json @@ -0,0 +1,50 @@ +{ + "name": "@code-style/eslint-config-cli", + "version": "2.0.0-26", + "description": "My CLI ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-cli/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-cli" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "@code-style/eslint-config-node": "^2.0.0-26" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.49.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-cli/test/index.ts b/packages/eslint-config-cli/test/index.ts new file mode 100644 index 00000000..8a1b4e63 --- /dev/null +++ b/packages/eslint-config-cli/test/index.ts @@ -0,0 +1,26 @@ +import { describe, it } from 'node:test'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { testNoFail } from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: [ + '@code-style/eslint-config', + '@code-style/eslint-config-node', + '@code-style/eslint-config-cli', + ], +}); + +void describe('eslint-config-cli base', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should pass radix`, () => + testNoFail({ linter, files: [{ code: `parseInt('10');\n` }] })); + + void it(`should pass no-console`, () => + testNoFail({ linter, files: [{ code: `console.log('foo');\n` }] })); + }); + + void describe('fails', () => {}); +}); diff --git a/packages/eslint-config-esmodule/README.md b/packages/eslint-config-esmodule/README.md new file mode 100644 index 00000000..05c7e07e --- /dev/null +++ b/packages/eslint-config-esmodule/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-esmodule + +My ES Module eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-esmodule + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-esmodule' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-esmodule/base.yaml b/packages/eslint-config-esmodule/base.yaml new file mode 100644 index 00000000..dfab3feb --- /dev/null +++ b/packages/eslint-config-esmodule/base.yaml @@ -0,0 +1,12 @@ +plugins: + - 'eslint-plugin-import' + +parserOptions: + sourceType: 'module' + +rules: + # Disallow commonjs modules. + import/no-commonjs: 'error' + + # Turn off the `import` ban from `@code-style/eslint-config/rule-sets/imports.yaml` + no-restricted-syntax: 'off' diff --git a/packages/eslint-config-esmodule/examples/.eslintrc.yaml b/packages/eslint-config-esmodule/examples/.eslintrc.yaml new file mode 100644 index 00000000..abe7040e --- /dev/null +++ b/packages/eslint-config-esmodule/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style/eslint-config' + - '@code-style/eslint-config-esmodule' diff --git a/packages/eslint-config-esmodule/package.json b/packages/eslint-config-esmodule/package.json new file mode 100644 index 00000000..ba227c87 --- /dev/null +++ b/packages/eslint-config-esmodule/package.json @@ -0,0 +1,52 @@ +{ + "name": "@code-style/eslint-config-esmodule", + "version": "2.0.0-26", + "description": "My ES Module ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint", + "esmodule" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-esmodule/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-esmodule" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "eslint-plugin-import": "^2.28.1" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-esmodule": "2.0.0-26", + "eslint": "^8.49.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-esmodule/test/index.ts b/packages/eslint-config-esmodule/test/index.ts new file mode 100644 index 00000000..ec7723e5 --- /dev/null +++ b/packages/eslint-config-esmodule/test/index.ts @@ -0,0 +1,44 @@ +import { describe, it } from 'node:test'; +import { strictEqual } from 'node:assert'; +import { filePath, initESLint } from '@code-style/utils/testing/eslint'; +import { + testNoFail, + testRuleFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: ['@code-style', '@code-style/esmodule'], +}); + +void describe('eslint-config-esmodule base', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should pass esmodule import`, () => + testNoFail({ + linter, + files: [{ code: `import { foo } from 'console';\n\nfoo();\n` }], + })); + }); + + void describe('fails', () => { + void it(`should fail commonjs`, () => + testRuleFail({ + linter, + ruleId: 'import/no-commonjs', + files: [{ code: `const foo = require('foo');\n\nfoo();\n` }], + })); + + void it(`should only log single duplicate-import error`, async () => + linter + .lintText( + `import path from 'path';\nimport { join } from 'path';\n\njoin(path.cwd);\n`, + { filePath: filePath({ ts: true }) }, + ) + .then((res) => { + strictEqual(res[0]?.messages[0]?.ruleId, 'import/no-duplicates'); + return; + })); + }); +}); diff --git a/packages/eslint-config-jest/README.md b/packages/eslint-config-jest/README.md new file mode 100644 index 00000000..34372f7b --- /dev/null +++ b/packages/eslint-config-jest/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-jest + +My Jest eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-jest + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-jest' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-jest/base.yaml b/packages/eslint-config-jest/base.yaml new file mode 100644 index 00000000..d2f60a70 --- /dev/null +++ b/packages/eslint-config-jest/base.yaml @@ -0,0 +1,58 @@ +overrides: + - files: + - '**/test/**' + - '**/__test__/**' + - '*.test.*' + - '*.spec.*' + - '*.unit.*' + - '*.e2e.*' + extends: + - 'plugin:eslint-plugin-jest/recommended' + settings: + jest: + version: 'detect' + # TODO(0): support tsconfig.test.json + + rules: + # Disallow `return` statements in tests. + jest/no-test-return-statement: 'error' + + # Prefer Jest comparators instead of boolean comparisons. + # This leads to better test failure messages. + jest/prefer-comparison-matcher: 'error' + jest/prefer-equality-matcher: 'error' + + # Prefer Jest's `expect(foo()).resolve` instead of `expect(await foo())`. + # This leads to better test failure messages. + jest/prefer-expect-resolves: 'error' + + # Require Jest hooks to be inside a `describe`. + jest/require-top-level-describe: 'error' + + # Allow test to import unpublished files. + n/no-unpublished-import: 'off' + + # Allow test files to be any length. + max-lines: 'off' + + # Don't require dot notation in tests. + # This can be useful for accessing Typescript `private` properties & methods + dot-notation: 'off' + '@typescript-eslint/dot-notation': 'off' + + # Allow `any` in tests. + '@typescript-eslint/no-explicit-any': 'off' + '@typescript-eslint/no-unsafe-return': 'off' + '@typescript-eslint/no-unsafe-assignment': 'off' + '@typescript-eslint/no-unsafe-member-access': 'off' + '@typescript-eslint/no-unsafe-argument': 'off' + + # Allow non-null assertions in tests. + '@typescript-eslint/no-non-null-assertion': 'off' + '@typescript-eslint/no-non-null-asserted-optional-chain': 'off' + + # Simplify testing methods. + '@typescript-eslint/unbound-method': 'off' + + # Allow tests to throw literals. + '@typescript-eslint/no-throw-literal': 'off' diff --git a/packages/eslint-config-jest/examples/.eslintrc.yaml b/packages/eslint-config-jest/examples/.eslintrc.yaml new file mode 100644 index 00000000..da22b74d --- /dev/null +++ b/packages/eslint-config-jest/examples/.eslintrc.yaml @@ -0,0 +1,5 @@ +root: true +extends: + - '@code-style' + - '@code-style/node' + - '@code-style/jest' diff --git a/packages/eslint-config-jest/lenient.yaml b/packages/eslint-config-jest/lenient.yaml new file mode 100644 index 00000000..e6c4b825 --- /dev/null +++ b/packages/eslint-config-jest/lenient.yaml @@ -0,0 +1,15 @@ +overrides: + - files: + - '**/test/**' + - '**/__test__/**' + - '*.test.*' + - '*.spec.*' + - '*.unit.*' + - '*.e2e.*' + rules: + # Allow boolean comparisons instead of the equivalent Jest method. + jest/prefer-comparison-matcher: 'off' + jest/prefer-equality-matcher: 'off' + + # Allow `expect(await foo())`. + jest/prefer-expect-resolves: 'off' diff --git a/packages/eslint-config-jest/package.json b/packages/eslint-config-jest/package.json new file mode 100644 index 00000000..607ab2b3 --- /dev/null +++ b/packages/eslint-config-jest/package.json @@ -0,0 +1,53 @@ +{ + "name": "@code-style/eslint-config-jest", + "version": "2.0.0-26", + "description": "My jest ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint", + "jest" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-jest/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-jest" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./lenient": "./lenient.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml", + "/lenient.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "eslint-plugin-jest": "^27.4.0" + }, + "devDependencies": { + "tsm": "^2.3.0" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-jest": "2.0.0-26", + "eslint": "^8.49.0", + "jest": "*" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-jest/test/index.ts b/packages/eslint-config-jest/test/index.ts new file mode 100644 index 00000000..9bde6664 --- /dev/null +++ b/packages/eslint-config-jest/test/index.ts @@ -0,0 +1,37 @@ +import { describe, it } from 'node:test'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testRuleFail, + testNoFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: ['@code-style', '@code-style/jest'], +}); + +void describe('eslint-config-jest', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should have jest globals in test file`, () => + testNoFail({ + linter, + files: [ + { + code: `describe('test', () => {});\n`, + test: true, + }, + ], + })); + }); + + void describe('fails', () => { + void it(`should not have jest globals in non-test file`, () => + testRuleFail({ + linter, + ruleId: 'no-undef', + files: [{ code: `describe('test', () => {});\n` }], + })); + }); +}); diff --git a/packages/eslint-config-library/README.md b/packages/eslint-config-library/README.md new file mode 100644 index 00000000..d7bdecce --- /dev/null +++ b/packages/eslint-config-library/README.md @@ -0,0 +1 @@ +TODO: add rule to prevent usage of `.npmignore`, preferring `package.json`'s `files` attribute instead. https://web.archive.org/web/20230330090244/https://medium.com/@jdxcode/for-the-love-of-god-dont-use-npmignore-f93c08909d8d diff --git a/packages/eslint-config-nest/README.md b/packages/eslint-config-nest/README.md new file mode 100644 index 00000000..a0961a04 --- /dev/null +++ b/packages/eslint-config-nest/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-nest + +My NestJS eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-nest + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-nest' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-nest/base.yaml b/packages/eslint-config-nest/base.yaml new file mode 100644 index 00000000..e553f39a --- /dev/null +++ b/packages/eslint-config-nest/base.yaml @@ -0,0 +1,9 @@ +extends: + - 'plugin:@code-style/eslint-plugin-nest/recommended' + +rules: + # Disallow importing files from `@nestjs/terminus` since it includes a bunch of incorrect types. + no-restricted-imports: + - 'error' + - patterns: + - '@nestjs/terminus/dist/*' diff --git a/packages/eslint-config-nest/examples/.eslintrc.yaml b/packages/eslint-config-nest/examples/.eslintrc.yaml new file mode 100644 index 00000000..f3e87715 --- /dev/null +++ b/packages/eslint-config-nest/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style' + - '@code-style/nest' diff --git a/packages/eslint-config-nest/package.json b/packages/eslint-config-nest/package.json new file mode 100644 index 00000000..fdbe0c39 --- /dev/null +++ b/packages/eslint-config-nest/package.json @@ -0,0 +1,52 @@ +{ + "name": "@code-style/eslint-config-nest", + "version": "2.0.0-26", + "description": "My nest ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-nest/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-nest" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "@code-style/eslint-config-node": "2.0.0-26", + "@code-style/eslint-config-typescript": "2.0.0-26", + "@code-style/eslint-plugin-nest": "2.0.0-26" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "eslint": "^8.49.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-nest/test/fixture/sample-ts.ts b/packages/eslint-config-nest/test/fixture/sample-ts.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/eslint-config-nest/test/fixture/tsconfig.json b/packages/eslint-config-nest/test/fixture/tsconfig.json new file mode 100644 index 00000000..295dabc8 --- /dev/null +++ b/packages/eslint-config-nest/test/fixture/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@code-style/typescript-configs/roles/node", + "compilerOptions": { "outDir": "dist/" }, + "files": ["sample-ts.ts", "sample-js.js"] +} diff --git a/packages/eslint-config-nest/test/index.ts b/packages/eslint-config-nest/test/index.ts new file mode 100644 index 00000000..e6bd0fc0 --- /dev/null +++ b/packages/eslint-config-nest/test/index.ts @@ -0,0 +1,52 @@ +import { describe, it } from 'node:test'; +import { join } from 'node:path'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testRuleFail, + testNoFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint( + { + extends: [ + '@code-style/eslint-config', + '@code-style/eslint-config-esmodule', + '@code-style/eslint-config-node', + '@code-style/eslint-config-typescript', + '@code-style/eslint-config-nest', + ], + }, + { cwd: join(__dirname, 'fixture') }, +); + +void describe('eslint-config-nest strict', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should pass radix`, async () => + testNoFail({ linter, files: [{ code: `parseInt('10');\n`, ts: true }] })); + }); + + void describe('fails', () => { + void it(`should fail no-console`, () => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('foo');\n`, ts: true }], + })); + + void it(`should fail no-restricted-imports`, () => + testRuleFail({ + linter, + ruleId: 'no-restricted-imports', + files: [ + { + code: `import { isAxiosError } from '@nestjs/terminus/dist/utils';\n +(isAxiosError as (a: unknown) => void)({});\n`, + ts: true, + }, + ], + })); + }); +}); diff --git a/packages/eslint-config-nextjs/README.md b/packages/eslint-config-nextjs/README.md new file mode 100644 index 00000000..a23c6674 --- /dev/null +++ b/packages/eslint-config-nextjs/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-nextjs + +My Next.JS eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-nextjs + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-nextjs' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-nextjs/base.yaml b/packages/eslint-config-nextjs/base.yaml new file mode 100644 index 00000000..e795fd14 --- /dev/null +++ b/packages/eslint-config-nextjs/base.yaml @@ -0,0 +1,6 @@ +extends: + - 'plugin:@next/eslint-plugin-next/recommended' + +rules: + # NextJS requires page components to be default exports + import/no-default-export: 'off' diff --git a/packages/eslint-config-nextjs/examples/.eslintrc.yaml b/packages/eslint-config-nextjs/examples/.eslintrc.yaml new file mode 100644 index 00000000..66f55208 --- /dev/null +++ b/packages/eslint-config-nextjs/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style/eslint-config' + - '@code-style/eslint-config-nextjs' diff --git a/packages/eslint-config-nextjs/package.json b/packages/eslint-config-nextjs/package.json new file mode 100644 index 00000000..4c3a21f8 --- /dev/null +++ b/packages/eslint-config-nextjs/package.json @@ -0,0 +1,53 @@ +{ + "name": "@code-style/eslint-config-nextjs", + "version": "2.0.0-26", + "description": "My NextJS ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-nextjs/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-nextjs" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "@code-style/eslint-config-react": "^2.0.0-26", + "@next/eslint-plugin-next": "^14.1.1" + }, + "devDependencies": { + "@types/react": "^18.2.23", + "react": "^18.2.0", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-react": "2.0.0-26", + "eslint": "^8.49.0", + "next": "*" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-nextjs/test/index.ts b/packages/eslint-config-nextjs/test/index.ts new file mode 100644 index 00000000..7b53696b --- /dev/null +++ b/packages/eslint-config-nextjs/test/index.ts @@ -0,0 +1,66 @@ +import { describe, it } from 'node:test'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testRuleFail, + testNoFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: [ + '@code-style/eslint-config', + '@code-style/eslint-config-esmodule', + '@code-style/eslint-config-browser', + '@code-style/eslint-config-react', + '@code-style/eslint-config-nextjs', + ], +}); + +void describe('eslint-config-nextjs', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should parse jsx`, async () => + testNoFail({ + linter, + files: [ + { + code: `import React from 'react';\n\nexport const A = () =>
;\n`, + react: true, + }, + ], + })); + }); + + void describe('fails', () => { + void it(`should fail radix`, async () => + testRuleFail({ + linter, + ruleId: 'radix', + files: [{ code: `parseInt('10');\n`, react: true }], + })); + + void it(`should fail no-console`, () => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('foo');\n`, react: true }], + })); + + void it(`should fail react/jsx-key`, () => + testRuleFail({ + linter, + ruleId: 'react/jsx-key', + files: [ + { + code: `import React from 'react'; + +export const Foo = (props) =>
{props}
; +export const Bar = (props) => props.list.map((l) => ); +`, + react: true, + }, + ], + })); + }); +}); diff --git a/packages/eslint-config-node/README.md b/packages/eslint-config-node/README.md new file mode 100644 index 00000000..c86bf37b --- /dev/null +++ b/packages/eslint-config-node/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-node + +My node eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-node + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-node' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-node/base.yaml b/packages/eslint-config-node/base.yaml new file mode 100644 index 00000000..d5f40b88 --- /dev/null +++ b/packages/eslint-config-node/base.yaml @@ -0,0 +1,103 @@ +extends: + - 'plugin:eslint-plugin-n/recommended-module' + +parserOptions: + ecmaVersion: 2022 # Version is inline with Node 16 + sourceType: commonjs + +env: + node: true + +# `plugin:n/recommended-module` disables some globals we still want +globals: + # TODO(1): detect if project is type: module or not and remove the globals if so + __dirname: 'readonly' + __filename: 'readonly' + require: 'readonly' + module: 'writable' + +rules: + # Allow unspecified radix in `parseInt` since Node has a consistent radix. + radix: 'off' + + # Disallow using `process.env`. + # Any environment config reading should be in a specific config module. + # This simplifies understanding of the affects of config variables, as well + # as helping to ease error handling. + n/no-process-env: 'error' + + # Require `return` upon callback. + # Not returning immediately makes it easy to continue executing code after + # what would usually be considered the end of method. + n/callback-return: ['error', ['callback', 'cb', 'next']] + + # Disallow `require()` outside of the top-level module scope to encourage a + # consistent style. + n/global-require: 'error' + + # Require error handling in callbacks. + n/handle-callback-err: ['error', '^.*[eE]rr(or)?$'] + + # Disallow mixing regular variable and `require` declarations to encourage a + # consistent style. + n/no-mixed-requires: 'error' + + # Disallow use of new operator with the `require` function to encourage a + # consistent style. + n/no-new-require: 'error' + + # Disallow string concatenation with `__dirname` and `__filename`. + # Not all environments use the same path seperator (looking at you, Windows). + n/no-path-concat: 'error' + + # Allow usage of all node modules. + n/no-restricted-import: 'off' + n/no-restricted-require: 'off' + + # Disallow use of synchronous methods that have an async alternative. + # Using synchronous methods ties up the thread, preventing other requests + # from being handled while waiting on I/O. + n/no-sync: 'error' + + # Defer to import/no-extraneous-dependencies. + n/no-extraneous-import: 'off' + n/no-extraneous-require: 'off' + + # Require `module.exports` for commonjs to encourage a consistent style. + n/exports-style: ['error', 'module.exports'] + + # Require imports instead of globals. + n/prefer-global/buffer: ['error', 'never'] + n/prefer-global/text-decoder: ['error', 'never'] + n/prefer-global/text-encoder: ['error', 'never'] + n/prefer-global/url-search-params: ['error', 'never'] + n/prefer-global/url: ['error', 'never'] + + # Require promise APIs when available to encourage a consistent style. + n/prefer-promises/dns: 'error' + n/prefer-promises/fs: 'error' + + # Require callbacks to be error first callbacks. + n/no-callback-literal: 'error' + + # Check that all imports are part of our package in production. + n/no-unpublished-import: + - 'error' + - ignoreTypeImport: true + +overrides: + - files: + # test files + - '**/test/**' + - '**/__test__/**' + - '*.test.*' + - '*.spec.*' + - '*.unit.*' + - '*.e2e.*' + # config files + - '*.config.*' + - '*.configuration.*' + - 'config.*' + - 'configuration.*' + rules: + n/no-process-env: 'off' diff --git a/packages/eslint-config-node/examples/.eslintrc.yaml b/packages/eslint-config-node/examples/.eslintrc.yaml new file mode 100644 index 00000000..84cdd506 --- /dev/null +++ b/packages/eslint-config-node/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style' + - '@code-style/node' diff --git a/packages/eslint-config-node/lenient.yaml b/packages/eslint-config-node/lenient.yaml new file mode 100644 index 00000000..ca96d51c --- /dev/null +++ b/packages/eslint-config-node/lenient.yaml @@ -0,0 +1,10 @@ +rules: + # enforces error handling in callbacks + n/handle-callback-err: 'off' + + # disallow use of synchronous methods + n/no-sync: 'off' + + # use promise APIs + n/prefer-promises/dns: 'off' + n/prefer-promises/fs: 'off' diff --git a/packages/eslint-config-node/package.json b/packages/eslint-config-node/package.json new file mode 100644 index 00000000..8731af1b --- /dev/null +++ b/packages/eslint-config-node/package.json @@ -0,0 +1,53 @@ +{ + "name": "@code-style/eslint-config-node", + "version": "2.0.0-26", + "description": "My node ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-node/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-node" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./lenient": "./lenient.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml", + "/lenient.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "eslint-plugin-n": "^16.1.0" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-node": "2.0.0-26", + "eslint": "^8.49.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-node/test/lenient.ts b/packages/eslint-config-node/test/lenient.ts new file mode 100644 index 00000000..753b9786 --- /dev/null +++ b/packages/eslint-config-node/test/lenient.ts @@ -0,0 +1,36 @@ +import { describe, it } from 'node:test'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testRuleFail, + testNoFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: [ + '@code-style/eslint-config', + '@code-style/eslint-config-node', + '@code-style/eslint-config-node/lenient', + ], +}); + +void describe('eslint-config-node lenient', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should pass n/no-sync`, () => + testNoFail({ + linter, + files: [{ code: `const { readFileSync } = require('fs');` }], + })); + }); + + void describe('fails', () => { + void it(`should fail no-console`, () => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('foo');\n` }], + })); + }); +}); diff --git a/packages/eslint-config-node/test/strict.ts b/packages/eslint-config-node/test/strict.ts new file mode 100644 index 00000000..09e27e56 --- /dev/null +++ b/packages/eslint-config-node/test/strict.ts @@ -0,0 +1,40 @@ +import { describe, it } from 'node:test'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testRuleFail, + testNoFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: ['@code-style/eslint-config', '@code-style/eslint-config-node'], +}); + +void describe('eslint-config-node strict', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should pass radix`, async () => + testNoFail({ linter, files: [{ code: `parseInt('10');\n` }] })); + }); + + void describe('fails', () => { + void it(`should fail no-console`, () => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('foo');\n` }], + })); + + void it(`should fail n/no-sync`, () => + testRuleFail({ + linter, + ruleId: 'n/no-sync', + files: [ + { + code: `const { readFileSync } = require('fs');\n\nreadFileSync('test');\n`, + }, + ], + })); + }); +}); diff --git a/packages/eslint-config-node/tsconfig.json b/packages/eslint-config-node/tsconfig.json new file mode 100644 index 00000000..4082f16a --- /dev/null +++ b/packages/eslint-config-node/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "../../tsconfig.json" +} diff --git a/packages/eslint-config-react/README.md b/packages/eslint-config-react/README.md new file mode 100644 index 00000000..9ddd662e --- /dev/null +++ b/packages/eslint-config-react/README.md @@ -0,0 +1,23 @@ +# @code-style/eslint-config-react + +My React eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-react + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-react' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. diff --git a/packages/eslint-config-react/base.yaml b/packages/eslint-config-react/base.yaml new file mode 100644 index 00000000..aeb70d5c --- /dev/null +++ b/packages/eslint-config-react/base.yaml @@ -0,0 +1,26 @@ +extends: + - 'plugin:eslint-plugin-react/recommended' + - 'plugin:eslint-plugin-react-hooks/recommended' + - 'plugin:eslint-plugin-jsx-a11y/recommended' + +settings: + react: + version: 'detect' + +rules: + # Limit max element nesting to reduce component complexity. + # This simplifies components & enables better testing. + react/jsx-max-depth: + - 'error' + - max: 5 + + # Require class components to use ES6 classes rather than ES5 classes. + react/prefer-es6-class: 'error' + + # Require stateless components to be functional components. + react/prefer-stateless-function: 'error' + + react/no-children-prop: 'off' + + # Require iterated elements to have a `key`. + react/jsx-key: 'error' diff --git a/packages/eslint-config-react/examples/.eslintrc.yaml b/packages/eslint-config-react/examples/.eslintrc.yaml new file mode 100644 index 00000000..3cbfcb61 --- /dev/null +++ b/packages/eslint-config-react/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style' + - '@code-style/react' diff --git a/packages/eslint-config-react/package.json b/packages/eslint-config-react/package.json new file mode 100644 index 00000000..13f96377 --- /dev/null +++ b/packages/eslint-config-react/package.json @@ -0,0 +1,56 @@ +{ + "name": "@code-style/eslint-config-react", + "version": "2.0.0-26", + "description": "My react ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-react/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-react" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "@code-style/eslint-config-browser": "^2.0.0-26", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "devDependencies": { + "@types/react": "^18.2.23", + "react": "^18.2.0", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-react": "2.0.0-26", + "eslint": "^8.49.0", + "react": ">=16.8", + "react-dom": ">=16.8" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-react/test/index.ts b/packages/eslint-config-react/test/index.ts new file mode 100644 index 00000000..d6e8e40c --- /dev/null +++ b/packages/eslint-config-react/test/index.ts @@ -0,0 +1,65 @@ +import { describe, it } from 'node:test'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testRuleFail, + testNoFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ + extends: [ + '@code-style/eslint-config', + '@code-style/eslint-config-esmodule', + '@code-style/eslint-config-browser', + '@code-style/eslint-config-react', + ], +}); + +void describe('eslint-config-react', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should parse jsx`, async () => + testNoFail({ + linter, + files: [ + { + code: `import React from 'react';\n\nexport const A = () =>
;\n`, + react: true, + }, + ], + })); + }); + + void describe('fails', () => { + void it(`should fail radix`, async () => + testRuleFail({ + linter, + ruleId: 'radix', + files: [{ code: `parseInt('10');\n`, react: true }], + })); + + void it(`should fail no-console`, () => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('foo');\n`, react: true }], + })); + + void it(`should fail react/jsx-key`, () => + testRuleFail({ + linter, + ruleId: 'react/jsx-key', + files: [ + { + code: `import React from 'react'; + +export const Foo = (props) =>
{props}
; +export const Bar = (props) => props.list.map((l) => ); +`, + react: true, + }, + ], + })); + }); +}); diff --git a/packages/eslint-config-typescript/README.md b/packages/eslint-config-typescript/README.md new file mode 100644 index 00000000..5a6f9999 --- /dev/null +++ b/packages/eslint-config-typescript/README.md @@ -0,0 +1,30 @@ +# @code-style/eslint-config-typescript + +My Typescript eslint config + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/eslint-config-typescript + ``` + +1. Add the plugin to your ESLint config. + + ```diff + extends: + - '@code-style/eslint-config' + + - '@code-style/eslint-config-typescript' + ``` + + You'll also likely want to have some of my other ESLint configs for your environment. + +1. You might want to add some `ignorePatterns` to not lint your transpiled JS. + + ```yaml + ignorePatterns: + - '/out' + ``` diff --git a/packages/eslint-config-typescript/base.yaml b/packages/eslint-config-typescript/base.yaml new file mode 100644 index 00000000..03a5edd8 --- /dev/null +++ b/packages/eslint-config-typescript/base.yaml @@ -0,0 +1,99 @@ +overrides: + - files: + - '*.?(m|c)@(t|j)s?(x)' + excludedFiles: '*.json' + + extends: + - 'plugin:@typescript-eslint/eslint-plugin/strict-type-checked' + - 'plugin:@typescript-eslint/eslint-plugin/stylistic-type-checked' + - 'plugin:eslint-plugin-import/typescript' + + parserOptions: + project: true + rules: + # Allow specifying a type that could otherwise be inferred. + '@typescript-eslint/no-inferrable-types': 'off' + + # Disallow unused variables. + '@typescript-eslint/no-unused-vars': + - 'warn' + - args: 'none' + destructuredArrayIgnorePattern: '^_' + + # TODO(0): throws on code that should probably be allowed + # ``` + # const foo: number | undefined = Math.random() === 0 ? 1 : undefined; + # if (foo?.toString().includes('a')) console.log('hi'); + # ``` + # Require only boolean types to be used for conditions. + '@typescript-eslint/strict-boolean-expressions': + - 'error' + - allowAny: false + allowString: false + allowNullableString: false + allowNumber: false + allowNullableNumber: false + allowNullableObject: true + allowNullableBoolean: true + + # Require switches on union types to handle all cases. + '@typescript-eslint/switch-exhaustiveness-check': 'error' + + # Disallow empty classes, unless they're decorated. + '@typescript-eslint/no-extraneous-class': + - 'error' + - allowWithDecorator: true + + # TODO: do we want this? + # Require `enum` values to be initialized in order to prevent value shifting. + # If an `enum`'s value isn't defined, Typescript will automatically pick a + # numeric value for it based on its position in the enum list. If that + # value is then used to save state into a store, and then the `enum`'s + # list of values is updated, the value in the store may not correspond with + # the intended enum value anymore. + '@typescript-eslint/prefer-enum-initializers': 'error' + + # Allow use of both `type` and `interface`. + '@typescript-eslint/consistent-type-definitions': 'off' + + # Require `private` members to be marked `readonly` when possible. + '@typescript-eslint/prefer-readonly': 'error' + + # Allow returning the correct type, even if it might be slightly confusing. + '@typescript-eslint/no-confusing-void-expression': 'off' + + '@typescript-eslint/no-empty-function': 'off' + + # Disable this rule since it doesn't work reliably. + '@typescript-eslint/consistent-generic-constructors': 'off' + + # Disable this rule until this issue is fixed. + # https://github.com/typescript-eslint/typescript-eslint/issues/7502 + '@typescript-eslint/no-base-to-string': 'off' + + # Allow comparing `enum`s to appropriate primitive values. + '@typescript-eslint/no-unsafe-enum-comparison': 'off' + + # Disable this rule since Typescript checks imports for us. + 'import/no-unresolved': 'off' + 'n/no-missing-import': 'off' + + # Disable this rule since Typescript handles these rules for us. + consistent-return: 'off' + no-invalid-this: 'off' + + # Allow any value in template literal expression. + '@typescript-eslint/restrict-template-expressions': 'off' + + # Require unbound methods to be called with their expected scope. + '@typescript-eslint/unbound-method': + - 'error' + - ignoreStatic: true + + # Disable this rule since Typescript will handle this for us. + 'promise/valid-params': 'off' + + # Allow function overload signatures. + '@typescript-eslint/unified-signatures': 'off' + + # TODO(2): create a linter rule to handle correlation between class-validator types, swagger types, and typescript types diff --git a/packages/eslint-config-typescript/examples/.eslintrc.yaml b/packages/eslint-config-typescript/examples/.eslintrc.yaml new file mode 100644 index 00000000..1f142b8b --- /dev/null +++ b/packages/eslint-config-typescript/examples/.eslintrc.yaml @@ -0,0 +1,4 @@ +root: true +extends: + - '@code-style' + - '@code-style/typescript' diff --git a/packages/eslint-config-typescript/lenient.yaml b/packages/eslint-config-typescript/lenient.yaml new file mode 100644 index 00000000..3c5d9c9c --- /dev/null +++ b/packages/eslint-config-typescript/lenient.yaml @@ -0,0 +1,31 @@ +rules: + # Allow some non-boolean type conditionals. + '@typescript-eslint/strict-boolean-expressions': + - 'error' + - allowAny: true + allowString: false + allowNullableString: false + allowNumber: false + allowNullableNumber: false + allowNullableObject: true + allowNullableBoolean: true + + # Don't ensure switches on union types handle all cases. + '@typescript-eslint/switch-exhaustiveness-check': 'off' + + # Allow unused vars. + '@typescript-eslint/no-unused-vars': 'off' + + # Allow `any`. + '@typescript-eslint/no-explicit-any': 'off' + '@typescript-eslint/no-unsafe-return': 'off' + '@typescript-eslint/no-unsafe-assignment': 'off' + '@typescript-eslint/no-unsafe-member-access': 'off' + '@typescript-eslint/no-unsafe-argument': 'off' + '@typescript-eslint/no-unsafe-call': 'off' + + # Allow non-null assertions. + '@typescript-eslint/no-non-null-assertion': 'off' + + # Allow for loops + '@typescript-eslint/prefer-for-of': 'off' diff --git a/packages/eslint-config-typescript/package.json b/packages/eslint-config-typescript/package.json new file mode 100644 index 00000000..6c5f7897 --- /dev/null +++ b/packages/eslint-config-typescript/package.json @@ -0,0 +1,56 @@ +{ + "name": "@code-style/eslint-config-typescript", + "version": "2.0.0-26", + "description": "My Typescript ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config-typescript/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config-typescript" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./lenient": "./lenient.yaml", + "./*.yaml": "./*.yaml" + }, + "main": "base.yaml", + "files": [ + "/base.yaml", + "/lenient.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", + "eslint-plugin-import": "^2.29.1" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages-typescript": "2.0.0-26", + "eslint": "^8.49.0", + "typescript": ">=5.0.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-config-typescript/test/fixture/sample-ts.ts b/packages/eslint-config-typescript/test/fixture/sample-ts.ts new file mode 100644 index 00000000..e69de29b diff --git a/packages/eslint-config-typescript/test/fixture/tsconfig.json b/packages/eslint-config-typescript/test/fixture/tsconfig.json new file mode 100644 index 00000000..295dabc8 --- /dev/null +++ b/packages/eslint-config-typescript/test/fixture/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "@code-style/typescript-configs/roles/node", + "compilerOptions": { "outDir": "dist/" }, + "files": ["sample-ts.ts", "sample-js.js"] +} diff --git a/packages/eslint-config-typescript/test/lenient.ts b/packages/eslint-config-typescript/test/lenient.ts new file mode 100644 index 00000000..b3b52cee --- /dev/null +++ b/packages/eslint-config-typescript/test/lenient.ts @@ -0,0 +1,93 @@ +import { describe, it } from 'node:test'; +import { join } from 'node:path'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testNoFail, + testRuleFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint( + { + extends: [ + '@code-style/eslint-config', + '@code-style/eslint-config/lenient', + '@code-style/eslint-config-esmodule', + '@code-style/eslint-config-typescript', + '@code-style/eslint-config-typescript/lenient', + ], + parserOptions: { + ecmaVersion: 2022, + }, + }, + { cwd: join(__dirname, 'fixture') }, +); + +void describe('eslint-config-typescript lenient', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should parse typescript`, () => + testNoFail({ + linter, + files: [ + { + code: `((a: string): string[] => a.split(''))()\n`, + ts: true, + }, + ], + })); + + void it(`should not give eslint error on use before define`, () => + testNoFail({ + linter, + files: [{ code: `Number(a);\nconst a = 10;\n`, ts: true }], + })); + + void it(`should import`, () => + testNoFail({ + linter, + files: [ + { code: `import { a } from './utils';\n\na();\n`, ts: true }, + { + code: `export function a () { + return 1; +}\n`, + path: 'utils.ts', + }, + ], + })); + + void it(`should pass @typescript-eslint/strict-boolean-expressions object`, async () => + testNoFail({ + linter, + files: [ + { + code: `const foo: object | null = Math.random() === 0 ? {} : null;\nif (foo) Number();\n`, + ts: true, + }, + ], + })); + }); + + void describe('fails', () => { + void it(`should fail radix`, async () => + testRuleFail({ + linter, + ruleId: 'radix', + files: [{ code: `parseInt('10');\n`, ts: true }], + })); + + void it(`should fail @typescript-eslint/strict-boolean-expressions string`, async () => + testRuleFail({ + linter, + ruleId: '@typescript-eslint/strict-boolean-expressions', + files: [ + { + code: `let foo = 'foo';\nfoo = 'bar';\nif (foo) Number();\n`, + ts: true, + }, + ], + })); + }); +}); diff --git a/packages/eslint-config-typescript/test/strict.ts b/packages/eslint-config-typescript/test/strict.ts new file mode 100644 index 00000000..2a5e4d75 --- /dev/null +++ b/packages/eslint-config-typescript/test/strict.ts @@ -0,0 +1,87 @@ +import { describe, it } from 'node:test'; +import { join } from 'node:path'; +import { initESLint } from '@code-style/utils/testing/eslint'; +import { + testNoFail, + testRuleFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint( + { + extends: [ + '@code-style/eslint-config', + '@code-style/eslint-config-esmodule', + '@code-style/eslint-config-typescript', + ], + }, + { cwd: join(__dirname, 'fixture') }, +); + +void describe('eslint-config-typescript strict', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should parse typescript`, () => + testNoFail({ + linter, + files: [ + { + code: `((a: string): string[] => a.split(''))()\n`, + ts: true, + }, + ], + })); + + void it(`should not give eslint error on use before define`, () => + testNoFail({ + linter, + files: [{ code: `Number(a);\nconst a = 10;\n`, ts: true }], + })); + + void it(`should import`, () => + testNoFail({ + linter, + files: [ + { code: `import { a } from './utils';\n\na();\n`, ts: true }, + { + code: `export function a () {\n return 1;\n}\n`, + path: 'utils.ts', + }, + ], + })); + }); + + void describe('fails', () => { + void it(`should fail radix`, async () => + testRuleFail({ + linter, + ruleId: 'radix', + files: [{ code: `parseInt('10');\n`, ts: true }], + })); + + void it(`should fail @typescript-eslint/strict-boolean-expressions string`, async () => + testRuleFail({ + linter, + ruleId: '@typescript-eslint/strict-boolean-expressions', + files: [ + { + code: `let foo = 'foo';\nfoo = 'bar';\nif (foo) Number();\n`, + ts: true, + }, + ], + })); + + void it(`should fail @typescript-eslint/strict-boolean-expressions unknown`, async () => + testRuleFail({ + linter, + ruleId: '@typescript-eslint/strict-boolean-expressions', + files: [ + { + code: `let foo: unknown = 'foo';\nfoo = 'bar';\nif (foo) Number();\n`, + ts: true, + }, + ], + })); + }); +}); diff --git a/packages/eslint-config/README.md b/packages/eslint-config/README.md new file mode 100644 index 00000000..cfe7d17b --- /dev/null +++ b/packages/eslint-config/README.md @@ -0,0 +1,20 @@ +# @code-style/eslint-config + +A set of ESLint rules customized for code corectness. + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +You're probably looking to use this with one of our other configs: + +- [`@code-style/node`](../eslint-config-node/README.md) +- [`@code-style/cli`](../eslint-config-cli/README.md) +- [`@code-style/typescript`](../eslint-config-typescript/README.md) +- [`@code-style/jest`](../eslint-config-jest/README.md) +- [`@code-style/browser`](../eslint-config-browser/README.md) +- [`@code-style/react`](../eslint-config-react/README.md) + +However, if you're trying to build a new config for a new environment (maybe some new frontend framework or something), you'll want to use this config as a layer in your project. + +TODO(1): Evaluate the following plugins: + +- [ ] https://github.com/Rel1cx/eslint-react diff --git a/packages/eslint-config/base.yaml b/packages/eslint-config/base.yaml new file mode 100644 index 00000000..72bf7560 --- /dev/null +++ b/packages/eslint-config/base.yaml @@ -0,0 +1,34 @@ +extends: + - 'eslint:recommended' + - 'plugin:prettier/recommended' + - 'plugin:eslint-plugin-promise/recommended' + # TODO(0): consider switching to `eslint-plugin-i` + - 'plugin:eslint-plugin-import/recommended' + - 'plugin:@eslint-community/eslint-plugin-eslint-comments/recommended' + + - './rule-sets/bugs.yaml' + - './rule-sets/deprecated.yaml' + - './rule-sets/footguns.yaml' + - './rule-sets/imports.yaml' + - './rule-sets/miscellaneous.yaml' + - './rule-sets/modern-code.yaml' + - './rule-sets/promises.yaml' + - './rule-sets/readability.yaml' + - './rule-sets/security.yaml' + +parserOptions: + ecmaVersion: 2022 # Version is inline with Node 16 + +env: + commonjs: true + +ignorePatterns: + - '**/dist/**' + +overrides: + - files: '*.json' + plugins: + - 'eslint-plugin-json-files' + rules: + # eslint-plugin-prettier breaks JSON linting (https://github.com/prettier/eslint-plugin-prettier/issues/570) + prettier/prettier: 'off' diff --git a/packages/eslint-config/examples/.eslintrc.yaml b/packages/eslint-config/examples/.eslintrc.yaml new file mode 100644 index 00000000..0e78773c --- /dev/null +++ b/packages/eslint-config/examples/.eslintrc.yaml @@ -0,0 +1,3 @@ +root: true +extends: + - '@code-style' diff --git a/packages/eslint-config/lenient.yaml b/packages/eslint-config/lenient.yaml new file mode 100644 index 00000000..ad1afe57 --- /dev/null +++ b/packages/eslint-config/lenient.yaml @@ -0,0 +1,47 @@ +rules: + # Allow symbols to not have a description. + symbol-description: 'off' + + # Allow string concatenation. + prefer-template: 'off' + + # Allow `.apply()`. + prefer-spread: 'off' + + # Allow synchronous loops. + no-await-in-loop: 'off' + + # Allow uncaught promise errors. + promise/catch-or-return: 'off' + + # Allow non-dot notation. + dot-notation: 'off' + + # Allow files to be any length. + max-lines: 'off' + + # Allow parameter reassigning. + no-param-reassign: 'off' + + # Allow any import formatting + import/order: 'off' + import/newline-after-import: 'off' + + # Allow node globals + n/prefer-global/buffer: 'off' + n/prefer-global/text-decoder: 'off' + n/prefer-global/text-encoder: 'off' + n/prefer-global/url-search-params: 'off' + n/prefer-global/url: 'off' + + # Allow reading from process.env from any file + n/no-process-env: 'off' + + # Allow void promises + promise/always-return: 'off' + + # Allow throwing literals + no-throw-literal: 'off' + + # Allow unused vars + no-unused-vars: 'off' diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json new file mode 100644 index 00000000..9c46ab2c --- /dev/null +++ b/packages/eslint-config/package.json @@ -0,0 +1,66 @@ +{ + "name": "@code-style/eslint-config", + "version": "2.0.0-26", + "description": "My base ESLint config", + "keywords": [ + "style", + "lint", + "config", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-config/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-config" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./base.yaml", + "./base": "./base.yaml", + "./lenient": "./lenient.yaml", + "./*.yaml": "./*.yaml", + "./rule-sets/*.yaml": "./rule-sets/*.yaml" + }, + "main": "base.yaml", + "files": [ + "/rule-sets/", + "/base.yaml", + "/lenient.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "@eslint-community/eslint-plugin-eslint-comments": "^4.1.0", + "eslint": "^8.49.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-json-files": "^4.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1" + }, + "devDependencies": { + "@types/eslint": "^8.44.2", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "@code-style/eslint-npm-hoist-packages": "2.0.0-26", + "prettier": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "overrides": { + "eslint-plugin-import": { + "tsconfig-paths": "^4.2.0" + } + } +} diff --git a/packages/eslint-config/rule-sets/bugs.yaml b/packages/eslint-config/rule-sets/bugs.yaml new file mode 100644 index 00000000..9f119d78 --- /dev/null +++ b/packages/eslint-config/rule-sets/bugs.yaml @@ -0,0 +1,21 @@ +rules: + # Disallows meaningless comparisons to self. + no-self-compare: 'error' + + # Disallows using `this` when `this` is undefined. + no-invalid-this: 'error' + + # Catches some race conditions, but can lead to false-positives. + require-atomic-updates: ['warn', { allowProperties: true }] + + # Disallows usage of `new` for certain globals functions. + no-new-native-nonconstructor: 'error' + + # Disallows throwing literal values, preferring objects extending `Error` instead. + # Throwing `Errors` improves the traceability of exceptions. + no-throw-literal: 'error' + + # Ensures that binary comparisons can possibly change value. + # If a binary expression comparison can't change value, then you're likely doing something you didn't intend. + # https://eslint.org/blog/2022/07/interesting-bugs-caught-by-no-constant-binary-expression/ + no-constant-binary-expression: 'error' diff --git a/packages/eslint-config/rule-sets/deprecated.yaml b/packages/eslint-config/rule-sets/deprecated.yaml new file mode 100644 index 00000000..43d0061c --- /dev/null +++ b/packages/eslint-config/rule-sets/deprecated.yaml @@ -0,0 +1,9 @@ +rules: + # `__iterator__` is deprecated. + no-iterator: 'error' + + # `__proto__` is deprecated. + no-proto: 'error' + + # Disallows allow `var`, preferring `let` or `const` instead. + no-var: 'error' diff --git a/packages/eslint-config/rule-sets/footguns.yaml b/packages/eslint-config/rule-sets/footguns.yaml new file mode 100644 index 00000000..2e3597ee --- /dev/null +++ b/packages/eslint-config/rule-sets/footguns.yaml @@ -0,0 +1,69 @@ +rules: + # TODO(0): look into where parseInt isn't base 10 + # Require `parseInt` to have a radix specified since some browsers don't default to base 10. + radix: 'error' + + # Require the use of `===` since `==` has some weird behavior. + # TODO(0): explain + eqeqeq: ['error', 'smart'] + + # Prefer binary, octal, and hexadecimal literals instead of `parseInt('F', 16)`. + prefer-numeric-literals: 'error' + + # Ensure that functional array methods are chainable. + array-callback-return: 'error' + + # Disallow returning in a constructor. + no-constructor-return: 'error' + + # Disallow array constructors with multiple params. + no-array-constructor: 'error' + + # Disallow `arguments.caller`. + no-caller: 'error' + + # Disallow monkeypatching. + no-extend-native: 'error' + + # TODO(2): are we sure we really want this? it's not _really_ necessary + # Disallow sequences. + no-sequences: ['error', { allowInParentheses: false }] + + # Disallow the `void` keyword. + no-void: + - 'error' + - allowAsStatement: true + + # Disallow bitwise operators, which are usually typos for boolean operators + no-bitwise: 'error' + + # Ensure regexp uses certain flags. + require-unicode-regexp: 'error' + + # Prevent unintentional numeric literal values (eg: `071 === 51`). + no-octal: 'error' + + # Prevent labels from sharing their name with variable. + no-label-var: 'error' + + # Disallow allow empty blocks. + no-empty: + - 'error' + - 'allowEmptyCatch': true + +overrides: + - files: '*.json' + rules: + # Prevent having the same package in dependencies and devDependencies. + json-files/require-unique-dependency-names: 'error' + + # Require that specific ranges are specified in `package.json` `dependencies`. + json-files/restrict-ranges: + - 'error' + - versionHint: 'caret' + dependencyTypes: + - 'dependencies' + - 'devDependencies' + + # Require that `engines` are specified in `package.json`. + json-files/require-engines: 'error' diff --git a/packages/eslint-config/rule-sets/imports.yaml b/packages/eslint-config/rule-sets/imports.yaml new file mode 100644 index 00000000..c3f91d01 --- /dev/null +++ b/packages/eslint-config/rule-sets/imports.yaml @@ -0,0 +1,53 @@ +rules: + # Warn about deprecated imports. + import/no-deprecated: 'warn' + + # Disallow exporting mutable vars. + import/no-mutable-exports: 'error' + + # Disallow AMD modules. + import/no-amd: 'error' + + # Disallow mixing ESM with commonjs exports. + import/no-import-module-exports: 'error' + + # Disallow importing yourself. + import/no-self-import: 'error' + + # Disallow webpack imports. + import/no-webpack-loader-syntax: 'error' + + # Ensure imports come first in file. + import/first: 'error' + + # Ensure imports are seperated from the rest of the file. + import/newline-after-import: 'error' + + # Disallow default exports. + import/no-default-export: 'error' + + # Ensure consistent ordering of imports. + import/order: + - 'warn' + - groups: + - 'builtin' + - 'external' + - 'internal' + newlines-between: 'ignore' + + # Use `import/order` instead. + sort-imports: 'off' + + # disable ES Module import/export + no-restricted-syntax: + - 'error' + - selector: 'ImportDeclaration' + message: 'ES Module import not allowed' + - selector: 'ExportNamedDeclaration' + message: 'ES Module export not allowed' + - selector: 'ExportDefaultDeclaration' + message: 'ES Module export not allowed' + - selector: 'ExportAllDeclaration' + message: 'ES Module export not allowed' + - selector: 'TSExportAssignment' + message: 'ES Module export not allowed' diff --git a/packages/eslint-config/rule-sets/miscellaneous.yaml b/packages/eslint-config/rule-sets/miscellaneous.yaml new file mode 100644 index 00000000..dbbcdc1b --- /dev/null +++ b/packages/eslint-config/rule-sets/miscellaneous.yaml @@ -0,0 +1,17 @@ +rules: + # Disallow `console` and `alert` calls. + # Neither of these methods should be used in production. + no-console: 'error' + no-alert: 'error' + + # Warn about prettier style issues. + prettier/prettier: 'warn' + + # Disallow renaming `import`, `export`, and destructured assignments to the same name. + no-useless-rename: 'error' + + # Require `symbol`s to have a description. + symbol-description: 'error' + + # Require `switch`'s `default` case to be last. + default-case-last: 'error' diff --git a/packages/eslint-config/rule-sets/modern-code.yaml b/packages/eslint-config/rule-sets/modern-code.yaml new file mode 100644 index 00000000..bc9713fc --- /dev/null +++ b/packages/eslint-config/rule-sets/modern-code.yaml @@ -0,0 +1,15 @@ +rules: + # Prefer template literals instead of string concatenation. + prefer-template: 'error' + + # Disallow using `.apply()`. + prefer-spread: 'error' + + # Prefer a rest parameter instead of `arguments`. + prefer-rest-params: 'error' + + # Prefer using arrow functions as callbacks. + prefer-arrow-callback: ['error', { allowNamedFunctions: true }] + + # Prefer `const` for vars that are never modified. + prefer-const: 'error' diff --git a/packages/eslint-config/rule-sets/promises.yaml b/packages/eslint-config/rule-sets/promises.yaml new file mode 100644 index 00000000..5649294f --- /dev/null +++ b/packages/eslint-config/rule-sets/promises.yaml @@ -0,0 +1,21 @@ +rules: + # Require errors from promises are caught. + promise/catch-or-return: ['error', { allowThen: true }] + + # Disallow calling resolve multiple times. + promise/no-multiple-resolved: 'error' + + # Allow nesting promises. + promise/no-nesting: 'off' + + # Allow using promises inside of callbacks. + promise/no-promise-in-callback: 'off' + + # Ensure the proper number of arguments are passed to `Promise` functions. + promise/valid-params: 'error' + + # Require `async` functions to contain an `await`. + require-await: 'error' + + # Prefer using `Promise.all` instead of synchronous loops. + no-await-in-loop: 'error' diff --git a/packages/eslint-config/rule-sets/readability.yaml b/packages/eslint-config/rule-sets/readability.yaml new file mode 100644 index 00000000..5dad3c1d --- /dev/null +++ b/packages/eslint-config/rule-sets/readability.yaml @@ -0,0 +1,24 @@ +rules: + # Prefer `else if` instead of a lonely `if` inside of an `else`. + no-lonely-if: 'error' + + # Require dot notation when possible. + dot-notation: 'error' + + # TODO: what should our max be? should we even have one? + # Disallow excessively large files which would be better to be broken up. + max-lines: ['error', { max: 2000, skipBlankLines: true, skipComments: true }] + + # Disallow reassigning method params, treating them as `const`. + no-param-reassign: 'warn' + + no-unused-vars: + - 'warn' + - args: 'none' + destructuredArrayIgnorePattern: '^_' + +overrides: + - files: '*.json' + rules: + # Require keys in package.json to be sorted, improving readability & consistency across projects. + json-files/sort-package-json: 'warn' diff --git a/packages/eslint-config/rule-sets/security.yaml b/packages/eslint-config/rule-sets/security.yaml new file mode 100644 index 00000000..82df4250 --- /dev/null +++ b/packages/eslint-config/rule-sets/security.yaml @@ -0,0 +1,4 @@ +rules: + # Disallow `eval`. + no-eval: 'error' + no-implied-eval: 'error' diff --git a/packages/eslint-config/test/strict.ts b/packages/eslint-config/test/strict.ts new file mode 100644 index 00000000..480a8d89 --- /dev/null +++ b/packages/eslint-config/test/strict.ts @@ -0,0 +1,136 @@ +import { describe, it } from 'node:test'; +import { equal, match, strictEqual } from 'node:assert'; +import { filePath, initESLint } from '@code-style/utils/testing/eslint'; +import { + testNoFail, + testRuleFail, +} from '@code-style/utils/testing/eslint/tests'; +import { defaultTestSet } from '@code-style/utils/testing/eslint/default-test-sets'; + +const linter = initESLint({ extends: ['@code-style/eslint-config'] }); + +void describe('eslint-config strict', () => { + defaultTestSet(linter); + + void describe('passes', () => { + void it(`should pass commonjs import`, () => + testNoFail({ + linter, + files: [{ code: `const foo = require('foo');\n\nfoo();\n` }], + })); + + void it(`should pass commonjs export`, () => + testNoFail({ + linter, + files: [{ code: `module.exports = { foo: 'foo' };\n` }], + })); + + void it(`should pass json-files rules`, () => + testNoFail({ + linter, + files: [ + { + path: 'package.json', + code: `{ + "name": "foo", + "version": "0.0.1", + "description": "Foo bar baz", + "dependencies": { + "tsm": "^2.3.0" + }, + "engines": { + "node": "^20" + } +} +`, + }, + ], + })); + }); + + void describe('fails', () => { + void it(`should fail radix`, async () => + testRuleFail({ + linter, + ruleId: 'radix', + files: [{ code: `parseInt('10');\n` }], + })); + + void it(`should not parse typescript`, () => + linter + .lintText(`((a: string): string[] => a.split(''))()\n`, { + filePath: filePath({ ts: true }), + }) + .then((res) => { + equal(res[0]?.messages[0]?.ruleId, null); + match( + res[0]?.messages[0]?.message ?? '', + /^Parsing error: Unexpected token/u, + ); + return; + })); + + void it(`should fail no-console`, async () => { + const res = await linter.lintText(`console.log('foo');\n`); + // this gets 2 errors due to `console` not being defined + strictEqual(res[0]?.messages[0]?.ruleId, 'no-console'); + }); + + void it(`should fail es module import`, () => + testRuleFail({ + linter, + ruleId: 'no-restricted-syntax', + files: [{ code: `import { foo } from 'console';\n\nfoo();\n` }], + })); + + void it(`should fail es module export`, () => + testRuleFail({ + linter, + ruleId: 'no-restricted-syntax', + files: [{ code: `export const foo = 'foo';\n` }], + })); + + void it(`should fail json-files/require-engines`, () => + testRuleFail({ + linter, + ruleId: 'json-files/require-engines', + files: [ + { + path: 'package.json', + code: `{ + "name": "foo", + "version": "0.0.1", + "description": "Foo bar baz", + "dependencies": { + "tsm": "^2.3.0" + } +} +`, + }, + ], + })); + + void it(`should fail json-files/require-engines`, () => + testRuleFail({ + linter, + ruleId: 'json-files/sort-package-json', + files: [ + { + path: 'package.json', + code: `{ + "name": "foo", + "description": "Foo bar baz", + "version": "0.0.1", + "dependencies": { + "tsm": "^2.3.0" + }, + "engines": { + "node": "^20" + } +} +`, + }, + ], + })); + }); +}); diff --git a/packages/eslint-npm-hoist-packages-esmodule/package.json b/packages/eslint-npm-hoist-packages-esmodule/package.json new file mode 100644 index 00000000..deec676b --- /dev/null +++ b/packages/eslint-npm-hoist-packages-esmodule/package.json @@ -0,0 +1,30 @@ +{ + "name": "@code-style/eslint-npm-hoist-packages-esmodule", + "version": "2.0.0-26", + "description": "Cause NPM to hoist eslint config dependencies", + "keywords": [ + "eslint", + "hack" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-npm-hoist-packages-esmodule/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-npm-hoist-packages-esmodule" + }, + "license": "MIT", + "author": "Louis Orleans ", + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "eslint-plugin-import": "^2.28.1" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-npm-hoist-packages-jest/package.json b/packages/eslint-npm-hoist-packages-jest/package.json new file mode 100644 index 00000000..797f0d5f --- /dev/null +++ b/packages/eslint-npm-hoist-packages-jest/package.json @@ -0,0 +1,35 @@ +{ + "name": "@code-style/eslint-npm-hoist-packages-jest", + "version": "2.0.0-26", + "description": "Cause NPM to hoist eslint config dependencies", + "keywords": [ + "eslint", + "hack" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-npm-hoist-packages/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-npm-hoist-packages" + }, + "license": "MIT", + "author": "Louis Orleans ", + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "eslint-plugin-jest": "^27.4.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "overrides": { + "eslint-plugin-import": { + "tsconfig-paths": "^4.2.0" + } + } +} diff --git a/packages/eslint-npm-hoist-packages-nextjs/package.json b/packages/eslint-npm-hoist-packages-nextjs/package.json new file mode 100644 index 00000000..a20dbf2e --- /dev/null +++ b/packages/eslint-npm-hoist-packages-nextjs/package.json @@ -0,0 +1,30 @@ +{ + "name": "@code-style/eslint-npm-hoist-packages-nextjs", + "version": "2.0.0-26", + "description": "Cause NPM to hoist eslint config dependencies", + "keywords": [ + "eslint", + "hack" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-npm-hoist-packages/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-npm-hoist-packages-nextjs" + }, + "license": "MIT", + "author": "Louis Orleans ", + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "@next/eslint-plugin-next": "^14.1.1" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-npm-hoist-packages-node/package.json b/packages/eslint-npm-hoist-packages-node/package.json new file mode 100644 index 00000000..4118f60c --- /dev/null +++ b/packages/eslint-npm-hoist-packages-node/package.json @@ -0,0 +1,35 @@ +{ + "name": "@code-style/eslint-npm-hoist-packages-node", + "version": "2.0.0-26", + "description": "Cause NPM to hoist eslint config dependencies", + "keywords": [ + "eslint", + "hack" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-npm-hoist-packages/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-npm-hoist-packages" + }, + "license": "MIT", + "author": "Louis Orleans ", + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "eslint-plugin-n": "^16.1.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "overrides": { + "eslint-plugin-import": { + "tsconfig-paths": "^4.2.0" + } + } +} diff --git a/packages/eslint-npm-hoist-packages-react/package.json b/packages/eslint-npm-hoist-packages-react/package.json new file mode 100644 index 00000000..83a3872f --- /dev/null +++ b/packages/eslint-npm-hoist-packages-react/package.json @@ -0,0 +1,37 @@ +{ + "name": "@code-style/eslint-npm-hoist-packages-react", + "version": "2.0.0-26", + "description": "Cause NPM to hoist eslint config dependencies", + "keywords": [ + "eslint", + "hack" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-npm-hoist-packages/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-npm-hoist-packages" + }, + "license": "MIT", + "author": "Louis Orleans ", + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-react": "^7.33.2", + "eslint-plugin-react-hooks": "^4.6.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "overrides": { + "eslint-plugin-import": { + "tsconfig-paths": "^4.2.0" + } + } +} diff --git a/packages/eslint-npm-hoist-packages-typescript/package.json b/packages/eslint-npm-hoist-packages-typescript/package.json new file mode 100644 index 00000000..ad0ef403 --- /dev/null +++ b/packages/eslint-npm-hoist-packages-typescript/package.json @@ -0,0 +1,37 @@ +{ + "name": "@code-style/eslint-npm-hoist-packages-typescript", + "version": "2.0.0-26", + "description": "Cause NPM to hoist eslint config dependencies", + "keywords": [ + "eslint", + "hack" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-npm-hoist-packages/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-npm-hoist-packages" + }, + "license": "MIT", + "author": "Louis Orleans ", + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", + "eslint-plugin-import": "^2.28.1" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "overrides": { + "eslint-plugin-import": { + "tsconfig-paths": "^4.2.0" + } + } +} diff --git a/packages/eslint-npm-hoist-packages/package.json b/packages/eslint-npm-hoist-packages/package.json new file mode 100644 index 00000000..6ee86dd0 --- /dev/null +++ b/packages/eslint-npm-hoist-packages/package.json @@ -0,0 +1,40 @@ +{ + "name": "@code-style/eslint-npm-hoist-packages", + "version": "2.0.0-26", + "description": "Cause NPM to hoist eslint config dependencies", + "keywords": [ + "eslint", + "hack" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-npm-hoist-packages/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-npm-hoist-packages" + }, + "license": "MIT", + "author": "Louis Orleans ", + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "dependencies": { + "@eslint-community/eslint-plugin-eslint-comments": "^4.1.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.28.1", + "eslint-plugin-json-files": "^4.1.0", + "eslint-plugin-prettier": "^5.0.0", + "eslint-plugin-promise": "^6.1.1" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + }, + "overrides": { + "eslint-plugin-import": { + "tsconfig-paths": "^4.2.0" + } + } +} diff --git a/packages/eslint-plugin-nest/.eslintrc.yaml b/packages/eslint-plugin-nest/.eslintrc.yaml new file mode 100644 index 00000000..6900000f --- /dev/null +++ b/packages/eslint-plugin-nest/.eslintrc.yaml @@ -0,0 +1,9 @@ +root: true +extends: + - '@code-style' + - '@code-style/esmodule' + - '@code-style/node' + - '@code-style/jest' + - '@code-style/typescript' +ignorePatterns: + - '/jest.config.mjs' diff --git a/packages/eslint-plugin-nest/README.md b/packages/eslint-plugin-nest/README.md new file mode 100644 index 00000000..1609d3f5 --- /dev/null +++ b/packages/eslint-plugin-nest/README.md @@ -0,0 +1,9 @@ +# @code-style/eslint-plugin-nest + +A set of custom ESlint rules for use with NestJS + +## Rules + +| Name | Description | Recommended | Fixable | +| ------------------------------------------------------------ | ----------------------------------------------------------------------------- | ----------- | ------- | +| [`@code-style/nest/no-barreling`](src/rules/no-barreling.ts) | Disallow barrel files since they can lead to a number of hard to debug issues | โœ… | โŒ | diff --git a/packages/eslint-plugin-nest/jest.config.mjs b/packages/eslint-plugin-nest/jest.config.mjs new file mode 100644 index 00000000..1200de71 --- /dev/null +++ b/packages/eslint-plugin-nest/jest.config.mjs @@ -0,0 +1,4 @@ +import { config } from '@code-style/jest-configs/ts-esm'; + +// eslint-disable-next-line import/no-default-export +export default config; diff --git a/packages/eslint-plugin-nest/package.json b/packages/eslint-plugin-nest/package.json new file mode 100644 index 00000000..14a0d055 --- /dev/null +++ b/packages/eslint-plugin-nest/package.json @@ -0,0 +1,60 @@ +{ + "name": "@code-style/eslint-plugin-nest", + "version": "2.0.0-26", + "description": "My Nest ESLint rules", + "keywords": [ + "style", + "lint", + "plugin", + "eslint" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/eslint-plugin-nest/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/eslint-plugin-nest" + }, + "license": "MIT", + "author": "Louis Orleans ", + "type": "commonjs", + "main": "dist/index.js", + "files": [ + "/dist/" + ], + "scripts": { + "build": "tsc --project tsconfig.build.json", + "lint": "eslint . --ext ts,js,json", + "prepublishOnly": "npm run build", + "test": "NODE_OPTIONS=--experimental-vm-modules npx jest" + }, + "dependencies": { + "@typescript-eslint/typescript-estree": "^6.11.0", + "@typescript-eslint/utils": "^6.11.0" + }, + "devDependencies": { + "@code-style/eslint-config": "^2.0.0-26", + "@code-style/eslint-config-node": "^2.0.0-26", + "@code-style/eslint-config-typescript": "^2.0.0-26", + "@code-style/jest-configs": "^2.0.0-26", + "@code-style/typescript-configs": "^2.0.0-26", + "@types/eslint": "^8.44.2", + "@types/jest": "^29.5.8", + "@types/node": "^20.6.3", + "@typescript-eslint/rule-tester": "^6.11.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "tsm": "^2.3.0", + "typescript": "^5.2.2" + }, + "peerDependencies": { + "@nestjs/core": "*", + "eslint": "^8.49.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/eslint-plugin-nest/src/configs/index.ts b/packages/eslint-plugin-nest/src/configs/index.ts new file mode 100644 index 00000000..cb6afcf0 --- /dev/null +++ b/packages/eslint-plugin-nest/src/configs/index.ts @@ -0,0 +1,7 @@ +import { recommended } from './recommended.js'; +import { recommended_flat } from './recommended-flat.js'; + +export const configs = { + recommended, + recommended_flat, +}; diff --git a/packages/eslint-plugin-nest/src/configs/recommended-flat.ts b/packages/eslint-plugin-nest/src/configs/recommended-flat.ts new file mode 100644 index 00000000..fc7dd0dc --- /dev/null +++ b/packages/eslint-plugin-nest/src/configs/recommended-flat.ts @@ -0,0 +1,8 @@ +import { Linter } from 'eslint'; +import plugin from '../index.js'; +import { recommended } from './recommended.js'; + +export const recommended_flat: Linter.FlatConfig = { + plugins: { '@code-style/nest': plugin }, + rules: recommended.rules, +}; diff --git a/packages/eslint-plugin-nest/src/configs/recommended.ts b/packages/eslint-plugin-nest/src/configs/recommended.ts new file mode 100644 index 00000000..a8b958c3 --- /dev/null +++ b/packages/eslint-plugin-nest/src/configs/recommended.ts @@ -0,0 +1,12 @@ +import { ESLint } from 'eslint'; + +export const recommended: ESLint.ConfigData = { + plugins: ['@code-style/eslint-plugin-nest'], + rules: { + /** + * Disallow barrel files since they can lead to a number of hard to debug + * issues + */ + '@code-style/nest/no-barreling': 'error', + }, +}; diff --git a/packages/eslint-plugin-nest/src/index.ts b/packages/eslint-plugin-nest/src/index.ts new file mode 100644 index 00000000..bf5605ac --- /dev/null +++ b/packages/eslint-plugin-nest/src/index.ts @@ -0,0 +1,11 @@ +import { ESLint } from 'eslint'; + +import { rules } from './rules/index.js'; +import { configs } from './configs/index.js'; + +const plugin: ESLint.Plugin = { + rules, + configs, +}; + +export = plugin; diff --git a/packages/eslint-plugin-nest/src/rules/index.ts b/packages/eslint-plugin-nest/src/rules/index.ts new file mode 100644 index 00000000..6936e0b5 --- /dev/null +++ b/packages/eslint-plugin-nest/src/rules/index.ts @@ -0,0 +1,6 @@ +import type { ESLint, Rule } from 'eslint'; +import { no_barreling } from './no-barreling.js'; + +export const rules: ESLint.Plugin['rules'] = { + 'no-barreling': no_barreling as unknown as Rule.RuleModule, +}; diff --git a/packages/eslint-plugin-nest/src/rules/no-barreling.spec.ts b/packages/eslint-plugin-nest/src/rules/no-barreling.spec.ts new file mode 100644 index 00000000..b5731ceb --- /dev/null +++ b/packages/eslint-plugin-nest/src/rules/no-barreling.spec.ts @@ -0,0 +1,29 @@ +import { RuleTester } from '@typescript-eslint/rule-tester'; +import { no_barreling } from './no-barreling.js'; + +const ruleTester = new RuleTester({ parser: '@typescript-eslint/parser' }); + +ruleTester.run('my-rule', no_barreling, { + valid: [ + { code: `export type * from './test'` }, + { code: `export const foo = 'foo'` }, + { code: `function foo() { return 'foo'; }` }, + ], + + invalid: [ + { + code: `export * from './test'`, + errors: [{ messageId: 'not_allowed' }], + }, + { + code: `export * from './test' +const foo = 'foo'`, + errors: [{ messageId: 'not_allowed' }], + }, + { + code: `export * from './test' +export type * from './test'`, + errors: [{ messageId: 'not_allowed' }], + }, + ], +}); diff --git a/packages/eslint-plugin-nest/src/rules/no-barreling.ts b/packages/eslint-plugin-nest/src/rules/no-barreling.ts new file mode 100644 index 00000000..648e5e34 --- /dev/null +++ b/packages/eslint-plugin-nest/src/rules/no-barreling.ts @@ -0,0 +1,49 @@ +import { ESLintUtils } from '@typescript-eslint/utils'; + +const createRule = ESLintUtils.RuleCreator( + (name) => + `https://github.com/dudeofawesome/code-style/blob/main/eslint-plugin-nest/README.md${name}`, +); + +export const no_barreling = createRule({ + name: 'no-barreling', + defaultOptions: [], + meta: { + type: 'problem', + hasSuggestions: true, + docs: { + description: `Barrel files should not exist as the Nest depency injection system can get confused by them.`, + }, + messages: { + not_allowed: 'Barrel files are not allowed', + delete_export: 'Delete this export declaration', + }, + schema: [], + }, + create(context) { + return { + Program: (node) => { + if ( + node.body.find( + (node) => + node.type === 'ExportAllDeclaration' && + node.exportKind !== 'type', + ) != null + ) { + context.report({ + node, + messageId: 'not_allowed', + suggest: [ + { + messageId: 'delete_export', + fix(fixer) { + return fixer.remove(node); + }, + }, + ], + }); + } + }, + }; + }, +}); diff --git a/packages/eslint-plugin-nest/tsconfig.build.json b/packages/eslint-plugin-nest/tsconfig.build.json new file mode 100644 index 00000000..8c0f74bb --- /dev/null +++ b/packages/eslint-plugin-nest/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["**/*.spec.ts"] +} diff --git a/packages/eslint-plugin-nest/tsconfig.json b/packages/eslint-plugin-nest/tsconfig.json new file mode 100644 index 00000000..3c386d56 --- /dev/null +++ b/packages/eslint-plugin-nest/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule" + ], + "compilerOptions": { + "baseUrl": "src/", + "outDir": "dist/" + }, + "include": ["src/"], + "exclude": ["dist/"] +} diff --git a/packages/jest-configs/.eslintrc.yaml b/packages/jest-configs/.eslintrc.yaml new file mode 100644 index 00000000..c5a60e25 --- /dev/null +++ b/packages/jest-configs/.eslintrc.yaml @@ -0,0 +1,9 @@ +root: true +extends: + - '@code-style/eslint-config' + - '@code-style/eslint-config-node' + - '@code-style/eslint-config-typescript' + - '@code-style/eslint-config-esmodule' + +rules: + import/no-default-export: 'off' diff --git a/packages/jest-configs/README.md b/packages/jest-configs/README.md new file mode 100644 index 00000000..a4a686dc --- /dev/null +++ b/packages/jest-configs/README.md @@ -0,0 +1,16 @@ +# @code-style/jest-configs + +My set of Jest configs + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/jest-configs + ``` + +1. Pick an appropriate config for you project type. +1. Import and then export that config from your `jest.config.js` file. diff --git a/packages/jest-configs/package.json b/packages/jest-configs/package.json new file mode 100644 index 00000000..38b30d54 --- /dev/null +++ b/packages/jest-configs/package.json @@ -0,0 +1,62 @@ +{ + "name": "@code-style/jest-configs", + "version": "2.0.0-26", + "description": "My Jest configs", + "keywords": [ + "jest", + "typescript" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/jest-configs/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/jest-configs" + }, + "license": "MIT", + "author": "Louis Orleans ", + "type": "commonjs", + "exports": { + ".": { + "default": "./dist/ts-cjs.js", + "types": "./dist/ts-cjs.d.ts" + }, + "./*": { + "default": "./dist/*.js", + "types": "./dist/*.d.ts" + } + }, + "main": "dist/ts-cjs.js", + "files": [ + "/dist/" + ], + "scripts": { + "build": "tsc", + "lint": "eslint . --ext ts,js,json", + "prepublishOnly": "npm run build" + }, + "dependencies": { + "ts-jest": "^29.1.2" + }, + "devDependencies": { + "@types/jest": "^29.5.5", + "@types/node": "^20.6.3", + "tsm": "^2.3.0", + "typescript": "^5.0.0" + }, + "peerDependencies": { + "jest": ">=29", + "typescript": ">=5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/jest-configs/src/ts-cjs.ts b/packages/jest-configs/src/ts-cjs.ts new file mode 100644 index 00000000..7afdf1b6 --- /dev/null +++ b/packages/jest-configs/src/ts-cjs.ts @@ -0,0 +1,7 @@ +import type { JestConfigWithTsJest } from 'ts-jest'; + +const config: JestConfigWithTsJest = { + preset: 'ts-jest/presets/default', +}; + +export default config; diff --git a/packages/jest-configs/src/ts-esm.ts b/packages/jest-configs/src/ts-esm.ts new file mode 100644 index 00000000..834b3491 --- /dev/null +++ b/packages/jest-configs/src/ts-esm.ts @@ -0,0 +1,8 @@ +import type { JestConfigWithTsJest } from 'ts-jest'; + +export const config: JestConfigWithTsJest = { + preset: 'ts-jest/presets/default-esm', + moduleNameMapper: { + '^(\\.{1,2}/.*)\\.js$': '$1', + }, +}; diff --git a/packages/jest-configs/tsconfig.json b/packages/jest-configs/tsconfig.json new file mode 100644 index 00000000..a7886abe --- /dev/null +++ b/packages/jest-configs/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/base", + "@code-style/typescript-configs/layers/esmodule", + "@code-style/typescript-configs/layers/library" + ], + "compilerOptions": { + "baseUrl": "src/", + "outDir": "dist/" + }, + "include": ["src/"], + "exclude": ["dist/"] +} diff --git a/code-style/.rubocop.yml b/packages/rubocop-config/base.yaml similarity index 100% rename from code-style/.rubocop.yml rename to packages/rubocop-config/base.yaml diff --git a/packages/rubocop-config/examples/.rubocop.yml b/packages/rubocop-config/examples/.rubocop.yml new file mode 100644 index 00000000..a987fbbd --- /dev/null +++ b/packages/rubocop-config/examples/.rubocop.yml @@ -0,0 +1 @@ +inherit_from: 'node_modules/@code-style/code-style/.rubocop.yml' diff --git a/packages/rubocop-config/package.json b/packages/rubocop-config/package.json new file mode 100644 index 00000000..a5f9921d --- /dev/null +++ b/packages/rubocop-config/package.json @@ -0,0 +1,36 @@ +{ + "name": "@code-style/rubocop-configs", + "version": "2.0.0-26", + "description": "My Rubocop configs", + "keywords": [ + "ruby", + "rubocop" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/rubocop-config/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/rubocop-config" + }, + "license": "MIT", + "author": "Louis Orleans ", + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "echo 'No tests'; exit 0" + }, + "devDependencies": { + "@types/jest": "^29.5.5", + "@types/node": "^20.6.3", + "tsm": "^2.3.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/stylelint-config-scss/README.md b/packages/stylelint-config-scss/README.md new file mode 100644 index 00000000..98d4abba --- /dev/null +++ b/packages/stylelint-config-scss/README.md @@ -0,0 +1,21 @@ +# @code-style/stylelint-config-scss + +A set of StyleLint SCSS rules customized for code corectness. + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/stylelint-config-scss + ``` + +1. Add the plugin to your StyleLint config. + + ```diff + extends: + - '@code-style/stylelint-config' + + - '@code-style/stylelint-config-scss' + ``` diff --git a/packages/stylelint-config-scss/base.yaml b/packages/stylelint-config-scss/base.yaml new file mode 100644 index 00000000..6e723dbb --- /dev/null +++ b/packages/stylelint-config-scss/base.yaml @@ -0,0 +1,7 @@ +extends: + - 'stylelint-config-standard-scss' + - 'stylelint-config-sass-guidelines' +rules: + scss/at-mixin-pattern: null + scss/dollar-variable-pattern: null + scss/percent-placeholder-pattern: null diff --git a/packages/stylelint-config-scss/package.json b/packages/stylelint-config-scss/package.json new file mode 100644 index 00000000..7506d2e7 --- /dev/null +++ b/packages/stylelint-config-scss/package.json @@ -0,0 +1,48 @@ +{ + "name": "@code-style/stylelint-config-scss", + "version": "2.0.0-26", + "description": "My stylelint configs", + "keywords": [ + "stylelint", + "style", + "css", + "scss", + "lint", + "config" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/stylelint-config-scss/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/stylelint-config-scss" + }, + "license": "MIT", + "author": "Louis Orleans ", + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "stylelint": "^16.3.1", + "stylelint-config-sass-guidelines": "^11.1.0", + "stylelint-config-standard-scss": "^13.1.0" + }, + "devDependencies": { + "@types/node": "^20.8.4", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "sass-embedded": "^1.33.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/stylelint-config-scss/test/index.ts b/packages/stylelint-config-scss/test/index.ts new file mode 100644 index 00000000..cbc056c8 --- /dev/null +++ b/packages/stylelint-config-scss/test/index.ts @@ -0,0 +1,37 @@ +import { describe, it } from 'node:test'; +import { testNoFail } from '@code-style/utils/testing/stylelint'; +import { defaultTestSet } from '@code-style/utils/testing/stylelint/default-test-sets'; + +void describe('styleint-config-scss', () => { + const config = { + extends: [ + '@code-style/stylelint-config', + '@code-style/stylelint-config-scss', + ], + }; + + defaultTestSet(config); + + void describe('passes', () => { + void it('should lint scss', () => + testNoFail({ + config, + files: [ + { + code: `$myvar: 'red'; + +html { + a { + color: $myvar; + } +} +`, + }, + ], + })); + }); + + void describe('fails', () => { + return; + }); +}); diff --git a/packages/stylelint-config/README.md b/packages/stylelint-config/README.md new file mode 100644 index 00000000..85153f24 --- /dev/null +++ b/packages/stylelint-config/README.md @@ -0,0 +1,13 @@ +# @code-style/stylelint-config + +A set of StyleLint rules customized for code corectness. + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +TODO(1): Evaluate the following plugins: + +- [ ] https://github.com/stylelint/awesome-stylelint#readme +- [ ] https://github.com/prettier/stylelint-config-prettier-scss +- [ ] https://github.com/prettier/stylelint-prettier#readme diff --git a/packages/stylelint-config/base.yaml b/packages/stylelint-config/base.yaml new file mode 100644 index 00000000..dff59ad2 --- /dev/null +++ b/packages/stylelint-config/base.yaml @@ -0,0 +1,25 @@ +extends: + - 'stylelint-config-standard' + - 'stylelint-prettier/recommended' +plugins: + - 'stylelint-order' +rules: + at-rule-no-unknown: true + color-named: null + selector-class-pattern: null + selector-no-qualifying-type: null + selector-no-vendor-prefix: null + property-no-vendor-prefix: null + value-no-vendor-prefix: null + max-nesting-depth: 2 + order/order: + - 'dollar-variables' + - 'custom-properties' + - 'declarations' + - 'rules' + - type: 'at-rule' + name: 'include' + parameter: 'media' + - type: 'at-rule' + name: 'include' + parameter: 'print' diff --git a/packages/stylelint-config/package.json b/packages/stylelint-config/package.json new file mode 100644 index 00000000..e12197d2 --- /dev/null +++ b/packages/stylelint-config/package.json @@ -0,0 +1,48 @@ +{ + "name": "@code-style/stylelint-config", + "version": "2.0.0-26", + "description": "My stylelint configs", + "keywords": [ + "stylelint", + "style", + "css", + "lint", + "config" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/stylelint-config/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/stylelint-config" + }, + "license": "MIT", + "author": "Louis Orleans ", + "main": "base.yaml", + "files": [ + "/base.yaml" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "stylelint": "^16.3.1", + "stylelint-config-standard": "^36.0.0", + "stylelint-order": "^6.0.4", + "stylelint-prettier": "^5.0.0" + }, + "devDependencies": { + "@types/node": "^20.8.4", + "tsm": "^2.3.0" + }, + "peerDependencies": { + "prettier": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/stylelint-config/test/index.ts b/packages/stylelint-config/test/index.ts new file mode 100644 index 00000000..f551058c --- /dev/null +++ b/packages/stylelint-config/test/index.ts @@ -0,0 +1,16 @@ +import { describe } from 'node:test'; +import { defaultTestSet } from '@code-style/utils/testing/stylelint/default-test-sets'; + +void describe('styleint-config', () => { + const config = { extends: '@code-style/stylelint-config' }; + + defaultTestSet(config); + + void describe('passes', () => { + return; + }); + + void describe('fails', () => { + return; + }); +}); diff --git a/packages/typescript-configs/.gitignore b/packages/typescript-configs/.gitignore new file mode 100644 index 00000000..849ddff3 --- /dev/null +++ b/packages/typescript-configs/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/packages/typescript-configs/README.md b/packages/typescript-configs/README.md new file mode 100644 index 00000000..f4d25e8c --- /dev/null +++ b/packages/typescript-configs/README.md @@ -0,0 +1,54 @@ +# @code-style/typescript-configs + +My set of tsc config files + +## Usage + +**The easiest way to get started with this project is to use our [setup script](https://www.npmjs.com/package/@code-style/create-configs).** + +1. Install this config plugin as a dev dependency. + + ```sh + npm i -D @code-style/typescript-configs + ``` + +1. Pick an appropriate role config to base your on. + + For example, you could pick `@code-style/typescript-configs/roles/node.json`. + +1. Pick any appropriate layer configs to add to your config. + + For example, you could pick `@code-style/typescript-configs/layers/esmodule.json`. + +1. Create your `tsconfig.json`. + + ```json + { + "extends": [ + "@code-style/typescript-configs/roles/node.json", + "@code-style/typescript-configs/layers/esmodule.json" + ] + } + ``` + +1. Set your `baseUrl` and `outDir` paths. + + ```json + { + ... + "compilerOptions": { + "baseUrl": "src/", + "outDir": "dist/" + } + } + ``` + +1. Set your `include` and `exclude` paths. + + ```json + { + ... + "include": ["src/"], + "exclude": ["dist/"] + } + ``` diff --git a/packages/typescript-configs/layers/commonjs.json b/packages/typescript-configs/layers/commonjs.json new file mode 100644 index 00000000..caec2bf4 --- /dev/null +++ b/packages/typescript-configs/layers/commonjs.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + //=== MODULES ===// + /** + * `CommonJS` will transpile your code to CommonJS for better compatability. + * You might be interested in using the `esmodule.json` config. + */ + "module": "CommonJS", + /** + * `Node10` supports only `require`, forcing transpilation of `import`s. + * `bundler` should not be used. + */ + "moduleResolution": "Node10" + } +} diff --git a/packages/typescript-configs/layers/esmodule.json b/packages/typescript-configs/layers/esmodule.json new file mode 100644 index 00000000..8e1ae593 --- /dev/null +++ b/packages/typescript-configs/layers/esmodule.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + //=== MODULES ===// + /** + * `NodeNext` integrates with node's esm support. Depending upon + * package.json's `type` setting, will either use CommonJS or ESM. + */ + "module": "NodeNext", + // `NodeNext` supports both `import` & `require`. + "moduleResolution": "NodeNext", + // Detect whether or not to treat project as esm. + "moduleDetection": "auto" + } +} diff --git a/packages/typescript-configs/layers/jest.json b/packages/typescript-configs/layers/jest.json new file mode 100644 index 00000000..0967ef42 --- /dev/null +++ b/packages/typescript-configs/layers/jest.json @@ -0,0 +1 @@ +{} diff --git a/packages/typescript-configs/layers/legacy-decorators.json b/packages/typescript-configs/layers/legacy-decorators.json new file mode 100644 index 00000000..3a58d180 --- /dev/null +++ b/packages/typescript-configs/layers/legacy-decorators.json @@ -0,0 +1,9 @@ +{ + "compilerOptions": { + //=== DECORATORS ===// + // emit metadata about decorators + "emitDecoratorMetadata": true, + // enables pre-standardization decorators + "experimentalDecorators": true + } +} diff --git a/packages/typescript-configs/layers/lenient.json b/packages/typescript-configs/layers/lenient.json new file mode 100644 index 00000000..826b5c87 --- /dev/null +++ b/packages/typescript-configs/layers/lenient.json @@ -0,0 +1,13 @@ +{ + "extends": ["./strict.json"], + "compilerOptions": { + //=== STRICTNESS ===// + // allow assumption that array indices aren't null + "noUncheckedIndexedAccess": false, + + // TODO: do we actually want to turn these off? + "noImplicitAny": false, + "strictPropertyInitialization": false, + "useUnknownInCatchVariables": false + } +} diff --git a/packages/typescript-configs/layers/library.json b/packages/typescript-configs/layers/library.json new file mode 100644 index 00000000..e623c194 --- /dev/null +++ b/packages/typescript-configs/layers/library.json @@ -0,0 +1,15 @@ +{ + /** + * This config sets up the compiler to emit type declarations, declaration + * maps, and source maps. This helps to improve usability of the published + * module. + */ + "compilerOptions": { + // enable type declaration generation + "declaration": true, + // enable declaration-map generation + "declarationMap": true, + // enable source-map generation + "sourceMap": true + } +} diff --git a/packages/typescript-configs/layers/nextjs.json b/packages/typescript-configs/layers/nextjs.json new file mode 100644 index 00000000..f0db21ae --- /dev/null +++ b/packages/typescript-configs/layers/nextjs.json @@ -0,0 +1,11 @@ +{ + "extends": ["./react.json"], + "compilerOptions": { + // use SWC + "noEmit": true, + // required for SWC + "isolatedModules": true, + // next.js implements its own optimized jsx transform + "jsx": "preserve" + } +} diff --git a/packages/typescript-configs/layers/react.json b/packages/typescript-configs/layers/react.json new file mode 100644 index 00000000..2bec8d86 --- /dev/null +++ b/packages/typescript-configs/layers/react.json @@ -0,0 +1,6 @@ +{ + "compilerOptions": { + // enable React JSX transpilation. + "jsx": "react" + } +} diff --git a/packages/typescript-configs/layers/strict.json b/packages/typescript-configs/layers/strict.json new file mode 100644 index 00000000..c8283e86 --- /dev/null +++ b/packages/typescript-configs/layers/strict.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + //=== STRICTNESS ===// + // enable the strict family of TS flags + "strict": true, + // ensure that array indexes aren't null upon access + "noUncheckedIndexedAccess": true, // TODO: can we actually do this? + // prevent unexpected behavior with missing `break` statements + "noFallthroughCasesInSwitch": true, + // type-check .d.ts files + "skipLibCheck": false + } +} diff --git a/packages/typescript-configs/package.json b/packages/typescript-configs/package.json new file mode 100644 index 00000000..a0e3aec5 --- /dev/null +++ b/packages/typescript-configs/package.json @@ -0,0 +1,54 @@ +{ + "name": "@code-style/typescript-configs", + "version": "2.0.0-26", + "description": "My Typescript configs", + "keywords": [ + "typescript", + "tsconfig" + ], + "homepage": "https://github.com/dudeofawesome/code-style/blob/main/packages/typescript-configs/README.md", + "repository": { + "type": "git", + "url": "git+ssh://git@github.com/dudeofawesome/code-style.git", + "directory": "/packages/typescript-configs" + }, + "license": "MIT", + "author": "Louis Orleans ", + "exports": { + ".": "./roles/base.json", + "./roles/*": "./roles/*.json", + "./layers/*": "./layers/*.json", + "./roles/*.json": "./roles/*.json", + "./layers/*.json": "./layers/*.json", + "./*.json": "./*.json" + }, + "main": "roles/base.json", + "files": [ + "/roles/", + "/layers/" + ], + "scripts": { + "test": "node $NODE_OPTS --require tsm --test test/*.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "tslib": "^2.6.2" + }, + "devDependencies": { + "@types/jest": "^29.5.5", + "@types/node": "^20.6.3", + "@types/react": "^18.2.23", + "tsm": "^2.3.0", + "typescript": "^5.0.0" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + }, + "engines": { + "node": ">=18" + }, + "publishConfig": { + "access": "public", + "provenance": true + } +} diff --git a/packages/typescript-configs/roles/base.json b/packages/typescript-configs/roles/base.json new file mode 100644 index 00000000..6d8bfcdb --- /dev/null +++ b/packages/typescript-configs/roles/base.json @@ -0,0 +1,35 @@ +{ + "extends": ["../layers/commonjs.json", "../layers/strict.json"], + "compilerOptions": { + //=== MODULES ===// + // fixes some issues around importing commonjs from esm + "esModuleInterop": true, + // synthesize default imports + "allowSyntheticDefaultImports": true, + + //=== INPUT ===// + // type-check .d.ts files + "skipLibCheck": false, + // allow interop with JS files in project + "allowJs": true, + // type-check JS + "checkJs": true, + "incremental": true, + // eliminates inconsistencies with case-sensitive filesystems + "forceConsistentCasingInFileNames": true, + // enable importing json + "resolveJsonModule": true, + // defines environment + "lib": ["ES2022"], + + //=== OUTPUT ===// + // emit .d.ts files + "declaration": true, + // transpiles TS to es2022 + "target": "es2022", + // emit sourcemaps + "sourceMap": true, + // use tslib helper functions instead of in-lining them + "importHelpers": true + } +} diff --git a/packages/typescript-configs/roles/browser.json b/packages/typescript-configs/roles/browser.json new file mode 100644 index 00000000..a89aceec --- /dev/null +++ b/packages/typescript-configs/roles/browser.json @@ -0,0 +1,10 @@ +{ + "extends": "./base.json", + "compilerOptions": { + // TODO(0): does this layer onto the lib from base? + // defines environment + "lib": ["DOM"], + // transpiles TS to es2019 + "target": "ES2019" // TODO: what browsers do we want to support? + } +} diff --git a/packages/typescript-configs/roles/nest.json b/packages/typescript-configs/roles/nest.json new file mode 100644 index 00000000..c86802ba --- /dev/null +++ b/packages/typescript-configs/roles/nest.json @@ -0,0 +1,7 @@ +{ + "extends": [ + "./node.json", + "../layers/commonjs.json", + "../layers/legacy-decorators.json" + ] +} diff --git a/packages/typescript-configs/roles/node.json b/packages/typescript-configs/roles/node.json new file mode 100644 index 00000000..5ffb8fed --- /dev/null +++ b/packages/typescript-configs/roles/node.json @@ -0,0 +1,3 @@ +{ + "extends": "./base.json" +} diff --git a/packages/typescript-configs/test/index.ts b/packages/typescript-configs/test/index.ts new file mode 100644 index 00000000..43c59dad --- /dev/null +++ b/packages/typescript-configs/test/index.ts @@ -0,0 +1,106 @@ +import { describe, it } from 'node:test'; +import { deepEqual, strictEqual, match } from 'node:assert'; +import { exec as execCallback } from 'node:child_process'; +import { promisify } from 'node:util'; +import { basename, join } from 'node:path'; +import { readFile } from 'node:fs/promises'; + +const exec = promisify(execCallback); + +void describe('typescript-configs', () => { + void describe('jest', () => + Promise.all([ + transpile_and_test({ dir: 'jest', code_fragment: 'function foo()' }), + transpile_and_test({ + dir: 'jest', + ts_config: 'tsconfig.test.json', + output_files: [ + 'index.js', + 'index.js.map', + 'index.d.ts', + 'index.spec.js', + 'index.spec.js.map', + 'index.spec.d.ts', + ], + search_file: 'test/index.spec.js', + code_fragment: 'expect', + }), + ]).then(() => undefined)); + + void describe('library', () => + transpile_and_test({ + dir: 'library', + output_files: [ + 'index.js', + 'index.js.map', + 'index.d.ts', + 'index.d.ts.map', + ], + code_fragment: `return 'bar'`, + })); + + void describe('node', () => + transpile_and_test({ + dir: 'node', + code_fragment: 'process.env.PATH', + })); + + void describe('react', () => + transpile_and_test({ + dir: 'react', + code_fragment: 'window.location.href', + })); +}); + +interface TranspileAndTestOpts { + dir: string; + ts_config?: string; + output_files?: string[]; + search_file?: string; + code_fragment?: string; +} +async function transpile_and_test({ + dir, + ts_config = 'tsconfig.json', + output_files = ['index.js', 'index.js.map', 'index.d.ts'], + search_file = 'index.js', + code_fragment, +}: TranspileAndTestOpts): Promise { + const cwd = join(__dirname, dir); + const out_dir = join(cwd, 'dist'); + const tsc_path = require.resolve('typescript/bin/tsc'); + const out = await exec( + `${tsc_path} --project "${ts_config}" --outDir "${out_dir}" --incremental false --listEmittedFiles`, + { + cwd, + env: { + ...process.env, + // prevent debugging TSC + NODE_OPTIONS: undefined, + }, + }, + ); + + void it('should not output any errors', () => { + strictEqual(out.stderr, ''); + }); + + void it('should create transpiled files', () => { + deepEqual( + out.stdout + .split('\n') + .filter(Boolean) + .map((line) => basename(line.split('TSFILE: ')[1] ?? '')), + output_files, + ); + }); + + if (code_fragment != null) { + await it('should contain some expected code', async () => { + match( + (await readFile(join(out_dir, search_file))).toString(), + new RegExp(code_fragment, 'u'), + ); + }); + } +} diff --git a/packages/typescript-configs/test/jest/src/index.ts b/packages/typescript-configs/test/jest/src/index.ts new file mode 100644 index 00000000..85ad97c1 --- /dev/null +++ b/packages/typescript-configs/test/jest/src/index.ts @@ -0,0 +1,3 @@ +export function foo(): string { + return 'bar'; +} diff --git a/packages/typescript-configs/test/jest/test/index.spec.ts b/packages/typescript-configs/test/jest/test/index.spec.ts new file mode 100644 index 00000000..d58ac787 --- /dev/null +++ b/packages/typescript-configs/test/jest/test/index.spec.ts @@ -0,0 +1,7 @@ +import { foo } from '../src/index'; + +describe('foo', () => { + it('should be bar', () => { + expect(foo()).toBe('bar'); + }); +}); diff --git a/packages/typescript-configs/test/jest/tsconfig.json b/packages/typescript-configs/test/jest/tsconfig.json new file mode 100644 index 00000000..426f7f56 --- /dev/null +++ b/packages/typescript-configs/test/jest/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": ["@code-style/typescript-configs/roles/node"], + "include": ["src/"], + "exclude": ["dist/", "test/"] +} diff --git a/packages/typescript-configs/test/jest/tsconfig.test.json b/packages/typescript-configs/test/jest/tsconfig.test.json new file mode 100644 index 00000000..271905ce --- /dev/null +++ b/packages/typescript-configs/test/jest/tsconfig.test.json @@ -0,0 +1,8 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/node.json", + "@code-style/typescript-configs/layers/jest.json" + ], + "include": ["test/", "src/"], + "exclude": ["dist/"] +} diff --git a/packages/typescript-configs/test/library/src/index.ts b/packages/typescript-configs/test/library/src/index.ts new file mode 100644 index 00000000..85ad97c1 --- /dev/null +++ b/packages/typescript-configs/test/library/src/index.ts @@ -0,0 +1,3 @@ +export function foo(): string { + return 'bar'; +} diff --git a/packages/typescript-configs/test/library/tsconfig.json b/packages/typescript-configs/test/library/tsconfig.json new file mode 100644 index 00000000..4f9f2745 --- /dev/null +++ b/packages/typescript-configs/test/library/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/library" + ], + "include": ["src/"], + "exclude": ["dist/"] +} diff --git a/packages/typescript-configs/test/node/src/index.ts b/packages/typescript-configs/test/node/src/index.ts new file mode 100644 index 00000000..22d605df --- /dev/null +++ b/packages/typescript-configs/test/node/src/index.ts @@ -0,0 +1,5 @@ +import { log } from 'console'; +import { readdir } from 'node:fs/promises'; + +log(process.env.PATH); +readdir('./').then(log); diff --git a/packages/typescript-configs/test/node/tsconfig.json b/packages/typescript-configs/test/node/tsconfig.json new file mode 100644 index 00000000..6d71db09 --- /dev/null +++ b/packages/typescript-configs/test/node/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": ["@code-style/typescript-configs/roles/node"], + "include": ["src/"], + "exclude": ["dist/"] +} diff --git a/packages/typescript-configs/test/react/src/index.tsx b/packages/typescript-configs/test/react/src/index.tsx new file mode 100644 index 00000000..4f73f8d5 --- /dev/null +++ b/packages/typescript-configs/test/react/src/index.tsx @@ -0,0 +1,6 @@ +import React from 'react'; + +export default function foo() { + alert(window.location.href); + return

{document.body.innerHTML}

; +} diff --git a/packages/typescript-configs/test/react/tsconfig.json b/packages/typescript-configs/test/react/tsconfig.json new file mode 100644 index 00000000..d63ecea3 --- /dev/null +++ b/packages/typescript-configs/test/react/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/browser", + "@code-style/typescript-configs/layers/react" + ], + "include": ["src/"], + "exclude": ["dist/"] +} diff --git a/packages/typescript-configs/test/tsconfig.json b/packages/typescript-configs/test/tsconfig.json new file mode 100644 index 00000000..a2680cf5 --- /dev/null +++ b/packages/typescript-configs/test/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule", + "@code-style/typescript-configs/layers/jest" + ], + "files": ["index.ts"] +} diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100755 index 00000000..8f6e0597 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -e + +npm run build --workspace packages/code-style +scripts/concurrently-ws.ts build \ + --skip \ + packages/code-style + +echo 'All builds succeeded.' diff --git a/scripts/bump.sh b/scripts/bump.sh deleted file mode 100755 index 14b71dfe..00000000 --- a/scripts/bump.sh +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env bash -set -e - -bump() { - npm version --no-git-tag-version "$1" - - version="$(jq --raw-output '.version' package.json)" - - npm version "$version" --ws - - git add package*.json **/package*.json - git commit --message "๐Ÿš€๐Ÿ”– release v$version" - git tag "v$version" -} - -help () { - echo -e "" - echo -e "Usage:\t$(basename $0) [options] |major|minor|patch|premajor|preminor|prepatch|prerelease" - echo -e "" - echo -e "Options:" - echo -e " -h, --help Show this message" - echo -e "" - echo -e "Bumps all package versions in project to the specified version." -} - -option_error () { - echo "Unknown argument '$1'" - help - exit 128 -} - -main () { - while getopts 'o:s:wlh-:' opt; do - case "$opt" in - h) help; exit 0;; - -) - case "${OPTARG}" in - help) help; exit 0;; - *) option_error "$OPTARG";; - esac - ;; - *) option_error "$OPTARG";; - esac - done - - bump "$@" -} - -main "$@" diff --git a/scripts/bump.ts b/scripts/bump.ts new file mode 100755 index 00000000..96361094 --- /dev/null +++ b/scripts/bump.ts @@ -0,0 +1,179 @@ +#!/usr/bin/env -S node --loader tsm + +import { exec as execCallback } from 'node:child_process'; +import { promisify } from 'node:util'; +import { log } from 'node:console'; +import { readFile } from 'node:fs/promises'; +import Yargs from 'yargs/yargs'; +import { hideBin } from 'yargs/helpers'; + +const exec = promisify(execCallback); + +interface NpmWorkspace { + [key: string]: unknown; + + name: string; + version?: string; + dependencies?: Record; + peerDependencies?: Record; + devDependencies?: Record; + /** local path to the package */ + location: string; + /** absolute path to the package */ + path: string; + /** normalized absolute path to the package */ + realpath: string; +} +type NpmWorkspaceQueryResponse = NpmWorkspace[]; + +function run(command: string, dry_run: boolean) { + if (dry_run) { + log(`$ ${command}`); + } else { + return exec(command).then((res) => res.stdout); + } +} + +interface BumpOptions { + dryRun?: boolean; +} +async function bump(type: string, { dryRun = true }: BumpOptions = {}) { + log('Bumping main package version.'); + await run(`npm version --no-git-tag-version "${type}"`, dryRun); + + const new_version: string = ( + JSON.parse((await readFile('package.json')).toString()) as { + version: string; + } + ).version; + + log('Bumping sub-package versions.'); + // await run(`npm version "${new_version}" --ws`, dryRun); + await bump_subpackages(new_version, { dryRun }); + await run(`npm install`, dryRun); + + log('Committing changes.'); + await run(`git add package*.json **/package*.json`, dryRun); + await run(`git commit --message "๐Ÿš€๐Ÿ”– release v${new_version}"`, dryRun); + await run(`git tag "v${new_version}"`, dryRun); +} + +interface BumpSubpackagesOptions extends BumpOptions { + bumped_packages?: Set; +} +async function bump_subpackages( + version: string, + { dryRun = true, bumped_packages = new Set() }: BumpSubpackagesOptions = {}, +) { + const workspaces: NpmWorkspaceQueryResponse = JSON.parse( + await exec(`npm query .workspace`).then((res) => res.stdout), + ) as NpmWorkspaceQueryResponse; + + const leaves = find_leaves(workspaces, bumped_packages) + // ignore packages we've already bumped + .filter((l) => !bumped_packages.has(l.name)); + log(leaves.length); + log(leaves.map((l) => l.name)); + + if (leaves.length === 0) { + throw new Error(`Didn't find any leaves to bump!`); + } + + // TODO: this still seems to get confused when upgrading packages with dependents + await run( + `npm version "${version}" ${leaves + .map((l) => `--workspace ${l.location}`) + .join(' ')}`, + dryRun, + ); + + await run( + `npx upgrade-packages ${leaves + .map((l) => `${l.name}@${version}`) + .join(' ')}`, + dryRun, + ); + + leaves.forEach((l) => bumped_packages.add(l.name)); + + if (bumped_packages.size < workspaces.length) { + await bump_subpackages(version, { dryRun, bumped_packages }); + } +} + +function find_leaves( + workspaces: NpmWorkspaceQueryResponse, + ignore: Set, +): NpmWorkspace[] { + return workspaces.filter( + (possible_leaf) => + // check that we found no dependents + find_dependents(workspaces, possible_leaf, ignore).length === 0, + ); +} + +function find_dependents( + haystack: NpmWorkspaceQueryResponse, + needle: NpmWorkspace, + ignore: Set = new Set(), +): NpmWorkspace[] { + return haystack.filter( + (potential_dependent) => + // ensure we're not looking at ourself + (needle !== potential_dependent || + needle.name !== potential_dependent.name) && + // ingore if we're told to + !ignore.has(potential_dependent.name) && + // check if possible_leaf is listed in potential_dependent's dependencies + (potential_dependent.dependencies?.[needle.name] != null || + potential_dependent.devDependencies?.[needle.name] != null || + potential_dependent.peerDependencies?.[needle.name] != null), + ); +} + +async function main() { + const args = await Yargs(hideBin(process.argv)) + .scriptName('bump') + .usage('Usage:\t$0 [options] [new-version]') + .option('dry-run', { + alias: 'd', + description: 'Prevent changing state', + boolean: true, + default: false, + }) + .positional('new-version', { + description: + '|major|minor|patch|premajor|preminor|prepatch|prerelease', + demandOption: true, + type: 'string', + choices: [ + 'major', + 'minor', + 'patch', + 'premajor', + 'preminor', + 'prepatch', + 'prerelease', + ], + default: 'patch', + boolean: true, + }) + .help() + .parserConfiguration({ + 'strip-aliased': true, + 'strip-dashed': true, + }) + .middleware([ + // hack to get positional arguments on root command + (args): void => { + const version = args._.shift(); + if (version != null) { + args.newVersion = version.toString(); + } + }, + ]).argv; + + await bump(args.newVersion, args); +} + +await main(); diff --git a/scripts/concurrently-ws.ts b/scripts/concurrently-ws.ts new file mode 100755 index 00000000..5f1b6b43 --- /dev/null +++ b/scripts/concurrently-ws.ts @@ -0,0 +1,43 @@ +#!/usr/bin/env -S node --loader tsm +/* eslint-disable n/no-sync */ + +import { execSync } from 'node:child_process'; +import { concurrently, CloseEvent } from 'concurrently'; + +const script = process.argv[2]; +const skip_workspaces = + (process.argv[3] != null && ['--skip', '-s'].includes(process.argv[3]) + ? process.argv[4]?.split(',').map((ws) => ws.replace(/\/?$/u, '')) + : null) ?? []; +const extra_commands = process.argv.slice(skip_workspaces.length === 0 ? 3 : 5); + +const workspaces = ( + JSON.parse(execSync(`npm query .workspace`, { encoding: 'utf-8' })) as { + location: string; + }[] +) + .map((p) => p.location) + .filter((ws) => !skip_workspaces.includes(ws)); + +const res = concurrently( + workspaces + .map((workspace) => ({ + command: `npm run ${script} --workspace ${workspace} --if-present`, + // name: workspace, + })) + .concat(extra_commands.map((command) => ({ command }))), + { group: true, raw: true }, +); + +await res.result.catch((err: CloseEvent[]) => { + console.error('The following commands failed:'); + console.error( + err + .filter((ev) => ev.exitCode !== 0) + .map((ev) => `"${ev.command.command}"`) + .join(', '), + ); + process.exit(1); +}); + +/* eslint-enable n/no-sync */ diff --git a/scripts/upgrade-packages.sh b/scripts/upgrade-packages.sh new file mode 100755 index 00000000..ab34cbfd --- /dev/null +++ b/scripts/upgrade-packages.sh @@ -0,0 +1,100 @@ +#!/usr/bin/env bash +set -e + +upgrade_packages() { + input="$@" + + package_names=() + package_versions=() + + regex='^(@?[a-z0-9\/\-]+)(@.+)?$' + for package in $input; do + package_name="$(echo "$package" | sed -r 's/'"$regex"'/\1/i')" + package_version="$(echo "$package" | sed -r 's/'"$regex"'/\2/i')" + + package_names+=("$package_name") + package_versions+=("$package_name${package_version:-@latest}") + done + + echo "Upgrading to $package_versions" + + select_filter=".\"${package_names[0]}\" != null" + for package_name in ${package_names[@]:1}; do + select_filter="$select_filter and .\"$package_name\" != null" + done + + all_packages="$(jq --raw-output \ + '[.workspaces[]] + | map("\(.)/package.json") + | .[]' \ + package.json)" + + relevant_workspaces="$(jq --raw-output \ + '. + # join all dependency sets + | (.dependencies // {}) + * (.devDependencies // {}) + * (.peerDependencies // {}) + * (.optionalDependencies // {}) + # filter for packages with the specified packages + | select('"$select_filter"') + # get name of file + | input_filename + # get workspace name + | split("/package.json") + | .[0] + # convert to npm workspace arg + | "--workspace=\(.)"' \ + $all_packages)" + + echo "$relevant_workspaces" + + if [ -z "$relevant_workspaces" ]; then + echo "No workspaces with specified packages found" + exit 0 + fi + + npm install \ + ${package_versions[*]} \ + $relevant_workspaces +} + +help () { + echo -e "" + echo -e "Usage:\t$(basename $0) [options] PACKAGE[@VERSION] [PACKAGE[@VERSION]...]" + echo -e "" + echo -e "Options:" + echo -e " -h, --help Show this message" + echo -e "" + echo -e "Upgrades all eslint versions together." +} + +option_error () { + echo "Unknown argument '$1'" + help + exit 128 +} + +main () { + while getopts 'h-:' opt; do + case "$opt" in + h) help; exit 0;; + -) + case "${OPTARG}" in + help) help; exit 0;; + *) option_error "$OPTARG";; + esac + ;; + *) option_error "$OPTARG";; + esac + done + + if [ -z "$1" ]; then + echo "A package name is required" + exit 1 + fi + + upgrade_packages "$@" +} + +main "$@" diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..15dca804 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": [ + "@code-style/typescript-configs/roles/node", + "@code-style/typescript-configs/layers/esmodule" + ], + "compilerOptions": { "noEmit": true, "outDir": "dist/" }, + "include": ["packages/*/test/", "utils/", "scripts/"], + "exclude": [ + "**/dist/", + "packages/typescript-configs/", + "packages/javascript-configs/" + ] +} diff --git a/utils/package.json b/utils/package.json new file mode 100644 index 00000000..70b46d2c --- /dev/null +++ b/utils/package.json @@ -0,0 +1,16 @@ +{ + "name": "@code-style/utils", + "version": "2.0.0-26", + "private": true, + "scripts": { + "test": "shopt -s globstar; node $NODE_OPTS --require tsm --test **/*.test.ts", + "test:debug": "NODE_OPTS='--inspect-brk' npm run test" + }, + "dependencies": { + "eslint": "^8.51.0", + "stylelint": "^16.3.1" + }, + "engines": { + "node": ">=18" + } +} diff --git a/utils/testing/eslint/default-test-sets.ts b/utils/testing/eslint/default-test-sets.ts new file mode 100644 index 00000000..aeeffa27 --- /dev/null +++ b/utils/testing/eslint/default-test-sets.ts @@ -0,0 +1,46 @@ +import { describe, it } from 'node:test'; +import { ESLint } from 'eslint'; +import { testNoFail, testRuleFail } from './tests'; + +export function defaultTestSet(linter: ESLint) { + void describe('[standard tests] passes', () => { + void it(`should parse javascript`, () => + testNoFail({ + linter, + files: [ + { + code: `( + /** @param {string} a */ + (a) => a.split('') +)('test'); +`, + }, + ], + })); + + void it(`should allow nested ternaries`, () => + testNoFail({ + linter, + files: [ + { + code: `(() => (Number === true ? 'a' : Boolean === true ? 'b' : 'c'))();\n`, + }, + ], + })); + }); + void describe('[standard tests] fails', () => { + void it(`should fail eqeqeq`, () => + testRuleFail({ + linter, + ruleId: 'eqeqeq', + files: [{ code: `if (Number == true) Number();\n` }], + })); + + void it(`should warn on prettier`, () => + testRuleFail({ + linter, + ruleId: 'prettier/prettier', + files: [{ code: `Number( '5')` }], + })); + }); +} diff --git a/utils/testing/eslint/index.ts b/utils/testing/eslint/index.ts new file mode 100644 index 00000000..f5615ae6 --- /dev/null +++ b/utils/testing/eslint/index.ts @@ -0,0 +1,38 @@ +import { access } from 'node:fs/promises'; +import { ESLint, Linter } from 'eslint'; + +export function initESLint( + config: Linter.Config, + options: ESLint.Options = {}, +): ESLint { + return new ESLint({ + useEslintrc: false, + overrideConfig: { root: true, ...config }, + ...options, + }); +} + +export type FilePathResult = string; +export interface FilePathOpts { + ts?: boolean; + react?: boolean; + test?: boolean; +} +export function filePath({ + ts = false, + react = false, + test = false, +}: FilePathOpts): FilePathResult { + const ext = (ts ? 'ts' : 'js') + (react ? 'x' : ''); + return `${test ? 'test/' : ''}sample-${ext}.${ext}`; +} + +/** + * @param path The path to check. + * @returns Whether or not the file exists. + */ +export function file_exists(path: string): Promise { + return access(path) + .then(() => true) + .catch(() => false); +} diff --git a/utils/testing/eslint/tests.test.ts b/utils/testing/eslint/tests.test.ts new file mode 100644 index 00000000..0c608eaa --- /dev/null +++ b/utils/testing/eslint/tests.test.ts @@ -0,0 +1,63 @@ +import { describe, it } from 'node:test'; +import { rejects } from 'node:assert'; +import { initESLint } from '@code-style/utils/testing/eslint'; + +import { testRuleFail } from './tests'; + +const linter = initESLint({ + extends: ['@code-style/eslint-config', '@code-style/eslint-config-node'], +}); + +void describe('tests', () => { + void describe('testRuleFail', () => { + void it(`should pass when single rule fails`, async () => { + await testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('');\n` }], + }); + }); + + void it(`should pass when single rule fails multiple times`, async () => { + await testRuleFail({ + linter, + ruleId: 'prettier/prettier', + files: [ + { + code: `const { readFile } = require('fs/promises')\n\nreadFile('')\n`, + }, + ], + }); + }); + + void it(`should fail when no rule fails`, async () => { + await rejects(() => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `` }], + }), + ); + }); + + void it(`should fail when wrong rule fails`, async () => { + await rejects(() => + testRuleFail({ + linter, + ruleId: 'prettier/prettier', + files: [{ code: `console.log('');\n` }], + }), + ); + }); + + void it(`should fail when additional rule fails`, async () => { + await rejects(() => + testRuleFail({ + linter, + ruleId: 'no-console', + files: [{ code: `console.log('')` }], + }), + ); + }); + }); +}); diff --git a/utils/testing/eslint/tests.ts b/utils/testing/eslint/tests.ts new file mode 100644 index 00000000..81c800c8 --- /dev/null +++ b/utils/testing/eslint/tests.ts @@ -0,0 +1,125 @@ +import { copyFile, mkdir, rm, symlink, writeFile } from 'node:fs/promises'; +import { ok, strictEqual, deepStrictEqual } from 'node:assert'; +import { dirname, join } from 'node:path'; +import { tmpdir } from 'node:os'; +import { cwd } from 'node:process'; +import { after } from 'node:test'; +import { randomUUID } from 'node:crypto'; +import { ESLint } from 'eslint'; +import { FilePathResult, FilePathOpts, filePath, file_exists } from '.'; + +export function noLintMessage(lint_results: ESLint.LintResult[]) { + strictEqual( + lint_results[0]?.errorCount, + 0, + `Expected there to be no lint errors, but found:\n${lint_results[0]?.messages + .map((m) => ` ${m.ruleId}: ${m.message}`) + .join('\n')}`, + ); +} + +export function singleLintMessage(lint_results: ESLint.LintResult[]) { + strictEqual( + lint_results.length, + 1, + `Expected there to be only one lint result.`, + ); + strictEqual( + lint_results[0]?.messages.length, + 1, + `Expected there to be one lint message, but there were ${ + lint_results[0]?.messages.length + }:\n${lint_results[0]?.messages.map((m) => ` "${m.message}"`).join('\n')}`, + ); +} + +interface TestRuleFailOpts extends TestNoFailOpts { + ruleId: string; +} +export async function testRuleFail({ + linter, + ruleId, + files, +}: TestRuleFailOpts) { + const _files = files.map((file) => ({ + code: file.code, + path: file.path ?? filePath(file), + })); + + if (_files.length === 1 && _files[0] != null) { + const res = await linter.lintText(_files[0].code, { + filePath: _files[0].path, + }); + const rules = res + .map((lint_result) => lint_result.messages.map((m) => m.ruleId)) + .flat(); + ok(rules.length > 0, `No lint failures detected.`); + deepStrictEqual(rules, new Array(rules.length).fill(ruleId)); + } else { + // TODO: support multiple files using in-memory fs + throw new Error(`Linting multiple files is not supported at this time`); + } +} + +interface TestNoFailOpts { + linter: ESLint; + files: ({ + code: string; + path?: FilePathResult; + } & FilePathOpts)[]; +} +export async function testNoFail({ linter, files }: TestNoFailOpts) { + const _files = files.map((file) => ({ + code: file.code, + path: file.path ?? filePath(file), + })); + + if (_files.length === 1 && _files[0] != null) { + const res = await linter.lintText(_files[0].code, { + filePath: _files[0].path, + }); + noLintMessage(res); + } else { + // TODO(3): this is all kind of brittle + const tmp_dir = join(tmpdir(), 'code-style-testing', randomUUID()); + const created_files: string[] = await Promise.all( + _files + .map((f) => ({ + ...f, + path: join(tmp_dir, f.path), + })) + .map((f) => + mkdir(dirname(f.path), { recursive: true }) + .catch(() => { + return; + }) + .then(async () => { + await writeFile(f.path, f.code); + return f.path; + }), + ), + ); + await Promise.all([ + file_exists(join(cwd(), 'test', 'fixture', '.eslintrc.yaml')).then( + (exists) => + exists + ? copyFile( + join(cwd(), 'test', 'fixture', '.eslintrc.yaml'), + join(tmp_dir, '.eslintrc.yaml'), + ) + : null, + ), + copyFile( + join(cwd(), 'test', 'fixture', 'tsconfig.json'), + join(tmp_dir, 'tsconfig.json'), + ), + symlink( + join(cwd(), '../..', 'node_modules'), + join(tmp_dir, 'node_modules'), + ), + ]).catch(console.error); + after(() => rm(tmp_dir, { force: true, recursive: true })); + + noLintMessage(await linter.lintFiles(created_files)); + } +} diff --git a/utils/testing/stylelint/default-test-sets.ts b/utils/testing/stylelint/default-test-sets.ts new file mode 100644 index 00000000..b065dc0a --- /dev/null +++ b/utils/testing/stylelint/default-test-sets.ts @@ -0,0 +1,36 @@ +import { describe, it } from 'node:test'; +import { Config } from 'stylelint'; +import { testNoFail, testRuleFail } from '.'; + +export function defaultTestSet(config: Config): void { + void describe('[standard tests] passes', () => { + void it('should lint css', () => + testNoFail({ + config, + files: [ + { + code: `html { + color: 'red'; +} +`, + }, + ], + })); + }); + + void describe('[standard tests] fails', () => { + void it('should fail to length-zero-no-unit', () => + testRuleFail({ + config, + ruleId: 'length-zero-no-unit', + files: [ + { + code: `html { + width: 0px; +} +`, + }, + ], + })); + }); +} diff --git a/utils/testing/stylelint/index.ts b/utils/testing/stylelint/index.ts new file mode 100644 index 00000000..11843622 --- /dev/null +++ b/utils/testing/stylelint/index.ts @@ -0,0 +1,74 @@ +import { strictEqual, ok, doesNotReject } from 'node:assert'; +import stylelint, { LinterResult, Config } from 'stylelint'; + +export function noLintMessage(lint_results: LinterResult): void { + ok( + !lint_results.errored, + lint_results.results + .map((r) => r.warnings.map((w) => ` ${w.rule}: ${w.text}`).join('\n')) + .join('\n'), + ); +} + +export function singleLintMessage(lint_results: LinterResult): void { + const result_count = lint_results.results + .map((r) => r.warnings.length) + .reduce((acc, curr) => acc + curr, 0); + strictEqual( + result_count, + 1, + `Expected there to be one lint message, but there were ${result_count}.`, + ); +} + +interface TestRuleFailOpts extends TestNoFailOpts { + ruleId: string; +} +export async function testRuleFail({ + config, + ruleId, + files, +}: TestRuleFailOpts) { + if (files.length === 1 && files[0] != null) { + const lint_promise = stylelint.lint({ + config, + code: files[0].code, + }); + await doesNotReject(lint_promise); + const result = await lint_promise; + + ok(result.errored); + ok( + result.results + .map((r) => r.warnings.map((w) => w.rule)) + .flat() + .includes(ruleId), + ); + } else { + // TODO: support multiple files using in-memory fs + throw new Error(`Linting multiple files is not supported at this time`); + } +} + +interface TestNoFailOpts { + config: Config; + files: { + code: string; + path?: string; + }[]; +} +export async function testNoFail({ config, files }: TestNoFailOpts) { + if (files.length === 1 && files[0] != null) { + const lint_promise = stylelint.lint({ + config, + code: files[0].code, + }); + await doesNotReject(lint_promise); + const result = await lint_promise; + + noLintMessage(result); + } else { + // TODO: support multiple files using in-memory fs + throw new Error(`Linting multiple files is not supported at this time`); + } +} diff --git a/utils/tsconfig.json b/utils/tsconfig.json new file mode 100644 index 00000000..0b22def0 --- /dev/null +++ b/utils/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": ["../tsconfig.json"] +}